{"version":3,"sources":["app.ts","excludeList.ts","filters.ts","common/pdfBuilder.ts","common/pdfBuilderService.ts","common/csvBuilder.ts","tokenService.ts","bearerInjector.ts","Common/selectionService.ts","Common/baseService.ts","application.js","identity/identityService.ts","Analysis/analysisService.ts","common/sessionTimeoutModalCtrl.ts","common/sessionService.ts","common/sizeDetectorService.ts","common/morningStarService.ts","common/navigationService.ts","common/clientConfigService.ts","MyDetails/myDetailsService.ts","PortfolioSummary/portfolioService.ts","PortfolioSummary/reportService.ts","PortfolioSummary/reportDownloadService.ts","PortfolioSummary/bulkDownloadService.ts","common/helpService.ts","common/newsService.ts","common/userCompanyService.ts","recaptchaVerifyService.ts","configurationService.ts","bannerService.ts","changeRequests/changeRequestModel.ts","changeRequests/changeRequestService.ts","research/researchFeedService.ts","services.ts","Common/commonModel.ts","MyDetails/myDetailsModel.ts","portfolioSummary/onlineOrderingModel.ts","common/clientConfigModel.ts","common/userPreferences.ts","Analysis/analysisModel.ts","PortfolioSummary/portfolioModel.ts","identityCallback.ts","common/navbarCtrl.ts","common/footerCtrl.ts","common/landingCtrl.ts","common/abstractController.ts","identity/IdentityBaseCtrl.ts","identity/forgottenPanCtrl.ts","identity/forgottenPasswordCtrl.ts","common/twoFactorAuthenticationCtrl.ts","accountDetails/bankDetailsChangeRequestCtrl.ts","accountDetails/sensitiveEmailAddressChangeRequestCtrl.ts","accountDetails/sensitiveAddressChangeRequestCtrl.ts","changeRequests/approveChangeRequestCtrl.ts","Analysis/analysisBaseCtrl.ts","Analysis/watchlistsCtrl.ts","Analysis/watchlistItemCtrl.ts","Analysis/marketHeatmapCtrl.ts","Analysis/marketChartCtrl.ts","Analysis/stockCompareCtrl.ts","Analysis/fundCompareCtrl.ts","Analysis/etfCompareCtrl.ts","Analysis/analysisModule.ts","common/advisorCtrl.ts","common/helpViewCtrl.ts","MyDetails/myDetailsBaseCtrl.ts","MyDetails/accoladeOptionsViewCtrl.ts","MyDetails/researchSubscriptionsViewCtrl.ts","accountDetails/accountBaseCtrl.ts","accountDetails/bankDetailsViewCtrl.ts","accountDetails/contactInfoViewCtrl.ts","accountDetails/taxFileNumberViewCtrl.ts","accountDetails/accountDetailsModule.ts","Research/researchBaseCtrl.ts","Research/strategyCtrl.ts","Research/privateWealthCtrl.ts","Research/articleCtrl.ts","Research/quantitativeAnalysisCtrl.ts","Research/companyResearchCtrl.ts","Research/equitiesResearchCtrl.ts","Research/recentResearchCtrl.ts","Research/asxAnnouncementsCtrl.ts","Research/etfResearchCtrl.ts","Research/fundResearchCtrl.ts","Research/quickSearchCtrl.ts","Research/researchModule.ts","MyDetails/myDetailsModule.ts","common/components/changeRequestSubmitted.component.ts","common/components/phoneNotRegistered.component.ts","common/components/approversNotRegistered.component.ts","common/components/sectionHeader.component.ts","common/components/spinner.component.ts","common/components/accountSelect.component.ts","common/components/actionButton.component.ts","common/components/passwordValidation.component.ts","common/components/dateSelect.component.ts","common/components/morningstarError.component.ts","common/components/changePhone.component.ts","research/components/featuredItem.component.ts","research/components/feedList.component.ts","portfolioSummary/components/investorDocs.component.ts","portfolioSummary/components/reportTypeSelect.component.ts","portfolioSummary/components/holdingsDisclaimer.component.ts","portfolioSummary/components/reportDisclaimer.component.ts","portfolioSummary/components/accountDateRangeFilter.component.ts","portfolioSummary/components/portfolioSummary.component.ts","portfolioSummary/components/abstractReport.component.ts","portfolioSummary/components/incomeReport.component.ts","portfolioSummary/components/cashReport.component.ts","portfolioSummary/components/capitalTransactionStatement.component.ts","portfolioSummary/components/standardLedgerReport.component.ts","portfolioSummary/components/quarterlyReportsListReport.component.ts","portfolioSummary/components/taxReportsListReport.component.ts","portfolioSummary/components/performanceReport.component.ts","portfolioSummary/components/portfolioGraph.component.ts","portfolioSummary/components/realisedCapitalGainsReport.component.ts","portfolioSummary/components/marketValueReport.component.ts","portfolioSummary/components/unrealisedCapitalGainsReport.component.ts","portfolioSummary/components/termDepositsHoldingsReport.component.ts","portfolioSummary/components/cashHoldingsReport.component.ts","portfolioSummary/components/cashHighInterestHoldingsReport.component.ts","portfolioSummary/components/equityHoldingsReport.component.ts","portfolioSummary/components/totalMarketValue.component.ts","portfolioSummary/components/valuationStatement.component.ts","portfolioSummary/components/potfolioNavigation.component.ts","portfolioSummary/portfolioBaseCtrl.ts","portfolioSummary/placeOrderRequestViewCtrl.ts","portfolioSummary/viewOrderRequestsViewCtrl.ts","portfolioSummary/portfolioDashboardCtrl.ts","portfolioSummary/portfolioSnapshotCtrl.ts","portfolioSummary/portfolioHeatmapCtrl.ts","portfolioSummary/portfolioViewCtrl.ts","portfolioSummary/portfolioCompareCtrl.ts","portfolioSummary/stockReportCtrl.ts","portfolioSummary/fundReportCtrl.ts","portfolioSummary/etfReportCtrl.ts","portfolioSummary/holdingsCtrl.ts","portfolioSummary/confirmationNotesCtrl.ts","portfolioSummary/marketOrdersCtrl.ts","portfolioSummary/marketDepthCtrl.ts","portfolioSummary/reportViewCtrl.ts","portfolioSummary/ledgerViewCtrl.ts","portfolioSummary/uat_xrayCtrl.ts","portfolioSummary/uat_portfolioCompareCtrl.ts","portfolioSummary/portfolioModule.ts","changeRequests/changeRequestBaseCtrl.ts","changeRequests/changeRequestViewCtrl.ts","changeRequests/changeRequestModule.ts","identity/verifyPhoneCtrl.ts","identity/changePasswordCtrl.ts","identity/changeEmailCtrl.ts","identity/setPasswordCtrl.ts","identity/identityModule.ts","controllers.ts","directives.ts","components.ts"],"names":["rootMorningstarPromise","Promise","resolve","reject","loaderConfig","apiTokens","apiGatewayToken","_marketsApiToken","console","log","morningstar","loader","load","then","fetchFromObject","obj","prop","_index","indexOf","substring","substr","loadMarketsComponent","elementId","containerId","componentTagName","componentId","container","document","createElement","containerParent","getElementById","setAttribute","appendChild","marketsComponentSettings","configuration","overrides","components","component","createComponent","element","initialConfiguration","id","callbacks","excludeWords","toTitleCase","str","toLowerCase","replace","l","toUpperCase","capitalizeRegexp","RegExp","join","capitalizeAbbreviations","text","txt","IdMgr","YesNo","input","BuySell","NotBefore","items","field","notBeforeDate","filtered","angular","forEach","item","moment","isAfter","push","NotAfter","notAfterDate","isBefore","DateFilter","key","from","to","df","dt","result","i","length","itemDateRaw","itemDate","isSameOrAfter","isSameOrBefore","AccountName","TitleCase","filterOn","isUndefined","isArray","charAt","Unique","newItems","extractValueToCompare","isObject","isString","isDuplicate","equals","Percent","precision","toFixed","PlusMinus","StripHtml","String","ForAccountType","reportTypes","accountType","filteredList","reportType","Abs","undefined","Math","abs","ConvertNegative","openingParethensis","concat","filtersModule","module","filter","Patersons","PdfFormatHint","HeaderTable","this","content","style","fontSize","margin","table","widths","body","prototype","addRow","nameLeft","valueLeft","nameRight","valueRight","border","bold","alignment","PdfTable","userCompany","setTitle","titleText","headerStyle","tableTitle","layout","setNormalText","setContent","dataRows","fieldnames","headings","formatHints","lastRowIsFooter","headerRow","buildHeadings","bodyRows","buildBody","columnWidths","calculateColumnWidths","tableBody","getTableLayout","headerRows","_this","hLineWidth","node","hLineColor","colorSecondary","vLineWidth","setContentAligned","buildHeadingsAligned","hasTitle","hasBody","getTitle","getBody","_i","headings_1","heading","headings_2","type","tableContent","dataRow","tableRow","j","formatHint","None","isFooterRow","buildTableFooterCell","buildTableCell","dataField","cell","interpretFormatHint","toString","Currency","formatAsCurrency","Currency4decPts","formatAsCurrency4DecPts","addCommas","nStr","x","split","x1","x2","rgx","test","amount","parseFloat","isNaN","minus","parseInt","s","numberOfColumns","initialiseColumnWidths","widestColumn","rowIndex","row","Array","apply","map","v","PdfBuilder","base64logo","filename","generateDefaultFilename","footer","tables","headerTable","styles","logo","header","color","filledSubHeader","fillColor","subHeader","headerText","footerText","tableHeader","tableHeaderNumeric","filledHeader","filledHoldingsHeader","footerCell","tableCell","tableCellBold","tableCellNumeric","footerCellNumeric","numericValue","docDefinition","pageSize","pageOrientation","pageMargins","font","getImageContent","currentPage","pageCount","footerPDF","footerDisclaimerItems","$elem","$","each","tz","format","image","width","height","setFilename","setSubTitle","subTitleText","addHeaderTableRow","addHeading","headingText","addFooter","addTable","fieldNames","lastRowIsTotal","addTableAligned","addNormalText","build","injectedContent","pushTitle","pushSubTitle","pushHeaderTable","pushAllHeadings","injectContent","pushAllTables","pdfMake","createPdf","download","buildContent","getFooter","footerContent","pushFooter","_a","randomString","random","slice","timeStamp","Date","toISOString","PDFBuilderService","$q","userCompanyService","q","toDataUrl","url","callback","xhr","XMLHttpRequest","onload","reader","FileReader","onloadend","readAsDataURL","response","open","responseType","send","error","newPdfBuilderInstance","deferred","defer","getUserCompany","company","pdfBuilder","companyPdfImage","promise","$inject","CsvBuilder","headers","data","setTopLine","topLine","setHeaders","setData","blob","createCsvFile","makeCsv","csvBlob","saveFile","name","navigator","msSaveBlob","a","window","URL","createObjectURL","attr","append","click","revokeObjectURL","remove","EOL","csvContent","data_1","rowItems","row_1","val","Blob","TokenService","model","textContent","trim","dictionary","JSON","parse","oauthSettings","tokenManager","OidcTokenManager","BearerInjector","tokenService","request","config","baseUrl","token","access_token","responseError","status","localStorage","setItem","location","href","redirectForToken","SelectionService","$log","getSelectedAccount","accounts","account","accountId","selectedAccountId","BaseService","$http","$state","http","state","get","absoluteUrl","info","cancel","timeout","mapResponseData","reason","errorHandler","post","patch","put","msg","exceptionMessage","go","value","__extends","d","b","__","constructor","p","hasOwnProperty","Object","create","IdentityService","_super","arguments","triggerForgottenPan","forgottenPanDetails","triggerForgottenPassword","forgottenPasswordDetails","changePassword","changePasswordDetails","changeEmail","changeEmailDetails","changeMobileNumber","phoneDetails","confirmMobileNumberChange","setPassword","setPasswordDetails","request2FAToken","getSkipMobileRegistration","getIsPhoneNumberVerifyed","getPhoneNumber","getUserAddressDetails","saveSkipMobileRegistration","skipMobileDetails","AnalysisService","getWatchlists","getAWatchlist","watchlistId","patchWatchlist","watchlist","postWatchlist","newWatchlist","deleteWatchlist","SessionTimeoutModalCtrl","$scope","$uibModalInstance","currentState","scope","modalInstance","events","close","dismiss","SessionService","$rootScope","$uibModal","$uibModalStack","$analytics","sessionTimeoutHandler","sessionPreTimeoutHandler","sessionTimeoutKey","modalStack","$on","event","toState","toParams","fromState","fromParams","checkSession","setSessionExpiringModal","dismissAll","openModal","templateUrl","size","controller","keyboard","backdrop","openedClass","setSessionExpiredModal","handleSessionTimedout","sessionTimeoutExists","getItem","now","isLoggedIn","timeoutInMinutes","clearTimeout","timeout_1","getTime","setTimeout","removeItem","stop","eventTrack","category","login","logout","removeToken","expired","getCurrentUserProfile","profile","SizeDetectorService","initSizeDetector","ready","$html","resize","checkWidth","windowWidth","clientWidth","removeClass","addClass","MorningStarService","getRecentResearch","filterBy1Year","ajax","res","customArcResearchList","oneYearAgo","setFullYear","getFullYear","filteredItems","date","dateWritten","fail","getASXAnnouncementsDocument","path","query","getASXAnnouncements","asxcode","dateRange","page","mapAgilityExchangeCodeToMIC","exchangeCode","getMorningStarDataForSecurityCode","securityCode","symbol","total","rows","getMorningStarDataForSecurityId","securityId","NavigationService","sections","activateSection","section","deactivateAll","sectionDiv","querySelector","deactivateSection","ClientConfigService","getAdviser","getChangeRequestCount","ResearchPublicationType","MyDetailsService","getAccoladeOptions","updateAccoladeOptions","accoladeOptions","getResearchSubscriptions","getResearchSubscription","publication","updateResearchSubscriptions","reduce","acc","curr","enabled","isSubscribed","PortfolioService","call","portfolios","portfolioOrder","getPortfolioOrder","results","getPortfolios","foundPortolio","allPromises","_loop_1","accountCode","this_1","debug","summaryError","accountPlaceholder","Account","accountName","all","getCombinedPortfolioData","acccounts","agacccounts","isAuthorisedAgentAccount","accountsOrdered","sort","getPortfolioData","getTopSectors","getTopAssetClass","getAccoladeTopSectors","getAccoladeTopAssetClass","getAccoladeHoldings","updateTaxFileNumber","taxFileNumber","taxFileNumberType","updateBankDetails","bankDetails","updateAllBankDetails","updatePostalAddressDetails","addressDetail","updateResidentialAddressDetails","updateRegistrationAddressDetails","updateEmailAddress","emailAddress","updateSensitiveEmailAddress","updatePhoneNumbers","getInternationalShares","getInternationalSharesForHoldings","getShares","getCombinedShares","getCashAccounts","getHighInterestCashAccounts","getTermDeposits","getPortfolioValue","getBackdatedPortfolioData","asAt","getContractNotes","dateFrom","dateTo","getMarketOrders","getOrderDepthData","placeOrderRequest","details","getOrderRequests","createCancelOrder","order","ReportService","getFile","file","fileURL","getAllAccoladeNotifications","acknowledgeAccoladeNotifications","getReport","checkFreezeWindow","ReportDownloadService","$filter","pdfBuilderService","downloadPdfFile","report","fileName","getFileName","getPdfTemplateDefinition","def","reportDefinition","getReportDefinition","downloadCsvFile","msSaveOrOpenBlob","downloadLink","target","doc","ReportType","CapitalTransactions","getCapitalTransactionStatement","QuarterlyReports","getQuarterlyReportsReport","Cash","getCashReport","Income","getIncomeReport","CapitalGains","getCapitalGainsReport","UnrealisedCapitalGains","getUnrealisedCapitalGainsReport","Performance","getPerformanceReport","TaxReports","getTaxReportsReport","Valuation","getValuationStatement","StandardLedger","getStandardLedger","getColumnDefinitions","columnNames","displayNames","csvColumnNames","csvDisplayNames","enableFeature","columnNamesInternational","displayNamesInternational","columnWidthsInternational","csvGroupBy","totalColumnNames","totalDisplayNames","totalColumnWidths","csvTotalColumnNames","csvTotalDisplayNames","csvGroupby","scvTotalDisplayNames","transactions","columnDefinitions","headerCols","displayHeaderCols","statement","colspan","tradeCategories","categories","subtotal","tradeDate","settlementDate","quantity","unitPrice","assetClasses","assetClass","assets","asset","subHeaderRow","purchaseDate","saleDate","capitalGains","subTotalTable","totalTable","marketValue","indexedCostBase","discountedCostBase","indexedGain","performanceTable","getPerformanceLayout","displayName","currencyFormatted","capitalizeFirstLetter","string","handleLongString","index","words","securityName","code","newCode","newSentence","headerColsInternational","displayHeaderColsInternational","widthsInternational","valuationStatement","nonLoaSecurities","categoryName","includes","getHoldingsHeaderRow","formatSubheadingRow","lineItems","formatDataForPdf","buildTableBody","tableWithHeader","nonLoaUnsettledDividends","dividends","loaSecurities","loaUnsettledDividends","managedAccounts","keys","formatNestedSubheadingRow","grandTotal","quarterlyReport","investorDocs","taxReport","cashReport","transactionGroups","groups","group","closingBalance","incomeReport","transactionTypeCategories","cat","subCat","subCategories","subCategory","payDate","exDate","description","standardLedgerReport","ledgerEntries","entries","ledgerTable","pdfData","copy","formatDataRow","dateFormatted","grossAmount","brokerage","gst","netAmount","debit","absoluteValue","credit","balance","frankingCredits","withholdingTax","integerFormatted","costPrice","totalCost","reducedCostBase","capitalLoss","grossDiscountGain","salePrice","otherGain","capitalProceeds","marketPrice","unsettledIncome","price","profitOrLoss","pctAssets","percentFormatted","estAnnualIncome","estAnnualGrossIncome","estFrankingCredits","estGrossYield","nativeCostPrice","nativeTotalCost","nativeMarketPrice","nativeMarketValue","nativeProfitLoss","ledgerDate","isCancelled","isOpen","reportTitle","creationDateUtc","title","designation","buildHeadingTable","asAtDate","lastHeaderText","secondaryHeader","footerRow","appendSpannedCells","span","label","colSpan","columns","footerLabel","footerLabelColspan","footerData","getTablelayout","buildSubTotalTableBody","isHoldings","getHeaderRow","headingTable","adviserName","getRow","getFooterRow","getSubTotalRow","getSubTotalFooterRow","isNumericHeader","numericHeaders","some","formattedHeaders","h","column","stringify","footerColspan","workingColumns","numberString","startDate","endDate","getCsvTopLine","columnDefinition","getCsvColumnHeadings","getCsvColumnNames","getCsvData","groupBy","processCsvRows","columnIndex","groupedData","totals","csvContentString","csvContent_1","rowItems_1","val_1","getColumnNames","definitions","dateString","adviser","adviserCode","timestamp","fromDateStr","toDateStr","asAtDateStr","getCapitalTransactionStatementCsv","getQuarterlyReportsCsv","getCashCsv","getIncomeCsv","getCapitalGainsCsv","getUnrealisedCapitalGainsCsv","getPerformanceCsv","getTaxReportsCsv","getValuationStatementCsv","getStandardLedgerCsv","csvData","txn","isSell","sign","quarterlyReportsListReport","taxReportsListReport","aac","netValue","openingBalance","subcategories","itm","safeFixedDecimals","decimals","vLineColor","holdings","noFooter","layoutThinLightBorderHeader","layoutThinLightBorderHeaderHoldings","layoutThinLightBorder","BulkDownloadService","$window","downloadItems","zipFilename","zip","JSZip","fileDownloads","uri","prettyFileName","binary","generateAsync","saveAs","HelpService","getFAQs","NewsService","getNews","UserCompanyService","waitForGettingData","check","isGettingData","setFavicon","faviconImage","isFaviconSet","setTheme","colorPrimary","colorPrimaryDarker","colorTertiary","isThemeSet","documentElement","setProperty","cssVars","variables","--color-primary","--color-primary-darker","--color-tertiary","--color-secondary","fallbackCompany","companyName","contactEmail","contactPhone","enableWholesaleClientsResearch","err","RecaptchaVerifyService","siteVerify","rv","RecaptchaVerify","remoteip","ConfigurationService","getValueByKey","BannerService","getCurrent","toJSON","ChangeRequest","isApproved","isRejected","ChangeRequestService","getChangeRequests","getChangeRequestsForApproval","approveChangeRequest","changeRequestId","verificationCode","smsToken","rejectChangeRequest","areAllAccountApproversRegistered","getAccountApproversCount","Feed","ResearchFeedService","getAllPrivateWealthResearch","getAllStrategyAndEconomics","getFeaturedStrategyAndEconomics","getTop3StrategyAndEconomics","getTop3PrivateWealthResearch","getLatestMorningMarket","getAllQuantitativeAnalysis","getFeaturedQuantitativeAnalysis","getFeaturedPrivateWealthResearch","getTop3QuantitativeAnalysis","getArticle","articleId","getLatestFeedItemForCategory","feedItems","orderFeedItemsByPublishedDateDescending","getLatestFeedItemExcludingCategories","c","publishedDate","toDate","myServiceModule","service","MorningStarXrayPortfolio","apiOptions","holdingAllocation","benchmark","MorningStarXrayIdentifier","$identifier","$type","$amount","Identifier","IdentifierType","Amount","Investor","AccoladeOptions","ResearchSubscription","OrderRequest","User","Profile","ProfileAddress","defineProperty","addressLine1","addressLine2","addressLine3","addressLine4","postcode","country","Boolean","enumerable","configurable","PhoneDetails","ForgottenPanDetails","ForgottenPasswordDetails","CreateAccount","TaxFileNumber","PasswordResetDetails","SetPasswordDetails","ChangePasswordDetails","ChangeEmailDetails","SkipMobileDetails","skipMobileRegistration","PhoneConfirmationDetails","EmailConfirmation","ClientAdviser","firstname","surname","telephone","email","headshotLarge","headshotSmall","Firstname","Surname","Telephone","Email","Description","HeadshotLarge","HeadshotSmall","UserPreferences","pan","prefsString","preferenceKeyName","prefs","save","jsonReplacer","WatchlistItem","isin","Watchlist","watchlistItems","Security","SelectListType","WatchlistSelectListDescriptor","headerLoaded","summaryLoaded","headerError","AccountAddresses","BankingDetails","ConfirmationNote","Holding","assetCategory","Sector","BankAccountDetail","CashDeposit","TermDeposit","hasData","rate","maturityDate","provider","Quote","Address","EmailAddress","emailAddressType","Portfolio","Holdings","SelectedAccountTotal","cashBalanceTotal","equityTotalCostTotal","equityMarketValueTotal","equityProfitLossTotal","equityEstimatedIncomeTotal","Banner","CallbackCtrl","$location","applicationInsightsService","identityService","querystring","lastIndexOf","processTokenCallbackAsync","uuidKey","uuid","_localStorage","sub","set","navigateOnSuccess","alert","message","redirect_to","redirect_uri","setUsername","preferred_username","trackLoginSuccess","dataLayer","action","userId","eventCallback","eventTimeout","skipMobile","phone_number_verified","NavbarCtrl","$stateParams","sessionService","clientConfigService","rootScope","stateParams","editMode","isNavCollapsed","adviserList","loadAdviserData","loadPendingChangeRequestCount","themeRGB","hexToRgb","changeRequestCount","hex","exec","r","g","promiseChain","initComponent","asterix","instanceRegistry","find","on","newVal","secId","setParameter","FooterCtrl","reportService","freezeWindow","LandingCtrl","AbstractController","redirect","reload","Url","$emit","errors","IdentityBaseCtrl","navigationService","ForgottenPanCtrl","isBusy","isTriggered","$broadcast","forgottenPanForm","$invalid","dto","dob","utc","returnToLoginScreenIn","nSeconds","ForgottenPasswordCtrl","setResponse","setWidgetId","widgetId","isSmsRequired","forgottenPasswordForm","warn","validationMessage","Message","TwoFactorAuthenticationCtrl","isError","isSubmitted","informationMessage","errorMessage","isSendingCode","sendVerificationCode","submit","handleErrorResponse","showForbiddenMessage","BankDetailsChangeRequestCtrl","portfolioService","bankAccountDetail","saveAll","nameOfPdf","linkToPdf","twoFactorAuthForm","SensitiveEmailAddressChangeRequestCtrl","emailAddresses","SensitiveAddressChangeRequestCtrl","address","ApproveChangeRequestCtrl","changeRequestService","AnalysisBaseCtrl","WatchlistsCtrl","analysisService","selectionService","onDeleteWatchlist","confirm","params","selectedWatchlistSecIds","secIds","isEdit","watchlists","listWatchlists","w","isLoading","prepareNewWatchlist","addWatchlist","watchlistForm","cancelAddWatchlist","$setPristine","$setUntouched","loadWatchlist","newSecIds","unique","elem","self","WatchlistItemCtrl","showAllWatchlists","tickers","relatedWatchlist","initializeMorningstar","updateWatchlistFromTickers","openAsHeatmap","watchlistInstance","tickersTemp","getParameter","preventDefault","toBeRemove","tempList","el","MarketHeatmapCtrl","morningStarService","transformWatchlistToMorningStarWatchlist","resolveAll","mWatchlists","resolveEach","mWatchlist","ticker","resolveTicker","holdingTypeId","marketsHeatmap","settings","selectionlist","watchList","active","tickers_1","tickerList","inherit","MarketChartCtrl","compareTickers","mainTicker","isCompare","morningstarPromise","advanceChart_compare","StockCompareCtrl","isinData","FundCompareCtrl","ETFCompareCtrl","analysisModule","$stateProvider","$locationProvider","wholesaleClientChecker","wholesaleclient","meta","wholesaleClientCheck","ClientAdviserViewCtrl","getAdviserData","ShowFullImage","modal","adviserLabel","FAQ","HelpViewCtrl","helpService","faqList","faqs","MyDetailsBaseCtrl","AccoladeOptionsViewCtrl","myDetailsService","parentController","onSave","onCancel","accoladeCheckPromise","every","hasAccoladeAccounts","optionsPromise","options","enableAnnualAccoladeReports","hasElectronicTaxReports","enableQuarterlyAccoladeReports","hasElectronicQuarterlyReports","ResearchSubscriptionsViewCtrl","hasChanged","setChanged","isSaving","subscribedPublications","AccountBaseCtrl","BankDetailsViewCtrl","$document","submissionFailed","submissionFailedVerifyPhoneNumber","submissionFailedNotAllApproversRegistered","phoneNumberIsVerified","allApproversRegistered","hasApprovers","hasAcceptedTandCs","hasApplyAllChecked","disableCreditUpdate","scrollDuration","isSensitive","setSelectedAccount","selectedAccount","isCashManagementAccount","bankingDetails","creditBankAccount","isChessManaged","depositDividends","checkAllApproversRegistered","checkHasApprovers","serviceType","deselectDepositDividends","canSubmitChangeRequest","saveDirectDebitForm","debitBankAccount","cardType","saveForm","directDebitForm","updatehasAcceptedTandCs","saveDirectCreditForm","directCreditForm","form","scrollPlaceholder","scrollToElement","modalPopup","AccountEmail","ContractNoteEmail","ContactInfoViewCtrl","emailTags","contractEmailTags","e","emailContractNotes","sensitiveEmailAddressesDirty","hideAllNotifications","setAllAddressFields","accountAddresses","postalAddress","assign","residentialOrBusinessAddress","registrationAddress","applyToAll","addressForm","invalid","saveRegistrationAddress","savePostalAddress","saveResidentialAddress","postalAddressForm","promises","executePromises","residentialAddressForm","registrationAddressForm","saveAccountEmailAddressForm","accountEmailAddressForm","nonSensitiveEmailAddresses","tag","saveContractEmailAddressForm","contractEmailAddressForm","sensitiveEmailAddresses","savePhoneNumberForm","phoneNumberForm","numDone","checkAllDone","TaxFileNumberViewCtrl","saveTaxFileNumber","taxFileNumberForm","accountDetailsModule","impersonatorCheck","impersonator","ResearchBaseCtrl","StrategyCtrl","researchFeedService","morningMarket","modelPortfolioUpdate","australianInvestor","otherFeatured1","otherFeatured2","otherFeatured3","feedList","PrivateWealthCtrl","modelPortfolio","sectorStrategy","momentumMonitor","qualityInvesting","highYieldStocks","fixedInterestSecurities","marketStrategy","ArticleCtrl","$sce","article","sce","toTrustedHTML","html","trustAsHtml","sanitizeHTMLforView","clean","DOMPurify","sanitize","FORBID_TAGS","ADD_ATTR","ADD_TAGS","QuantitativeAnalysisCtrl","getArticleUrl","feedItem","absUrl","CompanyResearchCtrl","EquitiesResearchCtrl","RecentResearchCtrl","reverse","predicate","selectedCode","selectedDate","selectedAnalysts","selectedRecommendation","itemsPerPage","$apply","filterArray","array","filters","filterKeys","filterItems","author","licenseeRecommendation","onFilterChange","property","ASXAnnouncementsCtrl","totalItems","dateOptions","resultstotal","ETFResearchCtrl","FundResearchCtrl","QuickSearchCtrl","researchModule","myDetailsModule","ChangeRequestSubmittedComponent","bindings","PhoneNotRegisteredComponent","ApproversNotRegisteredComponent","ApproversNotRegisteredController","SectionHeaderComponent","SpinnerComponent","AccountSelectComponent","AccountSelectController","isDisabled","rememberSelection","showSelectAccount","labelText","onAccountChange","useSelectionService","_accounts","_selectedAccount","ActionButtonComponent","onClick","PasswordValidationComponent","password","onValidation","PasswordValidationCtrl","$ctrl","resetValidation","validUppercase","validLowercase","validNumber","validSpecial","valid","validate","match","$onChanges","changesObj","DateSelectComponent","DateSelectController","defaultDate","onDateChange","isOpened","currentValue","onDateSelect","openCalendar","MorningstarErrorComponent","ChangePhoneComponent","ChangePhoneCtrl","showCancelButton","isCodeSubmitted","mobilePhoneNumber","updateUiFromProfile","showInfo","currentNumber","changeNumber","changePhoneForm","confirmCode","verifyPhoneForm","phoneConfirmationDetails","cancelRegistration","FeaturedItemComponent","showImage","defaultImage","feedListComponent","FeedListController","InvestorDocsComponent","InvestorDocsController","isDownloading","onDownloadFiles","extractDateFromString","months","regexpFullDate","matchFullDate","regexpYear","matchYear","regexpPartialDate","matchPartialDate","yearSplit","year","dateSplit","selectAll","isSelected","downloadDocs","selectedItems","ReportTypeSelectComponent","ReportTypeSelectController","onReportTypeChange","menuOpen","HoldingsDisclaimerComponent","ReportDisclaimerComponent","AccountDateRangeFilterComponent","AccountDateRangeFilterController","defaultFromDate","defaultToDate","onApplyFilter","setFromDate","setToDate","fromDate","PortfolioSummaryComponent","PortfolioSummaryController","isDownloadReady","summaryText","onDownloadPdfClicked","onDownloadCsvClicked","hidePdfOption","hideCsvOption","AbstractReport","AbstractReportController","shortPaddedDateFormat","mediumDateFormat","fullDateTimeFormat","IncomeReport","TransactionTypeCategory","TransactionTypeSubCategory","IncomeReportLineItem","IncomeReportComponent","IncomeReportController","CashReport","CashReportTransactionGroup","CashReportLineItem","CashReportComponent","CashReportController","CapitalTransactionStatement","TradeCategory","CapitalTransaction","CapitalTransactionStatementComponent","CapitalTransactionStatementController","StandardLedgerReport","LedgerEntry","StandardLedgerReportComponent","StandardLedgerReportController","QuarterlyReportsListReport","QuarterlyReportsListEntry","TaxReportsListReport","TaxReportsListEntry","PerformanceReport","PerformanceReportComponent","PerformanceReportController","PortfolioGraphComponent","PortfolioGraphController","sectorOptions","showLabel","donut","donutWidth","assetClassOptions","activeToggle","toggleActive","toggle","extractSeriesData","emptyData","emptyLabels","labels","count","seriesData","labelData","percentage","roundedPercentage","round","sectorName","getSectorDataPromise","assetClassData","sectorData","series","assetClassLabels","assetClassError","sectorLabels","sectorsError","RealisedCapitalGainsReport","RealisedCapitalGainsAssetClass","RealisedCapitalGainsAsset","RealisedCapitalGain","RealisedCapitalGainsReportComponent","RealisedCapitalGainsReportController","MarketValue","MarketValueReport","MarketValueReportComponent","MarketValueReportController","displayTitle","getMarketValueReport","isMarketValueError","hasMarketValueData","isMarketValueLoading","marketValueReport","buildChartData","loadedOnce","add","selectedPeriod","periodFilter","unit","chartOptions","maintainAspectRatio","tooltips","mode","intersect","backgroundColor","titleFontSize","titleFontColor","bodyFontColor","xPadding","yPadding","caretSize","caretPadding","titleSpacing","cornerRadius","bodyFontSize","displayColors","tooltipItem","yLabel","toLocaleString","currency","elements","point","radius","line","tension","fill","scales","yAxes","ticks","maxTicksLimit","values","xAxes","time","minUnit","tooltipFormat","displayFormats","quarter","datasetOverride","setSelectedPeriod","chartSeries","marketValuation","y","chartData","UnrealisedCapitalGainsReport","UnrealisedCapitalGainsAssetClass","UnrealisedCapitalGainsAsset","UnrealisedCapitalGain","UnrealisedCapitalGainsReportComponent","UnrealisedCapitalGainsReportController","TermDepositsHoldingsReport","TermDepositsHoldingsReportComponent","sortOrder","searchText","onOrderChanged","CashHoldingsReport","CashHolding","instituteCode","CashHoldingsReportComponent","CashHighInterestHoldingsReportComponent","EquityHoldingsReport","EquityHolding","averageCost","lastPrice","dividendPerShare","frankedAmount","income","priceToEarnings","EquityHoldingsReportComponent","EquityHoldingsReportComponentController","isInternational","exchange","first","openURL","FundShareClassId","mapHoldingTypeIdToReportURL","next","TotalMarketValueComponent","ValuationStatement","AssetCategory","ValuationStatementAsset","UnsettledDividends","UnsettledDividend","ValuationStatementComponent","ValuationStatementController","sortFunds","localeCompare","numeric","extractManagedFunds","managedFunds","unlisted","everythingElse","toggleManagedAccount","managedAccountIndex","expanded","codes","sortedItem","splice","unshift","unsettledDividend","siblings","child","PortfolioNavigationComponent","PortfolioNavigationController","initOptions","isDefault","toggleMenu","PortfolioBaseCtrl","$$path","PlaceOrderRequestViewCtrl","placeOrderRequestService","clearOrderRequestForm","orderRequestForm","viewOrderRequests","ViewOrderRequestsViewCtrl","cancelOrder","orderToCancel","investorOrders","orderAction","portfolioId","volume","requestDateTime","buyAtMarketRate","orderNumber","PortfolioDashboardCtrl","bannerService","newsService","hasNotifications","getAccoladeNotifications","notificationText","notificationLink","link","notificationStateLink","firstReportType_1","allSame","getFinancialYear","yearsBack","financialYearStart","financialYearEnd","month","startOf","endOf","subtract","start","end","acknowledgeNotification","isNewsLoading","newsCampaignParams","utm_source","utm_medium","max_news","newsConfig","utmQuery","lastChar","$clamp","clamp","useNativeClamp","isMorningMarketLoading","latestMorningMarket","getBanner","isBannerLoading","bannerConfig","buttonUrl","isHidden","goToEOFYStatement","previousFY","autoDownloadPDF","investorPortfolios","totalMovementToday","currentMovementValue","totalMovementPercentage","currentMovementPercent","totalHoldingsValue","goToPorfolioOverview","goToHoldings","getAccount","PortfolioSnapshotCtrl","reportDownloadService","getPortfolioSnapshot","loadPortfolioSnapshot","cachedAccounts","extractCodesFromReport","codes_1","cashAccountsPromise","highInterestCashPromise","termDepositPromise","internationalSharesPromise","sharesPromise","loadMorningStarSnapshot","PortfolioHeatmapCtrl","getPortfolioHeatmap","loadPortfolioHeatmap","loadMorningStarHeatmap","TickersCache","portfolioHeatmap","PortfolioViewCtrl","checkCompareMethod","setAccountToCompare","accountToCompare","loadXray","loadShares","mapAccountToPortfolio","xrayComponent","loadCompare","myPortfolio1","myPortfolio2","createHoldingForAssetAllocation","assetAllocationDomesticCash","createCustomHoldingsForCashAccolade","assetAllocationDomesticEquity","createCustomHoldingsForAustralianEquity","assetAllocationDomesticFixedInterest","createCustomHoldingsForAUFixedIncome","assetAllocationDomesticProperty","createCustomHoldingsForProperty","createCustomHoldingsForOther","assetAllocationOther","createCustomHoldingsForUnlistedProperty","assetAllocationInternationalCash","assetAllocationInternationalEquity","createCustomHoldingsForInternationalEquity","assetAllocationInternationalFixedInterest","createCustomHoldingsForIntlFixedIncome","assetAllocationInternationalProperty","createCustomHoldingsForInternationalProperty","identifier","identifierType","Name","weight","Proxy","breakdowns","assetAllocation","salePosition","1","2","3","4","5","6","7","8","9","10","createCustomHoldingsForCash","allHoldings","totalAccountValue","holdingItem","totalCashHoldingsValue","holding","cashItem","portfolio","totalValue","currencyId","assetAllocations","allocation","PortfolioCompareCtrl","StockReportCtrl","$timeout","salReportScope","salStockReportTransform","ng","transforms","register","recommendation","recommendationChange","arcDocumentList","byLine","SALauthUrl","authData","loaderConfigSalStock","shareClassId","manifest","FundReportCtrl","loaderConfigSalFund","EtfReportCtrl","loaderConfigSalETF","HoldingsCtrl","getBackdatedHolding","generatedDate","loadBackdatedHoldings","buildReports","getSummaryText","orderInternational","intReverse","intPredicate","orderHiCash","hiReverse","hiPredicate","orderCash","cashTableSortOrder","cashTablePredicate","orderTermDeposits","termDepositsSortOrder","termDepositsPredicate","checkAutoDownloadPDF","autoDownloaded","downloadPdf","setAsAtDate","cashHoldingsReport","highInterestCashHoldingsReport","termDepositsReport","domesticHoldings","equityHoldingsReport","buildEquityHoldingsReport","internationalHoldings","internationalHoldingsReport","buildInternationalEquityHoldingsReport","totalMarketValue","loadAccoladeAccount","makeAgilityPdf","makeAccoladePdf","downloadCsv","valuationReport","csvBuilder","cashHoldings","highInterestCashHoldings","termDeposits","equityHoldings","pricesQuotedAt","formattedTermDeposits","getFormattedTermDeposits","formattedCashHoldings","getFormattedCashHoldings","formattedHighInterestCashHoldings","formattedEquityHoldings","getFormattedHoldings","formattedInternationalHoldings","getFormattedHoldingsInternational","allCSVData","getRowHeading","interestRate","getFieldsInternational","getHeadings","getAccoladeHeadings","reportData","generatedAt","getStandardDisclaimer","nowDate","getHoldingsFields","getHoldingsHeadingsAligned","getHoldingsFormatHints","getInternationalHoldingsFields","getInternationalHoldingsHeadingsAligned","getInternationalHoldingsFormatHints","getCashHoldingsFields","getCashHoldingsHeadings","getCashHoldingsFormatHints","getTermDepositsFields","getTermDepositsHeadings","getTermDepositsFormatHints","formattedData","record","getFields","getAccoladeFields","result_1","result_2","yield","getHoldingsHeadings","loadStandardAccount","cashDeposits","buildCashHoldingReport","buildTermDepositsReport","asOf","cashDeposit","rec","inputHoldings","intHoldings","termDeposit","ConfirmationNotesCtrl","bulkDownloadService","isSelectAll","hasNotesInRange","confirmationNotes","m","conDate","isBetween","stopPropagation","selectableContractNotes","cn","checkedItems","isDownloadButtonDisabled","toggleSelection","idx","loadConfirmationNotes","reportError","filteredData","sortedData","orderBy","makePdf","downloadContractNote","Accept","notes","getFormattedData","startDateStr","endDateStr","getFormatHints","getFormattedDataCsv","note","fields","conNumber","securityDescription","units","currencyCode","nett","MarketOrdersCtrl","hasOrdersInRange","marketOrders","orderDate","makeOrdersPdf","rawData","getFormattedDataPdf","getRawHeader","getPdfHeader","investorPortfolioId","accountNumber","dateRangeSelected","loadMarketOrders","setHours","MarketDepthCtrl","marketDepthInformation","ReportViewCtrl","renderReport","isRendering","initialReportGenerated","showNewReportBtn","hidePdf","hideCsv","generatedDateTime","reportStartDate","reportEndDate","loaded","current","searchtextRun","searchtext","isPreselected","collapsedBanner","isAccolade","toggleNewReportBtn","setReportType","showFromDate","fromDateString","toDateString","asAtDateString","downloadInvestorDocuments","LedgerViewCtrl","renderLedger","XrayCtrl","portfolio_xray","UATPortfolioCompareCtrl","portfolioDemo","proposed","portfolioModule","checkUserProfile","ChangeRequestBaseCtrl","ChangeRequestViewCtrl","currentIndex","hasChangeRequests","changeRequests","setCurrentChangeRequest","goToPreviousChangeRequest","goToNextChangeRequest","currentChangeRequest","setApprovalStatusDescription","setChangeRequestTypeDescription","constructOriginalDataObject","constructModifiedDataObject","changeRequest","originalData","originalDataKeys","modifiedData","modifiedDataKeys","approvalStatusDescription","changeRequestType","changeRequestTypeDescription","changeRequestModule","VerifyPhoneCtrl","phoneForm","ChangePasswordCtrl","isValid","isValidPassword","passwordInputType","togglePasswordVisibility","changePasswordForm","ChangeEmailCtrl","emailChanged","profileAddressDetails","changeEmailForm","newEmail","SetPasswordCtrl","isSuccess","setPasswordForm","sleep","identityModule","controllerModule","compareTo","require","otherModelValue","attributes","ngModel","$validators","modelValue","$watch","$validate","appDirectives","constant","directive","version","template","restrict","attrs","formCtrl","inputEl","inputNgEl","inputName","bind","toggleClass","addressTitle","mailAddressForm","src","errSrc","$set","$observe","elm","ctrl","$asyncValidators","isNotDuplicate","viewValue","$isEmpty","existing","dateFormat","control","checker","e1","$eval","e2","passwordMatch","n","$setValidity","defaultTitle","$interpolate","separateBy","stateTitle","appComponents","Chart","defaults","LineWithLine","global","defaultFontFamily","controllers","extend","draw","ease","chart","tooltip","_active","activePoint","ctx","tooltipPosition","topY","legend","bottom","bottomY","chartArea","beginPath","moveTo","lineTo","lineWidth","strokeStyle","setLineDash","stroke","restore","waitForEle","checkExist","setInterval","clearInterval","init","modulePath","componentTag","isActive","destroy","bootstrap","getAngularModuleDependencies","innerHTML","lazy","initializeMarketsComponent","allDependencies","$provide","$httpProvider","applicationInsightsServiceProvider","showErrorsConfigProvider","$compileProvider","$analyticsProvider","aHrefSanitizationWhitelist","html5Mode","applicationInsightsInstrumentationKey","applicationName","autoPageViewTracking","autoLogTracking","autoExceptionTracking","configure","decorator","$delegate","original","trackPageView","propertyInfo","ComponentName","auth_time","given_name","family_name","role","sid","setCommonProperties","ga","excludeRoutes","withBase","firstPageview","virtualPageviews","showSuccess","interceptors","run","$templateCache","pendingRequests","stringsToMatch","empty","className","route","pageTrack","getProfitLossClass","number","_class","_number"],"mappings":"AAuCA,QAAAA,0BAEE,MAAO,IAAIC,SAAQ,SAACC,EAASC,GAEzBC,aAAaC,UAAUC,gBAAkBC,iBAEzCC,QAAQC,IAAI,4BAEZC,YAAYC,OAAOC,KAAKR,cAAcS,KAAK,WACzCX,QAKR,QAAAY,iBAAyBC,EAAKC,GAE5B,GAAmB,mBAARD,GAAqB,OAAO,CAGvC,IAAIE,GAASD,EAAKE,QAAQ,IAG1B,OAAID,MAEKH,gBACLC,EAAIC,EAAKG,UAAU,EAAGF,IACtBD,EAAKI,OAAOH,EAAS,IAKlBF,EAAIC,GAGb,QAAAK,sBACEC,EACAC,EACAC,EACAC,GAEA,GAAMC,GAAYC,SAASC,cAAc,OACrCC,EAAkBF,SAASG,eAAeR,EAC9CI,GAAUK,aAAa,KAAMR,GAC7BM,EAAgBG,YAAYN,EAE5B,IAAMO,GAA2BnB,gBAC/BV,aAAa8B,cAAcC,UAAUC,WACrCX,EAAc,YAGhB,OAAO,IAAIxB,SAAQ,SAAUC,EAASC,GACpC,GAAIkC,GAAY3B,YAAY0B,WAAWZ,EACpCa,IACDA,EAAUC,iBACRC,QAASb,EACTc,sBACEH,WACEH,cAAeD,EACfQ,GAAIlB,EACJmB,UAAWT,EAAyBS,cAI1CxC,KAEAC,EAAO,oEAAsEqB,KCxGnF,GAAImB,eACH,MACA,KACA,KACA,KACA,KACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,KACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,OCx6CKC,YAAc,SAACC,GACjB,MAAOA,GAAIC,cAAcC,QAAQ,QAAS,SAAAC,GAAK,MAAAA,GAAEC,iBAG/CC,iBAAmB,GAAIC,QAAO,OAAOR,aAAaS,KAAK,KAAK,uBAAwB,MACpFC,wBAA0B,SAACC,GAE7B,MAAOA,GAAKP,QACRG,iBACA,SAASK,GACL,MAAOA,GAAIN,iBAIhBO,OAAP,SAAOA,GAEH,QAAAC,KACI,MAAO,UAAUC,GACb,MAAOA,GAAQ,MAAQ,MAI/B,QAAAC,KACI,MAAO,UAAUD,GACb,MAAa,KAATA,EACO,MAEO,KAATA,EACE,OAGAA,GAKnB,QAAAE,KACI,MAAO,UAAUC,EAAOC,EAAOC,GAE3B,GAAIC,KAMJ,OALAC,SAAQC,QAAQL,EAAO,SAAUM,GACzBC,OAAOD,EAAKL,IAAQO,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","file":"application.js","sourcesContent":["\"use strict\";\r\n\r\ndeclare var morningstar: any;\r\ndeclare var loaderConfig: any;\r\ndeclare var SALauthUrl: any;\r\ndeclare var mapHoldingTypeIdToReportURL: any;\r\ndeclare var _marketsApiToken: any;\r\ndeclare var pathBase: string;\r\ndeclare var $clamp: any;\r\ndeclare var cssVars: any;\r\ndeclare var Chart: any;\r\nlet apiGatewayToken = '';\r\nChart.defaults.LineWithLine = Chart.defaults.line;\r\nChart.defaults.global.defaultFontFamily = \"'Neue Helvetica W01', 'sans-serif'\";\r\nChart.controllers.LineWithLine = Chart.controllers.line.extend({\r\n draw: function(ease) {\r\n Chart.controllers.line.prototype.draw.call(this, ease);\r\n\r\n if (this.chart.tooltip._active && this.chart.tooltip._active.length) {\r\n var activePoint = this.chart.tooltip._active[0],\r\n ctx = this.chart.ctx,\r\n x = activePoint.tooltipPosition().x,\r\n topY = this.chart.legend.bottom,\r\n bottomY = this.chart.chartArea.bottom;\r\n\r\n // draw line\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.moveTo(x, topY);\r\n ctx.lineTo(x, bottomY);\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = '#333';\r\n ctx.setLineDash([5, 5]);\r\n ctx.stroke();\r\n ctx.restore();\r\n }\r\n }\r\n});\r\n//init css vars ponyfill\r\nfunction rootMorningstarPromise() :any {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n loaderConfig.apiTokens.apiGatewayToken = _marketsApiToken;\r\n\r\n console.log('initializing morningstar');\r\n //loads Morningstar\r\n morningstar.loader.load(loaderConfig).then(() => {\r\n resolve(); //returns a promise object\r\n })\r\n\r\n })\r\n}\r\nfunction fetchFromObject(obj, prop) {\r\n //property not found\r\n if (typeof obj === \"undefined\") return false;\r\n\r\n //index of next property split\r\n var _index = prop.indexOf(\".\");\r\n\r\n //property split found; recursive call\r\n if (_index > -1) {\r\n //get object at property (before split), pass on remainder\r\n return fetchFromObject(\r\n obj[prop.substring(0, _index)],\r\n prop.substr(_index + 1)\r\n );\r\n }\r\n\r\n //no split; get property\r\n return obj[prop];\r\n}\r\n\r\nfunction loadMarketsComponent(\r\n elementId,\r\n containerId,\r\n componentTagName,\r\n componentId\r\n) {\r\n const container = document.createElement(\"div\");\r\n var containerParent = document.getElementById(elementId);\r\n container.setAttribute(\"id\", containerId);\r\n containerParent.appendChild(container);\r\n\r\n const marketsComponentSettings = fetchFromObject(\r\n loaderConfig.configuration.overrides.components,\r\n componentId + \".settings\"\r\n );\r\n\r\n return new Promise(function (resolve, reject) {\r\n var component = morningstar.components[componentTagName];\r\n if(component){\r\n component.createComponent({\r\n element: container,\r\n initialConfiguration: {\r\n component: {\r\n configuration: marketsComponentSettings,\r\n id: containerId,\r\n callbacks: marketsComponentSettings.callbacks\r\n }\r\n }\r\n });\r\n resolve();\r\n }else{\r\n reject('Could not find component with tagname in morningstar components: ' + componentTagName)\r\n }\r\n });\r\n}\r\n\r\nvar waitForEle = (element, callback) =>{\r\n var checkExist = setInterval(function () {\r\n if ($(element).length) {\r\n clearInterval(checkExist);\r\n callback()\r\n }\r\n }, 1000); // check every 100ms\r\n}\r\nvar initComponent = function (elementId, containerId, componentTagName, componentId) {\r\n let count = 0;\r\n let maxRetries = 3;\r\n const init = function(element){\r\n var component = morningstar.asterix.instanceRegistry.find(componentId);\r\n if (component) {\r\n var path = component.modulePath\r\n var componentTag = document.createElement(componentTagName);\r\n var container = document.createElement('div');\r\n if (componentId.indexOf('ecWatchList') === -1 && !morningstar.asterix.instanceRegistry.find(componentId).isActive) {\r\n console.log('Destroying watchlist first..');\r\n morningstar.asterix.instanceRegistry.get(path).destroy();\r\n }\r\n\r\n morningstar.asterix.instanceRegistry.init(path);\r\n\r\n componentTag.setAttribute('mstar-component-id', componentId);\r\n // ... and attach it to the container.\r\n\r\n container.setAttribute('id', containerId);\r\n container.appendChild(componentTag);\r\n\r\n // Bootstrap the element\r\n angular.bootstrap(container, morningstar.asterix.ng.getAngularModuleDependencies());\r\n\r\n element.innerHTML = '';\r\n element.appendChild(container);\r\n } else {\r\n console.error(\"Could not find component with ID \" + componentId)\r\n }\r\n }\r\n let promiseChain = new Promise(function (resolve) {\r\n waitForEle('#' + elementId, function(){\r\n var element = document.getElementById(elementId);\r\n init(element);\r\n resolve()\r\n })\r\n\r\n });\r\n\r\n if (loaderConfig.lazy.initializeMarketsComponent && componentTagName.indexOf('markets-') == 0) {\r\n promiseChain.then(function () { loadMarketsComponent(elementId, containerId, componentTagName, componentId); });\r\n }\r\n\r\n return promiseChain;\r\n}\r\n\r\ninterface IAppRootScopeService extends angular.IRootScopeService {\r\n $state: any;\r\n $stateParams: any;\r\n layout: string;\r\n errorHandler: any;\r\n morningstarPromise:any;\r\n morningstarSalETFPromise: any;\r\n initComponent: any;\r\n getProfitLossClass: (number) => string;\r\n}\r\n\r\n// var morningstarDependencies = morningstar.asterix.ng.getAngularModuleDependencies();\r\nvar allDependencies = [\r\n \"ui.router\",\r\n \"ui.router.state.events\",\r\n \"app.filters\",\r\n \"app.services\",\r\n \"app.directives\",\r\n \"app.components\",\r\n \"app.controllers\",\r\n 'ui.bootstrap',\r\n 'ui.bootstrap.showErrors',\r\n 'ui.bootstrap.modal',\r\n 'validation.match',\r\n 'app.identityModule',\r\n 'app.portfolioModule',\r\n 'app.analysisModule',\r\n 'app.myDetailsModule',\r\n 'app.researchModule',\r\n 'app.accountDetailsModule',\r\n 'app.changeRequestModule',\r\n 'angular-smart-chartist',\r\n 'ngSanitize',\r\n 'ngCsv',\r\n 'chart.js',\r\n // 'SALModule',\r\n \r\n 'ngRoute',\r\n 'duScroll',\r\n 'ngTagsInput',\r\n \r\n //analytics\r\n \"ApplicationInsightsModule\",\r\n 'angulartics',\r\n 'angulartics.google.tagmanager'\r\n];\r\n\r\nvar module = angular.module(\"app\", allDependencies);\r\n\r\nmodule.config([\r\n \"$provide\",\r\n \"$stateProvider\",\r\n \"$locationProvider\",\r\n \"$httpProvider\",\r\n \"applicationInsightsServiceProvider\",\r\n \"showErrorsConfigProvider\",\r\n '$compileProvider',\r\n '$analyticsProvider',\r\n function(\r\n $provide,\r\n $stateProvider,\r\n $locationProvider: angular.ILocationProvider,\r\n $httpProvider,\r\n applicationInsightsServiceProvider,\r\n showErrorsConfigProvider,\r\n $compileProvider,\r\n $analyticsProvider) {\r\n\r\n $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|mailto|tel):/);\r\n $locationProvider.html5Mode(true);\r\n $stateProvider\r\n .state(\"home\",\r\n {\r\n url: \"/\",\r\n templateUrl: 'assets/templates/common/loading.html',\r\n controller: 'landingCtrl'\r\n })\r\n .state('help', {\r\n url: '/help',\r\n templateUrl: 'assets/templates/common/help.html',\r\n controller: \"helpViewCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Help\"};\r\n }],\r\n }\r\n })\r\n .state('forbidden', {\r\n url: '/forbidden',\r\n templateUrl: 'assets/templates/common/forbidden.html',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Forbidden\"};\r\n }],\r\n }\r\n })\r\n .state('error', {\r\n url: '/error',\r\n templateUrl: 'assets/templates/common/error.html',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Error\"};\r\n }],\r\n }\r\n })\r\n .state(\"otherwise\",\r\n {\r\n url: \"*path\",\r\n templateUrl: \"assets/templates/common/404.html\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Not Found\"};\r\n }],\r\n }\r\n });\r\n\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n //var trustedLoginMessage = $sceProvider.trustAsHtml(model['content']['loginMessage']);\r\n var dictionary: any = JSON.parse(model);\r\n\r\n var applicationInsightsInstrumentationKey = dictionary['applicationInsightsInstrumentationKey'];\r\n\r\n var options = { applicationName: 'Investor Website', autoPageViewTracking: true, autoLogTracking: false, autoExceptionTracking: true };\r\n applicationInsightsServiceProvider.configure(applicationInsightsInstrumentationKey, options);\r\n\r\n $provide.decorator(\"applicationInsightsService\", [\"tokenService\", \"$delegate\", function myDecorate(tokenService, $delegate) {\r\n\r\n var original = $delegate.trackPageView;\r\n $delegate.trackPageView = function decoratedWarn(msg) {\r\n\r\n let propertyInfo: any = {};\r\n propertyInfo.ComponentName = \"Investor Website\";\r\n if (tokenService.tokenManager.profile) {\r\n\r\n propertyInfo.email = tokenService.tokenManager.profile.email;\r\n propertyInfo.account = tokenService.tokenManager.profile.account;\r\n //propertyInfo.agaccount = tokenService.tokenManager.profile.agaccount;\r\n propertyInfo.auth_time = new Date(tokenService.tokenManager.profile.auth_time * 1000);\r\n propertyInfo.given_name = tokenService.tokenManager.profile.given_name;\r\n propertyInfo.family_name = tokenService.tokenManager.profile.family_name;\r\n propertyInfo.pan = tokenService.tokenManager.profile.preferred_username;\r\n propertyInfo.role = tokenService.tokenManager.profile.role;\r\n propertyInfo.sub = tokenService.tokenManager.profile.sub;\r\n propertyInfo.sid = tokenService.tokenManager.profile.sid;\r\n }\r\n $delegate.setCommonProperties(propertyInfo);\r\n\r\n original.apply($delegate, arguments);\r\n };\r\n return $delegate;\r\n }]);\r\n\r\n $provide.decorator(\"$analytics\", [\"tokenService\", \"$delegate\", (tokenService, $delegate) => {\r\n if (tokenService.tokenManager.profile) {\r\n $analyticsProvider.settings.ga = {\r\n userId: tokenService.tokenManager.profile.preferred_username\r\n };\r\n }\r\n return $delegate;\r\n }]);\r\n $analyticsProvider.excludeRoutes(['/callback', '/forbidden']);\r\n $analyticsProvider.withBase(false);\r\n $analyticsProvider.firstPageview(false);\r\n //handle page tracking manually to work around dynamic titles\r\n $analyticsProvider.virtualPageviews(false);\r\n \r\n showErrorsConfigProvider.showSuccess(true);\r\n\r\n $httpProvider.interceptors.push('bearerInjector');\r\n\r\n }]);\r\n\r\nmodule.run([\r\n '$templateCache',\r\n '$rootScope',\r\n '$state',\r\n '$stateParams',\r\n '$http',\r\n 'tokenService',\r\n 'sessionService',\r\n '$analytics',\r\n '$location',\r\n 'userCompanyService',\r\n function(\r\n $templateCache: ng.ITemplateCacheService,\r\n $rootScope: IAppRootScopeService,\r\n $state,\r\n $stateParams,\r\n $http,\r\n tokenService, \r\n sessionService,\r\n $analytics,\r\n $location,\r\n userCompanyService) {\r\n console.log(\"Running App\");\r\n\r\n // Allows to retrieve UI Router state information from inside templates\r\n $rootScope.$state = $state;\r\n $rootScope.$stateParams = $stateParams;\r\n $rootScope.$on(\"$stateChangeError\", console.log.bind(console));\r\n\r\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\r\n \r\n $http.pendingRequests.forEach(function(request) {\r\n\r\n let url = request.url;\r\n let stringsToMatch = [\r\n \"dataService/api/adviser\",\r\n \"dataService/odata/changeRequests/ChangeRequestService.GetChangeRequestsForApprovalCount\",\r\n \"dataService/api/userCompany\",\r\n \"dataService/api/Reporting/CheckFreezeWindow\"\r\n ] \r\n let match = false;\r\n stringsToMatch.forEach((string) => {\r\n if(!match && url.indexOf(string) > -1) {\r\n match = true\r\n }\r\n })\r\n //Check if the requests are within the nav bar or footer - if so do not cancel them \r\n if(!match){\r\n if (request.cancel) {\r\n request.cancel.resolve();\r\n }\r\n }\r\n });\r\n\r\n console.log('destroying sal-report')\r\n //remove the SAL reports\r\n $('#sal-report').empty()\r\n\r\n\r\n $('#app').removeClass(function (index, className) {\r\n return (className.match(/(^|\\s)page-\\S+/g) || []).join(' ');\r\n });\r\n $('#app').addClass('page-' + toState.name)\r\n\r\n });\r\n //only track the page when title is resolved\r\n $rootScope.$on('$titleChangeSuccess', function(event, route) {\r\n $analytics.pageTrack($location.path());\r\n });\r\n\r\n //profit loss class\r\n $rootScope.getProfitLossClass = function(number) {\r\n let _class = \"\";\r\n const _number = parseFloat(number);\r\n if(!isNaN(_number)) {\r\n if(number === 0) {\r\n _class = \"\";\r\n }else if(_number > 0) {\r\n _class = \"success\";\r\n }else {\r\n _class = \"danger\";\r\n }\r\n }\r\n return _class;\r\n }\r\n}]);\r\n","var excludeWords = [\r\n\t\"MRS\",\r\n\t\"MR\",\r\n\t\"CO\",\r\n\t\"DR\",\r\n\t\"MS\",\r\n\t\"NG\",\r\n\t\"PTY\",\r\n\t\"LTD\",\r\n\t\"IAN\",\r\n\t\"TIM\",\r\n\t\"LEO\",\r\n\t\"NIC\",\r\n\t\"ONG\",\r\n\t\"TU\",\r\n\t\"GUO\",\r\n\t\"DAI\",\r\n\t\"JON\",\r\n\t\"JEZ\",\r\n\t\"LIM\",\r\n\t\"ZOE\",\r\n\t\"DEA\",\r\n\t\"ZYL\",\r\n\t\"EVA\",\r\n\t\"AMY\",\r\n\t\"ROY\",\r\n\t\"AA\",\r\n\t\"AAH\",\r\n\t\"AAL\",\r\n\t\"AAS\",\r\n\t\"AB\",\r\n\t\"ABA\",\r\n\t\"ABB\",\r\n\t\"ABO\",\r\n\t\"ABS\",\r\n\t\"ABY\",\r\n\t\"ACE\",\r\n\t\"ACH\",\r\n\t\"ACT\",\r\n\t\"AD\",\r\n\t\"ADD\",\r\n\t\"ADO\",\r\n\t\"ADS\",\r\n\t\"ADZ\",\r\n\t\"AE\",\r\n\t\"AFF\",\r\n\t\"AFT\",\r\n\t\"AG\",\r\n\t\"AGA\",\r\n\t\"AGE\",\r\n\t\"AGO\",\r\n\t\"AGS\",\r\n\t\"AH\",\r\n\t\"AHA\",\r\n\t\"AHI\",\r\n\t\"AHS\",\r\n\t\"AI\",\r\n\t\"AIA\",\r\n\t\"AID\",\r\n\t\"AIL\",\r\n\t\"AIM\",\r\n\t\"AIN\",\r\n\t\"AIR\",\r\n\t\"AIS\",\r\n\t\"AIT\",\r\n\t\"AKA\",\r\n\t\"AKE\",\r\n\t\"AL\",\r\n\t\"ALA\",\r\n\t\"ALB\",\r\n\t\"ALE\",\r\n\t\"ALF\",\r\n\t\"ALL\",\r\n\t\"ALP\",\r\n\t\"ALS\",\r\n\t\"ALT\",\r\n\t\"ALU\",\r\n\t\"AM\",\r\n\t\"AMA\",\r\n\t\"AME\",\r\n\t\"AMI\",\r\n\t\"AMP\",\r\n\t\"AMU\",\r\n\t\"AN\",\r\n\t\"ANA\",\r\n\t\"AND\",\r\n\t\"ANE\",\r\n\t\"ANI\",\r\n\t\"ANN\",\r\n\t\"ANS\",\r\n\t\"ANT\",\r\n\t\"ANY\",\r\n\t\"APE\",\r\n\t\"APO\",\r\n\t\"APP\",\r\n\t\"APT\",\r\n\t\"AR\",\r\n\t\"ARB\",\r\n\t\"ARC\",\r\n\t\"ARD\",\r\n\t\"ARE\",\r\n\t\"ARF\",\r\n\t\"ARK\",\r\n\t\"ARM\",\r\n\t\"ARS\",\r\n\t\"ART\",\r\n\t\"ARY\",\r\n\t\"AS\",\r\n\t\"ASH\",\r\n\t\"ASK\",\r\n\t\"ASP\",\r\n\t\"AT\",\r\n\t\"ATE\",\r\n\t\"ATS\",\r\n\t\"ATT\",\r\n\t\"AUA\",\r\n\t\"AUE\",\r\n\t\"AUF\",\r\n\t\"AUK\",\r\n\t\"AVA\",\r\n\t\"AVE\",\r\n\t\"AVO\",\r\n\t\"AW\",\r\n\t\"AWA\",\r\n\t\"AWE\",\r\n\t\"AWK\",\r\n\t\"AWL\",\r\n\t\"AWN\",\r\n\t\"AX\",\r\n\t\"AXE\",\r\n\t\"AY\",\r\n\t\"AYE\",\r\n\t\"AYS\",\r\n\t\"AYU\",\r\n\t\"AZO\",\r\n\t\"BA\",\r\n\t\"BAA\",\r\n\t\"BAC\",\r\n\t\"BAD\",\r\n\t\"BAG\",\r\n\t\"BAH\",\r\n\t\"BAL\",\r\n\t\"BAM\",\r\n\t\"BAN\",\r\n\t\"BAP\",\r\n\t\"BAR\",\r\n\t\"BAS\",\r\n\t\"BAT\",\r\n\t\"BAY\",\r\n\t\"BE\",\r\n\t\"BED\",\r\n\t\"BEE\",\r\n\t\"BEG\",\r\n\t\"BEL\",\r\n\t\"BEN\",\r\n\t\"BES\",\r\n\t\"BET\",\r\n\t\"BEY\",\r\n\t\"BEZ\",\r\n\t\"BI\",\r\n\t\"BIB\",\r\n\t\"BID\",\r\n\t\"BIG\",\r\n\t\"BIN\",\r\n\t\"BIO\",\r\n\t\"BIS\",\r\n\t\"BIT\",\r\n\t\"BIZ\",\r\n\t\"BO\",\r\n\t\"BOA\",\r\n\t\"BOB\",\r\n\t\"BOD\",\r\n\t\"BOG\",\r\n\t\"BOH\",\r\n\t\"BOI\",\r\n\t\"BOK\",\r\n\t\"BON\",\r\n\t\"BOO\",\r\n\t\"BOP\",\r\n\t\"BOR\",\r\n\t\"BOS\",\r\n\t\"BOT\",\r\n\t\"BOW\",\r\n\t\"BOX\",\r\n\t\"BOY\",\r\n\t\"BRA\",\r\n\t\"BRO\",\r\n\t\"BRR\",\r\n\t\"BRU\",\r\n\t\"BUB\",\r\n\t\"BUD\",\r\n\t\"BUG\",\r\n\t\"BUN\",\r\n\t\"BUR\",\r\n\t\"BUS\",\r\n\t\"BUT\",\r\n\t\"BUY\",\r\n\t\"BY\",\r\n\t\"BYE\",\r\n\t\"BYS\",\r\n\t\"CAA\",\r\n\t\"CAB\",\r\n\t\"CAD\",\r\n\t\"CAG\",\r\n\t\"CAM\",\r\n\t\"CAN\",\r\n\t\"CAP\",\r\n\t\"CAR\",\r\n\t\"CAT\",\r\n\t\"CAW\",\r\n\t\"CAY\",\r\n\t\"CAZ\",\r\n\t\"CEE\",\r\n\t\"CEL\",\r\n\t\"CEP\",\r\n\t\"CH\",\r\n\t\"CHA\",\r\n\t\"CHE\",\r\n\t\"CHI\",\r\n\t\"CID\",\r\n\t\"CIG\",\r\n\t\"CIS\",\r\n\t\"CIT\",\r\n\t\"CLY\",\r\n\t\"COB\",\r\n\t\"COD\",\r\n\t\"COG\",\r\n\t\"COL\",\r\n\t\"CON\",\r\n\t\"COO\",\r\n\t\"COP\",\r\n\t\"COR\",\r\n\t\"COS\",\r\n\t\"COT\",\r\n\t\"COW\",\r\n\t\"COY\",\r\n\t\"COZ\",\r\n\t\"CRU\",\r\n\t\"CRY\",\r\n\t\"CUB\",\r\n\t\"CUD\",\r\n\t\"CUE\",\r\n\t\"CUP\",\r\n\t\"CUR\",\r\n\t\"CUT\",\r\n\t\"CUZ\",\r\n\t\"CWM\",\r\n\t\"DA\",\r\n\t\"DAB\",\r\n\t\"DAD\",\r\n\t\"DAE\",\r\n\t\"DAG\",\r\n\t\"DAH\",\r\n\t\"DAK\",\r\n\t\"DAL\",\r\n\t\"DAM\",\r\n\t\"DAN\",\r\n\t\"DAP\",\r\n\t\"DAS\",\r\n\t\"DAW\",\r\n\t\"DAY\",\r\n\t\"DE\",\r\n\t\"DEB\",\r\n\t\"DEE\",\r\n\t\"DEF\",\r\n\t\"DEG\",\r\n\t\"DEI\",\r\n\t\"DEL\",\r\n\t\"DEN\",\r\n\t\"DEV\",\r\n\t\"DEW\",\r\n\t\"DEX\",\r\n\t\"DEY\",\r\n\t\"DI\",\r\n\t\"DIB\",\r\n\t\"DID\",\r\n\t\"DIE\",\r\n\t\"DIF\",\r\n\t\"DIG\",\r\n\t\"DIM\",\r\n\t\"DIN\",\r\n\t\"DIP\",\r\n\t\"DIS\",\r\n\t\"DIT\",\r\n\t\"DIV\",\r\n\t\"DO\",\r\n\t\"DOB\",\r\n\t\"DOC\",\r\n\t\"DOD\",\r\n\t\"DOE\",\r\n\t\"DOF\",\r\n\t\"DOG\",\r\n\t\"DOH\",\r\n\t\"DOL\",\r\n\t\"DOM\",\r\n\t\"DON\",\r\n\t\"DOO\",\r\n\t\"DOP\",\r\n\t\"DOR\",\r\n\t\"DOS\",\r\n\t\"DOT\",\r\n\t\"DOW\",\r\n\t\"DOY\",\r\n\t\"DRY\",\r\n\t\"DSO\",\r\n\t\"DUB\",\r\n\t\"DUD\",\r\n\t\"DUE\",\r\n\t\"DUG\",\r\n\t\"DUH\",\r\n\t\"DUI\",\r\n\t\"DUN\",\r\n\t\"DUO\",\r\n\t\"DUP\",\r\n\t\"DUX\",\r\n\t\"DYE\",\r\n\t\"DZO\",\r\n\t\"EA\",\r\n\t\"EAN\",\r\n\t\"EAR\",\r\n\t\"EAS\",\r\n\t\"EAT\",\r\n\t\"EAU\",\r\n\t\"EBB\",\r\n\t\"ECH\",\r\n\t\"ECO\",\r\n\t\"ECU\",\r\n\t\"ED\",\r\n\t\"EDH\",\r\n\t\"EDS\",\r\n\t\"EE\",\r\n\t\"EEK\",\r\n\t\"EEL\",\r\n\t\"EEN\",\r\n\t\"EF\",\r\n\t\"EFF\",\r\n\t\"EFS\",\r\n\t\"EFT\",\r\n\t\"EGG\",\r\n\t\"EGO\",\r\n\t\"EH\",\r\n\t\"EHS\",\r\n\t\"EIK\",\r\n\t\"EKE\",\r\n\t\"EL\",\r\n\t\"ELD\",\r\n\t\"ELF\",\r\n\t\"ELK\",\r\n\t\"ELL\",\r\n\t\"ELM\",\r\n\t\"ELS\",\r\n\t\"ELT\",\r\n\t\"EM\",\r\n\t\"EME\",\r\n\t\"EMF\",\r\n\t\"EMO\",\r\n\t\"EMS\",\r\n\t\"EMU\",\r\n\t\"EN\",\r\n\t\"END\",\r\n\t\"ENE\",\r\n\t\"ENG\",\r\n\t\"ENS\",\r\n\t\"EON\",\r\n\t\"ER\",\r\n\t\"ERA\",\r\n\t\"ERE\",\r\n\t\"ERF\",\r\n\t\"ERG\",\r\n\t\"ERK\",\r\n\t\"ERM\",\r\n\t\"ERN\",\r\n\t\"ERR\",\r\n\t\"ERS\",\r\n\t\"ES\",\r\n\t\"ESS\",\r\n\t\"EST\",\r\n\t\"ET\",\r\n\t\"ETA\",\r\n\t\"ETH\",\r\n\t\"EUK\",\r\n\t\"EVE\",\r\n\t\"EVO\",\r\n\t\"EWE\",\r\n\t\"EWK\",\r\n\t\"EWT\",\r\n\t\"EX\",\r\n\t\"EXO\",\r\n\t\"EYE\",\r\n\t\"FA\",\r\n\t\"FAA\",\r\n\t\"FAB\",\r\n\t\"FAD\",\r\n\t\"FAE\",\r\n\t\"FAH\",\r\n\t\"FAN\",\r\n\t\"FAP\",\r\n\t\"FAR\",\r\n\t\"FAS\",\r\n\t\"FAT\",\r\n\t\"FAW\",\r\n\t\"FAX\",\r\n\t\"FAY\",\r\n\t\"FE\",\r\n\t\"FED\",\r\n\t\"FEE\",\r\n\t\"FEG\",\r\n\t\"FEH\",\r\n\t\"FEM\",\r\n\t\"FEN\",\r\n\t\"FER\",\r\n\t\"FES\",\r\n\t\"FET\",\r\n\t\"FEU\",\r\n\t\"FEW\",\r\n\t\"FEY\",\r\n\t\"FEZ\",\r\n\t\"FIB\",\r\n\t\"FID\",\r\n\t\"FIE\",\r\n\t\"FIG\",\r\n\t\"FIL\",\r\n\t\"FIN\",\r\n\t\"FIR\",\r\n\t\"FIT\",\r\n\t\"FIX\",\r\n\t\"FIZ\",\r\n\t\"FLU\",\r\n\t\"FLY\",\r\n\t\"FOB\",\r\n\t\"FOE\",\r\n\t\"FOG\",\r\n\t\"FOH\",\r\n\t\"FON\",\r\n\t\"FOP\",\r\n\t\"FOR\",\r\n\t\"FOU\",\r\n\t\"FOX\",\r\n\t\"FOY\",\r\n\t\"FRA\",\r\n\t\"FRO\",\r\n\t\"FRY\",\r\n\t\"FUB\",\r\n\t\"FUD\",\r\n\t\"FUG\",\r\n\t\"FUM\",\r\n\t\"FUN\",\r\n\t\"FUR\",\r\n\t\"FY\",\r\n\t\"GAB\",\r\n\t\"GAD\",\r\n\t\"GAE\",\r\n\t\"GAG\",\r\n\t\"GAK\",\r\n\t\"GAL\",\r\n\t\"GAM\",\r\n\t\"GAN\",\r\n\t\"GAP\",\r\n\t\"GAR\",\r\n\t\"GAS\",\r\n\t\"GAT\",\r\n\t\"GAU\",\r\n\t\"GAW\",\r\n\t\"GAY\",\r\n\t\"GED\",\r\n\t\"GEE\",\r\n\t\"GEL\",\r\n\t\"GEM\",\r\n\t\"GEN\",\r\n\t\"GEO\",\r\n\t\"GER\",\r\n\t\"GET\",\r\n\t\"GEY\",\r\n\t\"GHI\",\r\n\t\"GI\",\r\n\t\"GIB\",\r\n\t\"GID\",\r\n\t\"GIE\",\r\n\t\"GIF\",\r\n\t\"GIG\",\r\n\t\"GIN\",\r\n\t\"GIO\",\r\n\t\"GIP\",\r\n\t\"GIS\",\r\n\t\"GIT\",\r\n\t\"GJU\",\r\n\t\"GNU\",\r\n\t\"GO\",\r\n\t\"GOA\",\r\n\t\"GOB\",\r\n\t\"GOD\",\r\n\t\"GOE\",\r\n\t\"GON\",\r\n\t\"GOO\",\r\n\t\"GOR\",\r\n\t\"GOS\",\r\n\t\"GOT\",\r\n\t\"GOV\",\r\n\t\"GOX\",\r\n\t\"GOY\",\r\n\t\"GU\",\r\n\t\"GUB\",\r\n\t\"GUE\",\r\n\t\"GUL\",\r\n\t\"GUM\",\r\n\t\"GUN\",\r\n\t\"GUP\",\r\n\t\"GUR\",\r\n\t\"GUS\",\r\n\t\"GUT\",\r\n\t\"GUV\",\r\n\t\"GUY\",\r\n\t\"GYM\",\r\n\t\"GYP\",\r\n\t\"HA\",\r\n\t\"HAD\",\r\n\t\"HAE\",\r\n\t\"HAG\",\r\n\t\"HAH\",\r\n\t\"HAJ\",\r\n\t\"HAM\",\r\n\t\"HAN\",\r\n\t\"HAO\",\r\n\t\"HAP\",\r\n\t\"HAS\",\r\n\t\"HAT\",\r\n\t\"HAW\",\r\n\t\"HAY\",\r\n\t\"HE\",\r\n\t\"HEH\",\r\n\t\"HEM\",\r\n\t\"HEN\",\r\n\t\"HEP\",\r\n\t\"HER\",\r\n\t\"HES\",\r\n\t\"HET\",\r\n\t\"HEW\",\r\n\t\"HEX\",\r\n\t\"HEY\",\r\n\t\"HI\",\r\n\t\"HIC\",\r\n\t\"HID\",\r\n\t\"HIE\",\r\n\t\"HIM\",\r\n\t\"HIN\",\r\n\t\"HIP\",\r\n\t\"HIS\",\r\n\t\"HIT\",\r\n\t\"HM\",\r\n\t\"HMM\",\r\n\t\"HO\",\r\n\t\"HOA\",\r\n\t\"HOB\",\r\n\t\"HOC\",\r\n\t\"HOD\",\r\n\t\"HOE\",\r\n\t\"HOG\",\r\n\t\"HOH\",\r\n\t\"HOI\",\r\n\t\"HOM\",\r\n\t\"HON\",\r\n\t\"HOO\",\r\n\t\"HOP\",\r\n\t\"HOS\",\r\n\t\"HOT\",\r\n\t\"HOW\",\r\n\t\"HOX\",\r\n\t\"HOY\",\r\n\t\"HUB\",\r\n\t\"HUE\",\r\n\t\"HUG\",\r\n\t\"HUH\",\r\n\t\"HUI\",\r\n\t\"HUM\",\r\n\t\"HUN\",\r\n\t\"HUP\",\r\n\t\"HUT\",\r\n\t\"HYE\",\r\n\t\"HYP\",\r\n\t\"ICE\",\r\n\t\"ICH\",\r\n\t\"ICK\",\r\n\t\"ICY\",\r\n\t\"ID\",\r\n\t\"IDE\",\r\n\t\"IDS\",\r\n\t\"IF\",\r\n\t\"IFF\",\r\n\t\"IFS\",\r\n\t\"IGG\",\r\n\t\"ILK\",\r\n\t\"ILL\",\r\n\t\"IMP\",\r\n\t\"IN\",\r\n\t\"ING\",\r\n\t\"INK\",\r\n\t\"INN\",\r\n\t\"INS\",\r\n\t\"IO\",\r\n\t\"ION\",\r\n\t\"IOS\",\r\n\t\"IRE\",\r\n\t\"IRK\",\r\n\t\"IS\",\r\n\t\"ISH\",\r\n\t\"ISM\",\r\n\t\"ISO\",\r\n\t\"IT\",\r\n\t\"ITA\",\r\n\t\"ITS\",\r\n\t\"IVY\",\r\n\t\"IWI\",\r\n\t\"JA\",\r\n\t\"JAB\",\r\n\t\"JAG\",\r\n\t\"JAI\",\r\n\t\"JAK\",\r\n\t\"JAM\",\r\n\t\"JAR\",\r\n\t\"JAW\",\r\n\t\"JAY\",\r\n\t\"JEE\",\r\n\t\"JET\",\r\n\t\"JEU\",\r\n\t\"JEW\",\r\n\t\"JIB\",\r\n\t\"JIG\",\r\n\t\"JIN\",\r\n\t\"JO\",\r\n\t\"JOB\",\r\n\t\"JOE\",\r\n\t\"JOG\",\r\n\t\"JOL\",\r\n\t\"JOR\",\r\n\t\"JOT\",\r\n\t\"JOW\",\r\n\t\"JOY\",\r\n\t\"JUD\",\r\n\t\"JUG\",\r\n\t\"JUN\",\r\n\t\"JUS\",\r\n\t\"JUT\",\r\n\t\"KA\",\r\n\t\"KAB\",\r\n\t\"KAE\",\r\n\t\"KAF\",\r\n\t\"KAI\",\r\n\t\"KAK\",\r\n\t\"KAM\",\r\n\t\"KAS\",\r\n\t\"KAT\",\r\n\t\"KAW\",\r\n\t\"KAY\",\r\n\t\"KEA\",\r\n\t\"KEB\",\r\n\t\"KED\",\r\n\t\"KEF\",\r\n\t\"KEG\",\r\n\t\"KEN\",\r\n\t\"KEP\",\r\n\t\"KET\",\r\n\t\"KEX\",\r\n\t\"KEY\",\r\n\t\"KHI\",\r\n\t\"KI\",\r\n\t\"KID\",\r\n\t\"KIF\",\r\n\t\"KIN\",\r\n\t\"KIP\",\r\n\t\"KIR\",\r\n\t\"KIS\",\r\n\t\"KIT\",\r\n\t\"KO\",\r\n\t\"KOA\",\r\n\t\"KOB\",\r\n\t\"KOI\",\r\n\t\"KON\",\r\n\t\"KOP\",\r\n\t\"KOR\",\r\n\t\"KOS\",\r\n\t\"KOW\",\r\n\t\"KUE\",\r\n\t\"KY\",\r\n\t\"KYE\",\r\n\t\"KYU\",\r\n\t\"LA\",\r\n\t\"LAB\",\r\n\t\"LAC\",\r\n\t\"LAD\",\r\n\t\"LAG\",\r\n\t\"LAH\",\r\n\t\"LAM\",\r\n\t\"LAP\",\r\n\t\"LAR\",\r\n\t\"LAS\",\r\n\t\"LAT\",\r\n\t\"LAV\",\r\n\t\"LAW\",\r\n\t\"LAX\",\r\n\t\"LAY\",\r\n\t\"LEA\",\r\n\t\"LED\",\r\n\t\"LEE\",\r\n\t\"LEG\",\r\n\t\"LEI\",\r\n\t\"LEK\",\r\n\t\"LEP\",\r\n\t\"LES\",\r\n\t\"LET\",\r\n\t\"LEU\",\r\n\t\"LEV\",\r\n\t\"LEW\",\r\n\t\"LEX\",\r\n\t\"LEY\",\r\n\t\"LEZ\",\r\n\t\"LI\",\r\n\t\"LIB\",\r\n\t\"LID\",\r\n\t\"LIE\",\r\n\t\"LIG\",\r\n\t\"LIN\",\r\n\t\"LIP\",\r\n\t\"LIS\",\r\n\t\"LIT\",\r\n\t\"LO\",\r\n\t\"LOB\",\r\n\t\"LOD\",\r\n\t\"LOG\",\r\n\t\"LOO\",\r\n\t\"LOP\",\r\n\t\"LOR\",\r\n\t\"LOS\",\r\n\t\"LOT\",\r\n\t\"LOU\",\r\n\t\"LOW\",\r\n\t\"LOX\",\r\n\t\"LOY\",\r\n\t\"LUD\",\r\n\t\"LUG\",\r\n\t\"LUM\",\r\n\t\"LUR\",\r\n\t\"LUV\",\r\n\t\"LUX\",\r\n\t\"LUZ\",\r\n\t\"LYE\",\r\n\t\"LYM\",\r\n\t\"MA\",\r\n\t\"MAA\",\r\n\t\"MAC\",\r\n\t\"MAD\",\r\n\t\"MAE\",\r\n\t\"MAG\",\r\n\t\"MAK\",\r\n\t\"MAL\",\r\n\t\"MAM\",\r\n\t\"MAN\",\r\n\t\"MAP\",\r\n\t\"MAR\",\r\n\t\"MAS\",\r\n\t\"MAT\",\r\n\t\"MAW\",\r\n\t\"MAX\",\r\n\t\"MAY\",\r\n\t\"ME\",\r\n\t\"MED\",\r\n\t\"MEE\",\r\n\t\"MEG\",\r\n\t\"MEH\",\r\n\t\"MEL\",\r\n\t\"MEM\",\r\n\t\"MEN\",\r\n\t\"MES\",\r\n\t\"MET\",\r\n\t\"MEU\",\r\n\t\"MEW\",\r\n\t\"MHO\",\r\n\t\"MI\",\r\n\t\"MIB\",\r\n\t\"MIC\",\r\n\t\"MID\",\r\n\t\"MIG\",\r\n\t\"MIL\",\r\n\t\"MIM\",\r\n\t\"MIR\",\r\n\t\"MIS\",\r\n\t\"MIX\",\r\n\t\"MIZ\",\r\n\t\"MM\",\r\n\t\"MNA\",\r\n\t\"MO\",\r\n\t\"MOA\",\r\n\t\"MOB\",\r\n\t\"MOC\",\r\n\t\"MOD\",\r\n\t\"MOE\",\r\n\t\"MOG\",\r\n\t\"MOI\",\r\n\t\"MOL\",\r\n\t\"MOM\",\r\n\t\"MON\",\r\n\t\"MOO\",\r\n\t\"MOP\",\r\n\t\"MOR\",\r\n\t\"MOS\",\r\n\t\"MOT\",\r\n\t\"MOU\",\r\n\t\"MOW\",\r\n\t\"MOY\",\r\n\t\"MOZ\",\r\n\t\"MU\",\r\n\t\"MUD\",\r\n\t\"MUG\",\r\n\t\"MUM\",\r\n\t\"MUN\",\r\n\t\"MUS\",\r\n\t\"MUT\",\r\n\t\"MUX\",\r\n\t\"MY\",\r\n\t\"MYC\",\r\n\t\"NA\",\r\n\t\"NAB\",\r\n\t\"NAE\",\r\n\t\"NAG\",\r\n\t\"NAH\",\r\n\t\"NAM\",\r\n\t\"NAN\",\r\n\t\"NAP\",\r\n\t\"NAS\",\r\n\t\"NAT\",\r\n\t\"NAW\",\r\n\t\"NAY\",\r\n\t\"NE\",\r\n\t\"NEB\",\r\n\t\"NED\",\r\n\t\"NEE\",\r\n\t\"NEF\",\r\n\t\"NEG\",\r\n\t\"NEK\",\r\n\t\"NEP\",\r\n\t\"NET\",\r\n\t\"NEW\",\r\n\t\"NIB\",\r\n\t\"NID\",\r\n\t\"NIE\",\r\n\t\"NIL\",\r\n\t\"NIM\",\r\n\t\"NIP\",\r\n\t\"NIS\",\r\n\t\"NIT\",\r\n\t\"NIX\",\r\n\t\"NO\",\r\n\t\"NOD\",\r\n\t\"NOG\",\r\n\t\"NOH\",\r\n\t\"NOM\",\r\n\t\"NON\",\r\n\t\"NOO\",\r\n\t\"NOR\",\r\n\t\"NOS\",\r\n\t\"NOT\",\r\n\t\"NOW\",\r\n\t\"NOX\",\r\n\t\"NOY\",\r\n\t\"NTH\",\r\n\t\"NU\",\r\n\t\"NUB\",\r\n\t\"NUN\",\r\n\t\"NUR\",\r\n\t\"NUS\",\r\n\t\"NUT\",\r\n\t\"NY\",\r\n\t\"NYE\",\r\n\t\"NYS\",\r\n\t\"OAF\",\r\n\t\"OAK\",\r\n\t\"OAR\",\r\n\t\"OAT\",\r\n\t\"OB\",\r\n\t\"OBA\",\r\n\t\"OBE\",\r\n\t\"OBI\",\r\n\t\"OBO\",\r\n\t\"OBS\",\r\n\t\"OCA\",\r\n\t\"OCH\",\r\n\t\"OD\",\r\n\t\"ODA\",\r\n\t\"ODD\",\r\n\t\"ODE\",\r\n\t\"ODS\",\r\n\t\"OE\",\r\n\t\"OES\",\r\n\t\"OF\",\r\n\t\"OFF\",\r\n\t\"OFT\",\r\n\t\"OH\",\r\n\t\"OHM\",\r\n\t\"OHO\",\r\n\t\"OHS\",\r\n\t\"OI\",\r\n\t\"OIK\",\r\n\t\"OIL\",\r\n\t\"OIS\",\r\n\t\"OKA\",\r\n\t\"OKE\",\r\n\t\"OLD\",\r\n\t\"OLE\",\r\n\t\"OLM\",\r\n\t\"OM\",\r\n\t\"OMS\",\r\n\t\"ON\",\r\n\t\"ONE\",\r\n\t\"ONO\",\r\n\t\"ONS\",\r\n\t\"ONY\",\r\n\t\"OO\",\r\n\t\"OOF\",\r\n\t\"OOH\",\r\n\t\"OOM\",\r\n\t\"OON\",\r\n\t\"OOP\",\r\n\t\"OOR\",\r\n\t\"OOS\",\r\n\t\"OOT\",\r\n\t\"OP\",\r\n\t\"OPE\",\r\n\t\"OPS\",\r\n\t\"OPT\",\r\n\t\"OR\",\r\n\t\"ORA\",\r\n\t\"ORB\",\r\n\t\"ORC\",\r\n\t\"ORD\",\r\n\t\"ORE\",\r\n\t\"ORF\",\r\n\t\"ORS\",\r\n\t\"ORT\",\r\n\t\"OS\",\r\n\t\"OSE\",\r\n\t\"OU\",\r\n\t\"OUD\",\r\n\t\"OUK\",\r\n\t\"OUP\",\r\n\t\"OUR\",\r\n\t\"OUS\",\r\n\t\"OUT\",\r\n\t\"OVA\",\r\n\t\"OW\",\r\n\t\"OWE\",\r\n\t\"OWL\",\r\n\t\"OWN\",\r\n\t\"OWT\",\r\n\t\"OX\",\r\n\t\"OXO\",\r\n\t\"OXY\",\r\n\t\"OY\",\r\n\t\"OYE\",\r\n\t\"OYS\",\r\n\t\"PA\",\r\n\t\"PAC\",\r\n\t\"PAD\",\r\n\t\"PAH\",\r\n\t\"PAL\",\r\n\t\"PAM\",\r\n\t\"PAN\",\r\n\t\"PAP\",\r\n\t\"PAR\",\r\n\t\"PAS\",\r\n\t\"PAT\",\r\n\t\"PAV\",\r\n\t\"PAW\",\r\n\t\"PAX\",\r\n\t\"PAY\",\r\n\t\"PE\",\r\n\t\"PEA\",\r\n\t\"PEC\",\r\n\t\"PED\",\r\n\t\"PEE\",\r\n\t\"PEG\",\r\n\t\"PEH\",\r\n\t\"PEL\",\r\n\t\"PEN\",\r\n\t\"PEP\",\r\n\t\"PER\",\r\n\t\"PES\",\r\n\t\"PET\",\r\n\t\"PEW\",\r\n\t\"PHI\",\r\n\t\"PHO\",\r\n\t\"PHT\",\r\n\t\"PI\",\r\n\t\"PIA\",\r\n\t\"PIC\",\r\n\t\"PIE\",\r\n\t\"PIG\",\r\n\t\"PIN\",\r\n\t\"PIP\",\r\n\t\"PIR\",\r\n\t\"PIS\",\r\n\t\"PIT\",\r\n\t\"PIU\",\r\n\t\"PIX\",\r\n\t\"PLU\",\r\n\t\"PLY\",\r\n\t\"PO\",\r\n\t\"POA\",\r\n\t\"POD\",\r\n\t\"POH\",\r\n\t\"POI\",\r\n\t\"POL\",\r\n\t\"POM\",\r\n\t\"POO\",\r\n\t\"POP\",\r\n\t\"POS\",\r\n\t\"POT\",\r\n\t\"POW\",\r\n\t\"POX\",\r\n\t\"POZ\",\r\n\t\"PRE\",\r\n\t\"PRO\",\r\n\t\"PRY\",\r\n\t\"PSI\",\r\n\t\"PST\",\r\n\t\"PUB\",\r\n\t\"PUD\",\r\n\t\"PUG\",\r\n\t\"PUH\",\r\n\t\"PUL\",\r\n\t\"PUN\",\r\n\t\"PUP\",\r\n\t\"PUR\",\r\n\t\"PUS\",\r\n\t\"PUT\",\r\n\t\"PUY\",\r\n\t\"PYA\",\r\n\t\"PYE\",\r\n\t\"PYX\",\r\n\t\"QAT\",\r\n\t\"QI\",\r\n\t\"QIN\",\r\n\t\"QIS\",\r\n\t\"QUA\",\r\n\t\"RAD\",\r\n\t\"RAG\",\r\n\t\"RAH\",\r\n\t\"RAI\",\r\n\t\"RAJ\",\r\n\t\"RAM\",\r\n\t\"RAN\",\r\n\t\"RAP\",\r\n\t\"RAS\",\r\n\t\"RAT\",\r\n\t\"RAV\",\r\n\t\"RAW\",\r\n\t\"RAX\",\r\n\t\"RAY\",\r\n\t\"RE\",\r\n\t\"REB\",\r\n\t\"REC\",\r\n\t\"RED\",\r\n\t\"REE\",\r\n\t\"REF\",\r\n\t\"REG\",\r\n\t\"REH\",\r\n\t\"REI\",\r\n\t\"REM\",\r\n\t\"REN\",\r\n\t\"REO\",\r\n\t\"REP\",\r\n\t\"RES\",\r\n\t\"RET\",\r\n\t\"REV\",\r\n\t\"REW\",\r\n\t\"REX\",\r\n\t\"REZ\",\r\n\t\"RHO\",\r\n\t\"RHY\",\r\n\t\"RIA\",\r\n\t\"RIB\",\r\n\t\"RID\",\r\n\t\"RIF\",\r\n\t\"RIG\",\r\n\t\"RIM\",\r\n\t\"RIN\",\r\n\t\"RIP\",\r\n\t\"RIT\",\r\n\t\"RIZ\",\r\n\t\"ROB\",\r\n\t\"ROC\",\r\n\t\"ROD\",\r\n\t\"ROE\",\r\n\t\"ROK\",\r\n\t\"ROM\",\r\n\t\"ROO\",\r\n\t\"ROT\",\r\n\t\"ROW\",\r\n\t\"RUB\",\r\n\t\"RUC\",\r\n\t\"RUD\",\r\n\t\"RUE\",\r\n\t\"RUG\",\r\n\t\"RUM\",\r\n\t\"RUN\",\r\n\t\"RUT\",\r\n\t\"RYA\",\r\n\t\"RYE\",\r\n\t\"SAB\",\r\n\t\"SAC\",\r\n\t\"SAD\",\r\n\t\"SAE\",\r\n\t\"SAG\",\r\n\t\"SAI\",\r\n\t\"SAL\",\r\n\t\"SAM\",\r\n\t\"SAN\",\r\n\t\"SAP\",\r\n\t\"SAR\",\r\n\t\"SAT\",\r\n\t\"SAU\",\r\n\t\"SAV\",\r\n\t\"SAW\",\r\n\t\"SAX\",\r\n\t\"SAY\",\r\n\t\"SAZ\",\r\n\t\"SEA\",\r\n\t\"SEC\",\r\n\t\"SED\",\r\n\t\"SEE\",\r\n\t\"SEG\",\r\n\t\"SEI\",\r\n\t\"SEL\",\r\n\t\"SEN\",\r\n\t\"SER\",\r\n\t\"SET\",\r\n\t\"SEW\",\r\n\t\"SEY\",\r\n\t\"SEZ\",\r\n\t\"SH\",\r\n\t\"SHA\",\r\n\t\"SHE\",\r\n\t\"SHH\",\r\n\t\"SHY\",\r\n\t\"SI\",\r\n\t\"SIB\",\r\n\t\"SIC\",\r\n\t\"SIF\",\r\n\t\"SIK\",\r\n\t\"SIM\",\r\n\t\"SIN\",\r\n\t\"SIP\",\r\n\t\"SIR\",\r\n\t\"SIS\",\r\n\t\"SIT\",\r\n\t\"SIX\",\r\n\t\"SKA\",\r\n\t\"SKI\",\r\n\t\"SKY\",\r\n\t\"SLY\",\r\n\t\"SMA\",\r\n\t\"SNY\",\r\n\t\"SO\",\r\n\t\"SOB\",\r\n\t\"SOC\",\r\n\t\"SOD\",\r\n\t\"SOG\",\r\n\t\"SOH\",\r\n\t\"SOL\",\r\n\t\"SOM\",\r\n\t\"SON\",\r\n\t\"SOP\",\r\n\t\"SOS\",\r\n\t\"SOT\",\r\n\t\"SOU\",\r\n\t\"SOV\",\r\n\t\"SOW\",\r\n\t\"SOX\",\r\n\t\"SOY\",\r\n\t\"SOZ\",\r\n\t\"SPA\",\r\n\t\"SPY\",\r\n\t\"SRI\",\r\n\t\"ST\",\r\n\t\"STY\",\r\n\t\"SUB\",\r\n\t\"SUD\",\r\n\t\"SUE\",\r\n\t\"SUG\",\r\n\t\"SUI\",\r\n\t\"SUK\",\r\n\t\"SUM\",\r\n\t\"SUN\",\r\n\t\"SUP\",\r\n\t\"SUQ\",\r\n\t\"SUR\",\r\n\t\"SUS\",\r\n\t\"SWY\",\r\n\t\"SYE\",\r\n\t\"SYN\",\r\n\t\"TA\",\r\n\t\"TAB\",\r\n\t\"TAD\",\r\n\t\"TAE\",\r\n\t\"TAG\",\r\n\t\"TAI\",\r\n\t\"TAJ\",\r\n\t\"TAK\",\r\n\t\"TAM\",\r\n\t\"TAN\",\r\n\t\"TAO\",\r\n\t\"TAP\",\r\n\t\"TAR\",\r\n\t\"TAS\",\r\n\t\"TAT\",\r\n\t\"TAU\",\r\n\t\"TAV\",\r\n\t\"TAW\",\r\n\t\"TAX\",\r\n\t\"TAY\",\r\n\t\"TE\",\r\n\t\"TEA\",\r\n\t\"TEC\",\r\n\t\"TED\",\r\n\t\"TEE\",\r\n\t\"TEF\",\r\n\t\"TEG\",\r\n\t\"TEL\",\r\n\t\"TEN\",\r\n\t\"TES\",\r\n\t\"TET\",\r\n\t\"TEW\",\r\n\t\"TEX\",\r\n\t\"THE\",\r\n\t\"THO\",\r\n\t\"THY\",\r\n\t\"TI\",\r\n\t\"TIC\",\r\n\t\"TID\",\r\n\t\"TIE\",\r\n\t\"TIG\",\r\n\t\"TIK\",\r\n\t\"TIL\",\r\n\t\"TIN\",\r\n\t\"TIP\",\r\n\t\"TIS\",\r\n\t\"TIX\",\r\n\t\"TO\",\r\n\t\"TOC\",\r\n\t\"TOD\",\r\n\t\"TOE\",\r\n\t\"TOG\",\r\n\t\"TOM\",\r\n\t\"TON\",\r\n\t\"TOO\",\r\n\t\"TOP\",\r\n\t\"TOR\",\r\n\t\"TOT\",\r\n\t\"TOW\",\r\n\t\"TOY\",\r\n\t\"TRY\",\r\n\t\"TSK\",\r\n\t\"TUB\",\r\n\t\"TUG\",\r\n\t\"TUI\",\r\n\t\"TUM\",\r\n\t\"TUN\",\r\n\t\"TUP\",\r\n\t\"TUT\",\r\n\t\"TUX\",\r\n\t\"TWA\",\r\n\t\"TWO\",\r\n\t\"TWP\",\r\n\t\"TYE\",\r\n\t\"TYG\",\r\n\t\"UDO\",\r\n\t\"UDS\",\r\n\t\"UEY\",\r\n\t\"UFO\",\r\n\t\"UG\",\r\n\t\"UGH\",\r\n\t\"UGS\",\r\n\t\"UH\",\r\n\t\"UKE\",\r\n\t\"ULE\",\r\n\t\"ULU\",\r\n\t\"UM\",\r\n\t\"UMM\",\r\n\t\"UMP\",\r\n\t\"UMS\",\r\n\t\"UMU\",\r\n\t\"UN\",\r\n\t\"UNI\",\r\n\t\"UNS\",\r\n\t\"UP\",\r\n\t\"UPO\",\r\n\t\"UPS\",\r\n\t\"UR\",\r\n\t\"URB\",\r\n\t\"URD\",\r\n\t\"URE\",\r\n\t\"URN\",\r\n\t\"URP\",\r\n\t\"US\",\r\n\t\"USE\",\r\n\t\"UT\",\r\n\t\"UTA\",\r\n\t\"UTE\",\r\n\t\"UTS\",\r\n\t\"UTU\",\r\n\t\"UVA\",\r\n\t\"VAC\",\r\n\t\"VAE\",\r\n\t\"VAG\",\r\n\t\"VAN\",\r\n\t\"VAR\",\r\n\t\"VAS\",\r\n\t\"VAT\",\r\n\t\"VAU\",\r\n\t\"VAV\",\r\n\t\"VAW\",\r\n\t\"VEE\",\r\n\t\"VEG\",\r\n\t\"VET\",\r\n\t\"VEX\",\r\n\t\"VIA\",\r\n\t\"VID\",\r\n\t\"VIE\",\r\n\t\"VIG\",\r\n\t\"VIM\",\r\n\t\"VIN\",\r\n\t\"VIS\",\r\n\t\"VLY\",\r\n\t\"VOE\",\r\n\t\"VOL\",\r\n\t\"VOR\",\r\n\t\"VOW\",\r\n\t\"VOX\",\r\n\t\"VUG\",\r\n\t\"VUM\",\r\n\t\"WAB\",\r\n\t\"WAD\",\r\n\t\"WAE\",\r\n\t\"WAG\",\r\n\t\"WAI\",\r\n\t\"WAN\",\r\n\t\"WAP\",\r\n\t\"WAR\",\r\n\t\"WAS\",\r\n\t\"WAT\",\r\n\t\"WAW\",\r\n\t\"WAX\",\r\n\t\"WAY\",\r\n\t\"WE\",\r\n\t\"WEB\",\r\n\t\"WED\",\r\n\t\"WEE\",\r\n\t\"WEM\",\r\n\t\"WEN\",\r\n\t\"WET\",\r\n\t\"WEX\",\r\n\t\"WEY\",\r\n\t\"WHA\",\r\n\t\"WHO\",\r\n\t\"WHY\",\r\n\t\"WIG\",\r\n\t\"WIN\",\r\n\t\"WIS\",\r\n\t\"WIT\",\r\n\t\"WIZ\",\r\n\t\"WO\",\r\n\t\"WOE\",\r\n\t\"WOF\",\r\n\t\"WOG\",\r\n\t\"WOK\",\r\n\t\"WON\",\r\n\t\"WOO\",\r\n\t\"WOP\",\r\n\t\"WOS\",\r\n\t\"WOT\",\r\n\t\"WOW\",\r\n\t\"WOX\",\r\n\t\"WRY\",\r\n\t\"WUD\",\r\n\t\"WUS\",\r\n\t\"WYE\",\r\n\t\"WYN\",\r\n\t\"XI\",\r\n\t\"XIS\",\r\n\t\"XU\",\r\n\t\"YA\",\r\n\t\"YAD\",\r\n\t\"YAE\",\r\n\t\"YAG\",\r\n\t\"YAH\",\r\n\t\"YAK\",\r\n\t\"YAM\",\r\n\t\"YAP\",\r\n\t\"YAR\",\r\n\t\"YAW\",\r\n\t\"YAY\",\r\n\t\"YE\",\r\n\t\"YEA\",\r\n\t\"YEH\",\r\n\t\"YEN\",\r\n\t\"YEP\",\r\n\t\"YES\",\r\n\t\"YET\",\r\n\t\"YEW\",\r\n\t\"YEX\",\r\n\t\"YGO\",\r\n\t\"YID\",\r\n\t\"YIN\",\r\n\t\"YIP\",\r\n\t\"YO\",\r\n\t\"YOB\",\r\n\t\"YOD\",\r\n\t\"YOK\",\r\n\t\"YOM\",\r\n\t\"YON\",\r\n\t\"YOU\",\r\n\t\"YOW\",\r\n\t\"YU\",\r\n\t\"YUG\",\r\n\t\"YUK\",\r\n\t\"YUM\",\r\n\t\"YUP\",\r\n\t\"YUS\",\r\n\t\"ZA\",\r\n\t\"ZAG\",\r\n\t\"ZAP\",\r\n\t\"ZAS\",\r\n\t\"ZAX\",\r\n\t\"ZEA\",\r\n\t\"ZED\",\r\n\t\"ZEE\",\r\n\t\"ZEK\",\r\n\t\"ZEL\",\r\n\t\"ZEP\",\r\n\t\"ZEX\",\r\n\t\"ZHO\",\r\n\t\"ZIG\",\r\n\t\"ZIN\",\r\n\t\"ZIP\",\r\n\t\"ZIT\",\r\n\t\"ZIZ\",\r\n\t\"ZO\",\r\n\t\"ZOA\",\r\n\t\"ZOL\",\r\n\t\"ZOO\",\r\n\t\"ZOS\",\r\n\t\"ZUZ\",\r\n\t\"ZZZ\",\r\n]","\"use strict\";\r\n\r\nconst toTitleCase = (str) => {\r\n return str.toLowerCase().replace(/\\b\\w/g, l => l.toUpperCase());\r\n}\r\n\r\nconst capitalizeRegexp = new RegExp(\"(?!(\"+excludeWords.join(\"|\")+\"))(\\\\b[A-Z]{2,3}\\\\b)\", \"gi\");\r\nconst capitalizeAbbreviations = (text) => {\r\n //capitalize Abbreviations\r\n return text.replace(\r\n capitalizeRegexp,\r\n function(txt) {\r\n return txt.toUpperCase();\r\n }\r\n );\r\n}\r\nmodule IdMgr {\r\n\r\n export function YesNo() {\r\n return function (input): string {\r\n return input ? \"Yes\" : \"No\";\r\n }\r\n }\r\n\r\n export function BuySell() {\r\n return function (input): string {\r\n if (input == 'B') {\r\n return 'Buy'\r\n }\r\n else if (input == 'S') {\r\n return 'Sell'\r\n }\r\n else {\r\n return input\r\n }\r\n }\r\n }\r\n\r\n export function NotBefore() { \r\n return function (items, field, notBeforeDate) { \r\n\r\n var filtered = [];\r\n angular.forEach(items, function (item) { \r\n if (moment(item[field]).isAfter(notBeforeDate)) {\r\n filtered.push(item);\r\n }\r\n });\r\n return filtered;\r\n }\r\n }\r\n\r\n export function NotAfter() {\r\n return function (items, field, notAfterDate) {\r\n\r\n var filtered = [];\r\n angular.forEach(items, function (item) {\r\n if (moment(item[field]).isBefore(notAfterDate)) {\r\n filtered.push(item);\r\n }\r\n });\r\n return filtered;\r\n }\r\n }\r\n\r\n export function DateFilter() {\r\n return function(items, key, from, to) {\r\n if (!items) {\r\n return null;\r\n }\r\n var df = moment(from);\r\n var dt = moment(to);\r\n var result = [];\r\n for (var i = 0; i < items.length; i++) {\r\n var item = items[i];\r\n var itemDateRaw = item[key];\r\n var itemDate = moment(itemDateRaw);\r\n\r\n if (itemDate.isSameOrAfter(df) && itemDate.isSameOrBefore(dt)) {\r\n result.push(item);\r\n }\r\n }\r\n return result;\r\n }\r\n }\r\n\r\n export function AccountName() {\r\n return function (input): string {\r\n return capitalizeAbbreviations(toTitleCase(input));\r\n }\r\n }\r\n\r\n export function TitleCase() {\r\n return function (items, filterOn) {\r\n if (filterOn === false) {\r\n return items;\r\n }\r\n if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {\r\n angular.forEach(items, function (item) {\r\n for (var i = 0; i < items.length; i++) {\r\n items[i][filterOn] = items[i][filterOn].replace(/\\w\\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();})\r\n }\r\n })\r\n }\r\n return items;\r\n }\r\n }\r\n\r\n export function Unique() {\r\n\r\n return function (items, filterOn) {\r\n\r\n if (filterOn === false) {\r\n return items;\r\n }\r\n\r\n if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {\r\n var hashCheck = {}, newItems = [];\r\n\r\n var extractValueToCompare = function (item) {\r\n if (angular.isObject(item) && angular.isString(filterOn)) {\r\n return item[filterOn];\r\n } else {\r\n return item;\r\n }\r\n };\r\n\r\n angular.forEach(items, function (item) {\r\n var valueToCheck, isDuplicate = false;\r\n\r\n for (var i = 0; i < newItems.length; i++) {\r\n if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {\r\n isDuplicate = true;\r\n break;\r\n }\r\n }\r\n if (!isDuplicate) {\r\n newItems.push(item);\r\n }\r\n\r\n });\r\n items = newItems;\r\n }\r\n return items;\r\n }\r\n };\r\n\r\n export function Percent() {\r\n return function (input, precision): string {\r\n precision = precision || 0;\r\n return (input || 0.0).toFixed(precision) + \"%\";\r\n }\r\n }\r\n\r\n export function PlusMinus() {\r\n return function (input): string {\r\n return input >= 0 ? \"+\" : \"\";\r\n }\r\n }\r\n\r\n export function StripHtml() {\r\n return function (input): string {\r\n return input ? String(input).replace(/<[^>]+>/gm, '') : '';\r\n }\r\n }\r\n\r\n export function ForAccountType() {\r\n return function (reportTypes, accountType: string): Array {\r\n var filteredList = [];\r\n angular.forEach(reportTypes, function (reportType, key) {\r\n if (accountType === \"Accolade\" || accountType === reportType.accountType) {\r\n filteredList.push(reportType);\r\n }\r\n });\r\n return filteredList;\r\n }\r\n }\r\n\r\n export function Abs() {\r\n return function (input: number): number {\r\n if (input === null || input === undefined) {\r\n return input;\r\n } else {\r\n return Math.abs(input);\r\n }\r\n }\r\n }\r\n\r\n export function ConvertNegative() {\r\n return function (input): string {\r\n if (input && input.indexOf(\"-\") === 0) {\r\n input = String(input).replace('-', '');\r\n let openingParethensis = \"(\";\r\n input = openingParethensis.concat(input, \")\");\r\n }\r\n return input;\r\n }\r\n }\r\n}\r\n\r\nvar filtersModule = angular.module(\"app.filters\", []);\r\nfiltersModule.filter(\"yesNo\", IdMgr.YesNo);\r\nfiltersModule.filter(\"buySell\", IdMgr.BuySell);\r\nfiltersModule.filter(\"notBefore\", IdMgr.NotBefore);\r\nfiltersModule.filter(\"notAfter\", IdMgr.NotAfter);\r\nfiltersModule.filter(\"unique\", IdMgr.Unique);\r\nfiltersModule.filter(\"dateFilter\", IdMgr.DateFilter);\r\nfiltersModule.filter(\"percent\", IdMgr.Percent);\r\nfiltersModule.filter(\"plusMinus\", IdMgr.PlusMinus);\r\nfiltersModule.filter(\"stripHtml\", IdMgr.StripHtml);\r\nfiltersModule.filter(\"forAccountType\", IdMgr.ForAccountType);\r\nfiltersModule.filter(\"abs\", IdMgr.Abs);\r\nfiltersModule.filter(\"titleCase\", IdMgr.TitleCase);\r\nfiltersModule.filter(\"accountName\", IdMgr.AccountName);\r\nfiltersModule.filter(\"convertNegative\", IdMgr.ConvertNegative);\r\n\r\n","'use strict';\r\n\r\ndeclare var pdfMake: any;\r\n\r\nmodule Patersons {\r\n\r\n export enum PdfFormatHint {\r\n None = 0,\r\n Currency,\r\n Currency4decPts,\r\n }\r\n\r\n class HeaderTable {\r\n public content: any;\r\n private rows: any[];\r\n\r\n constructor() {\r\n this.content = {\r\n style: { fontSize: 8 },\r\n margin: [-4, 8, 0, 5],\r\n table: {\r\n widths: ['auto', '*', 'auto', 'auto'],\r\n body: []\r\n }\r\n }\r\n }\r\n\r\n public addRow(nameLeft: string, valueLeft: string, nameRight: string, valueRight: string): HeaderTable {\r\n this.content.table.body.push([\r\n { border: [false, false, false, false], text: nameLeft, style: { bold: true, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: valueLeft, style: { bold: false, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: nameRight, style: { bold: true, alignment: 'right', fontSize: 8 } },\r\n { border: [false, false, false, false], text: valueRight, style: { bold: false, alignment: 'right', fontSize: 8.5 } }]\r\n );\r\n\r\n return this;\r\n }\r\n }\r\n\r\n class PdfTable {\r\n private tableTitle: any;\r\n private tableBody: any;\r\n private tableFooter: any;\r\n\r\n constructor(private userCompany: UserCompany){\r\n\r\n }\r\n\r\n public setTitle(titleText: string): PdfTable {\r\n let headerStyle: string = titleText ? 'filledHeader' : '';\r\n this.tableTitle = {\r\n style: \"tableTitle\",\r\n table: {\r\n widths: ['*'],\r\n body: [[{ text: titleText, style: headerStyle }]]\r\n },\r\n layout: 'noBorders'\r\n };\r\n return this;\r\n }\r\n\r\n public setNormalText(titleText: string): PdfTable {\r\n this.tableTitle = {\r\n table: {\r\n widths: ['*'],\r\n body: [[{ text: titleText }]]\r\n },\r\n layout: 'noBorders'\r\n };\r\n return this;\r\n }\r\n\r\n public setContent(dataRows: any[], fieldnames: string[], headings: string[], formatHints?: PdfFormatHint[], lastRowIsFooter?: boolean) {\r\n /*if (fieldnames.length !== headings.length) {\r\n throw new RangeError('Number of headings should match number of fields in the table.');\r\n }\r\n\r\n if (formatHints !== null && formatHints !== undefined && fieldnames.length !== formatHints.length) {\r\n throw new RangeError('Number of format hints should match number of fields in the table.');\r\n }*/\r\n\r\n let headerRow: any[];\r\n let content: any[][] = [];\r\n\r\n if (headings != null){\r\n headerRow = this.buildHeadings(headings);\r\n content.push(headerRow);\r\n }\r\n\r\n let bodyRows: any[][] = this.buildBody(dataRows, fieldnames, formatHints, lastRowIsFooter);\r\n content = content.concat(bodyRows);\r\n\r\n let columnWidths: string[] = this.calculateColumnWidths(fieldnames.length, content, lastRowIsFooter);\r\n if (content)\r\n this.tableBody = {\r\n layout: this.getTableLayout(headings, lastRowIsFooter),\r\n table: {\r\n widths: columnWidths,\r\n headerRows: 1,\r\n body: content\r\n }\r\n };\r\n\r\n return this;\r\n }\r\n\r\n getTableLayout(headings: any, lastRowIsFooter: boolean){\r\n if (headings && lastRowIsFooter){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 1 || i === node.table.body.length - 1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineWidth: function(i, node) {\r\n return 0;\r\n }\r\n }\r\n }\r\n if (!lastRowIsFooter){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineWidth: function(i, node) {\r\n return 0;\r\n }\r\n }\r\n }\r\n else {\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n hLineColor: function(i, node) {\r\n if (i === node.table.body.length-1) { return 'lightgray'; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineWidth: function(i, node) {\r\n return 0;\r\n }\r\n }\r\n }\r\n }\r\n\r\n public setContentAligned(dataRows: any[], fieldnames: string[], headings: any[], formatHints?: PdfFormatHint[], lastRowIsFooter?: boolean) {\r\n /*if (fieldnames.length !== headings.length) {\r\n throw new RangeError('Number of headings should match number of fields in the table.');\r\n }\r\n\r\n if (formatHints !== undefined && fieldnames.length !== formatHints.length) {\r\n throw new RangeError('Number of format hints should match number of fields in the table.');\r\n }*/\r\n\r\n let headerRow: any[];\r\n let content: any[][] = [];\r\n\r\n if (headings != null) {\r\n headerRow = this.buildHeadingsAligned(headings);\r\n content.push(headerRow);\r\n }\r\n\r\n let bodyRows: any[][] = this.buildBody(dataRows, fieldnames, formatHints, lastRowIsFooter);\r\n content = content.concat(bodyRows);\r\n\r\n let columnWidths: string[] = this.calculateColumnWidths(fieldnames.length, content, lastRowIsFooter);\r\n if (content)\r\n this.tableBody = {\r\n layout: this.getTableLayout(headings, lastRowIsFooter),\r\n table: {\r\n widths: columnWidths,\r\n headerRows: 1,\r\n body: content\r\n }\r\n };\r\n\r\n return this;\r\n }\r\n\r\n public hasTitle(): boolean {\r\n return this.tableTitle !== undefined;\r\n }\r\n\r\n public hasBody(): boolean {\r\n return this.tableBody !== undefined;\r\n }\r\n\r\n public getTitle(): any {\r\n return this.tableTitle;\r\n }\r\n\r\n public getBody(): any {\r\n return this.tableBody;\r\n }\r\n\r\n private buildHeadings(headings: string[]): any[] {\r\n let headerRow = [];\r\n for (let heading of headings) {\r\n headerRow.push({ border: [false, false, false, true], text: heading, style: 'tableHeader' });\r\n }\r\n return headerRow;\r\n }\r\n\r\n private buildHeadingsAligned(headings: any[]): any[] {\r\n let headerRow = [];\r\n for (let heading of headings) {\r\n if (heading.type === \"number\")\r\n headerRow.push({ border: [false, false, false, true], text: heading.text, style: 'tableHeaderNumeric' });\r\n else\r\n headerRow.push({ border: [false, false, false, true], text: heading.text, style: 'tableHeader' });\r\n }\r\n return headerRow;\r\n }\r\n\r\n private buildBody(dataRows: any[], fieldnames: string[], formatHints?: PdfFormatHint[], lastRowIsFooter?: boolean): any[][] {\r\n let tableContent: any[][] = [];\r\n for (let i = 0; i < dataRows.length; i++) {\r\n let dataRow = dataRows[i];\r\n let tableRow: any[] = [];\r\n for (let j = 0; j < fieldnames.length; j++) {\r\n let field: string = fieldnames[j];\r\n let formatHint: PdfFormatHint = (formatHints !== undefined && formatHints != null) ? formatHints[j] : PdfFormatHint.None;\r\n let isFooterRow: boolean = lastRowIsFooter && i === dataRows.length - 1;\r\n if (isFooterRow) {\r\n if (j === 0) { //override first column label to be 'Total'\r\n dataRow[field] = \"Total\";\r\n formatHint = PdfFormatHint.None;\r\n }\r\n tableRow.push(this.buildTableFooterCell(dataRow[field], formatHint));\r\n } else {\r\n tableRow.push(this.buildTableCell(dataRow[field], formatHint));\r\n }\r\n }\r\n tableContent.push(tableRow);\r\n }\r\n return tableContent;\r\n }\r\n\r\n private buildTableCell(dataField: any, formatHint: PdfFormatHint): any {\r\n let cell: any = {\r\n border: [false, false, false, true],\r\n text: this.interpretFormatHint(dataField, formatHint),\r\n style: 'tableCell'\r\n };\r\n\r\n if (typeof dataField === 'number') {\r\n cell.style = 'tableCellNumeric';\r\n }\r\n\r\n return cell;\r\n }\r\n private buildTableFooterCell(dataField: any, formatHint: PdfFormatHint): any {\r\n if (!dataField) {\r\n dataField = \"\";\r\n }\r\n let cell: any = {\r\n text: this.interpretFormatHint(dataField, formatHint),\r\n \"border\": [false, true, false, false],\r\n style: 'footerCell'\r\n };\r\n\r\n if (typeof dataField === 'number') {\r\n cell.style = 'footerCellNumeric';\r\n }\r\n\r\n return cell;\r\n }\r\n\r\n private interpretFormatHint(dataField: any, formatHint: PdfFormatHint): string {\r\n if (!dataField) return \"\";\r\n\r\n switch (formatHint) {\r\n case PdfFormatHint.None:\r\n return dataField.toString();\r\n case PdfFormatHint.Currency:\r\n return this.formatAsCurrency(dataField);\r\n case PdfFormatHint.Currency4decPts:\r\n return this.formatAsCurrency4DecPts(dataField);\r\n default:\r\n return this.toString();\r\n }\r\n }\r\n\r\n addCommas(nStr): string {\r\n nStr = nStr + '';\r\n var x = nStr.split('.');\r\n var x1 = x[0];\r\n var x2 = x.length > 1 ? '.' + x[1] : '';\r\n var rgx = /(\\d+)(\\d{3})/;\r\n while (rgx.test(x1)) {\r\n x1 = x1.replace(rgx, '$1' + ',' + '$2');\r\n }\r\n return x1 + x2;\r\n }\r\n\r\n private formatAsCurrency4DecPts(amount: any): string {\r\n /*if (value === null || value === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return value.toFixed(2);\r\n } else {\r\n return value;\r\n }*/\r\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\r\n return '';\r\n }\r\n return amount.toFixed(4).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,');\r\n\r\n }\r\n private formatAsCurrency(amount: any): string {\r\n /*if (value === null || value === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (typeof value === 'number') {\r\n return value.toFixed(2);\r\n } else {\r\n return value;\r\n }*/\r\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\r\n return '';\r\n }\r\n var i: number = parseFloat(amount);\r\n if (isNaN(i)) {\r\n i = 0.00;\r\n }\r\n var minus = '';\r\n if (i < 0) { minus = '-'; }\r\n i = Math.abs(i);\r\n i = parseInt(((i + .005) * 100).toString());\r\n i = i / 100;\r\n var s = i.toString();\r\n if (s.indexOf('.') < 0) { s += '.00'; }\r\n if (s.indexOf('.') === (s.length - 2)) { s += '0'; }\r\n s = minus + s;\r\n return this.addCommas(s);\r\n }\r\n\r\n private calculateColumnWidths(numberOfColumns: number, tableContent: any[][], lastRowIsFooter?: boolean): string[] {\r\n let columnWidths: string[] = this.initialiseColumnWidths(numberOfColumns);\r\n\r\n let widestColumn: number = 0;\r\n for (let rowIndex = 0; rowIndex < tableContent.length; rowIndex++) {\r\n let row = tableContent[rowIndex];\r\n if (lastRowIsFooter && rowIndex === tableContent.length - 1) { //do not use footer row as part of the width calculation\r\n continue;\r\n }\r\n for (let i = 0; i < row.length; i++) {\r\n if (row[i].text && row[widestColumn].text){\r\n if (row[i].text.length > row[widestColumn].text.length) {\r\n widestColumn = i;\r\n }\r\n }\r\n }\r\n }\r\n\r\n columnWidths[widestColumn] = '*';\r\n\r\n return columnWidths;\r\n }\r\n\r\n private initialiseColumnWidths(numberOfColumns: number): string[] {\r\n return Array.apply(null, Array(numberOfColumns)).map(v => 'auto');\r\n }\r\n }\r\n\r\n export class PdfBuilder {\r\n public docDefinition: any;\r\n private filename: string;\r\n private titleText: string;\r\n private subTitleText: string;\r\n private headings: string[];\r\n private tables: PdfTable[];\r\n private headerTable: HeaderTable;\r\n public styles : any;\r\n public base64logo : any;\r\n private footer: string[];\r\n public userCompany: UserCompany;\r\n\r\n constructor(base64logo:string, userCompany: UserCompany) {\r\n this.filename = this.generateDefaultFilename();\r\n this.headings = new Array();\r\n this.footer = new Array();\r\n this.tables = new Array();\r\n this.headerTable = new HeaderTable();\r\n this.base64logo = base64logo;\r\n this.userCompany = userCompany;\r\n this.styles = {\r\n logo: {\r\n margin: [0, 0, 0, 10],\r\n alignment: 'right'\r\n },\r\n tableTitle: {\r\n fontSize: 8,\r\n margin: [0, 15, 0, 0]\r\n },\r\n header: {\r\n fontSize: 16,\r\n bold: false,\r\n margin: [0, 0, 0, 0],\r\n color: userCompany.colorSecondary\r\n },\r\n filledSubHeader: {\r\n bold: true,\r\n fontSize: 8,\r\n color: 'black',\r\n fillColor: '#D8D8D8',\r\n margin: [5, 2, 2, 2],\r\n alignment: 'left'\r\n },\r\n subHeader: {\r\n fontSize: 13,\r\n bold: false,\r\n margin: [0, 5, 0, 10],\r\n color: userCompany.colorSecondary\r\n },\r\n headerText: {\r\n margin: [0, 0, 0, 3],\r\n fontSize: 6,\r\n },\r\n footerText: {\r\n fontSize: 5,\r\n bold: false,\r\n alignment: 'center'\r\n },\r\n tableHeader: {\r\n fontSize: 8,\r\n bold: true,\r\n color: userCompany.colorSecondary,\r\n //margin: [2, 5, 0, 10],\r\n },\r\n tableHeaderNumeric: {\r\n fontSize: 8,\r\n bold: true,\r\n color: userCompany.colorSecondary,\r\n alignment: 'right'\r\n //margin: [2, 5, 0, 10],\r\n },\r\n filledHeader: {\r\n bold: true,\r\n fontSize: 8,\r\n color: 'white',\r\n fillColor: userCompany.colorSecondary,\r\n margin: [5, 2, 2, 2],\r\n alignment: 'left'\r\n },\r\n filledHoldingsHeader: {\r\n bold: true,\r\n fontSize: 8,\r\n color: 'black',\r\n fillColor: 'lightgray',\r\n margin: [10, 2, 2, 2],\r\n },\r\n footerCell: {\r\n bold: true,\r\n border: [false, false, false, false],\r\n fontSize: 8,\r\n alignment: 'left'\r\n },\r\n tableCell: {\r\n fontSize: 8,\r\n margin: [0, 0, 0, 0],\r\n alignment: 'left'\r\n },\r\n tableCellBold: {\r\n fontSize: 8,\r\n bold: true,\r\n margin: [0, 0, 0, 0],\r\n alignment: 'left'\r\n },\r\n tableCellNumeric: {\r\n fontSize: 8,\r\n margin: [0, 0, 0, 0],\r\n alignment: 'right'\r\n },\r\n footerCellNumeric: {\r\n bold: true,\r\n border: [false, false, false, false],\r\n fontSize: 8,\r\n alignment: 'right'\r\n },\r\n numericValue: {\r\n alignment: 'right'\r\n }\r\n };\r\n\r\n this.docDefinition = {\r\n pageSize: 'A4',\r\n pageOrientation: 'landscape',\r\n pageMargins: [ 56, 28, 56, 70 ],\r\n style: { font: 'arial' },\r\n content: [\r\n this.getImageContent()\r\n ],\r\n styles: this.styles,\r\n footer: function(currentPage, pageCount, pageSize) {\r\n var footerPDF = userCompany && userCompany.footerPDF;\r\n var footerDisclaimerItems = [];\r\n if(footerPDF){\r\n var $elem = $(\"
\" + footerPDF + \"
\");\r\n $(\"p\", $elem).each(function(){\r\n footerDisclaimerItems.push({\r\n text: $(this).text(),\r\n style: 'footerText'\r\n })\r\n })\r\n }\r\n var footer: any = [\r\n {\r\n \"fontSize\": 1,\r\n margin: [56, 0, 56, 5],\r\n layout: {\r\n hLineColor: function(i, node) {\r\n return 'lightgray';\r\n }\r\n },\r\n \"table\":{\r\n \"widths\":[\"*\"],\r\n \"headerRows\": 1,\r\n \"body\":\r\n [\r\n [\r\n {\"border\": [false, false, false, true], \"text\":\" \",\"alignment\":\"left\"},\r\n ],\r\n ]\r\n }\r\n },\r\n ]\r\n footer = footer.concat(footerDisclaimerItems)\r\n footer.push({\r\n margin: [56, 0, 56, 0],\r\n style: { fontSize: 5 },\r\n table: {\r\n widths: ['*', '*'],\r\n body: [\r\n [\r\n { \"border\": [false, false, false, false], 'text': moment().tz('Australia/Sydney').format('D MMM YYYY h:mm:ss A [AEST]'), \"style\": { 'alignment': 'left' } },\r\n { \"border\": [false, false, false, false], 'text': 'Page ' + currentPage + ' of ' + pageCount, \"style\": { 'alignment': 'right' } }\r\n ]\r\n ]\r\n }\r\n })\r\n return footer\r\n }\r\n };\r\n }\r\n\r\n public getImageContent() {\r\n return {\r\n image: this.base64logo,\r\n style: this.styles.logo,\r\n width: 141,\r\n height: 43\r\n }\r\n }\r\n\r\n public setFilename(filename: string): PdfBuilder {\r\n this.filename = filename;\r\n return this;\r\n }\r\n\r\n public setTitle(titleText: string): PdfBuilder {\r\n this.titleText = titleText;\r\n return this;\r\n }\r\n\r\n public setSubTitle(subTitleText: string): PdfBuilder {\r\n this.subTitleText = subTitleText;\r\n return this;\r\n }\r\n\r\n public addHeaderTableRow(nameLeft: string, valueLeft: string, nameRight: string, valueRight: string): PdfBuilder {\r\n this.headerTable.addRow(nameLeft, valueLeft, nameRight, valueRight);\r\n return this;\r\n }\r\n\r\n public addHeading(headingText: string): PdfBuilder {\r\n this.headings.push(headingText);\r\n return this;\r\n }\r\n\r\n public addFooter(footerText: string): PdfBuilder {\r\n this.footer.push(footerText);\r\n return this;\r\n }\r\n\r\n public addTable(\r\n titleText: string,\r\n dataRows: any[],\r\n fieldNames: string[],\r\n headings: string[],\r\n formatHints?: PdfFormatHint[],\r\n lastRowIsTotal?: boolean): PdfBuilder {\r\n let table: PdfTable = new PdfTable(this.userCompany);\r\n if (dataRows == null) {\r\n dataRows = [];\r\n }\r\n\r\n if (!dataRows || dataRows.length === 0) {\r\n return this;\r\n //this.addNormalText(\"There is no data available\");\r\n }\r\n\r\n this.tables.push(table\r\n .setTitle(titleText)\r\n .setContent(dataRows, fieldNames, headings, formatHints, lastRowIsTotal));\r\n\r\n return this;\r\n }\r\n\r\n public addTableAligned(titleText: string, dataRows: any[], fieldNames: string[], headings: any[], formatHints?: PdfFormatHint[], lastRowIsTotal?: boolean): PdfBuilder {\r\n let table: PdfTable = new PdfTable(this.userCompany);\r\n if (dataRows == null) {\r\n dataRows = [];\r\n }\r\n\r\n if (!dataRows || dataRows.length === 0) {\r\n return this;\r\n }\r\n\r\n this.tables.push(table\r\n .setTitle(titleText)\r\n .setContentAligned(dataRows, fieldNames, headings, formatHints, lastRowIsTotal));\r\n\r\n return this;\r\n }\r\n\r\n public addNormalText(titleText: string): PdfBuilder {\r\n let table: PdfTable = new PdfTable(this.userCompany);\r\n this.tables.push(table.setNormalText(titleText));\r\n return this;\r\n }\r\n\r\n // Optionally pass in a pre-built document definition, which is just an array\r\n // of content items, as supported by PdfMake.\r\n public build(injectedContent?: any[]): any {\r\n this.pushTitle();\r\n this.pushSubTitle();\r\n this.pushHeaderTable();\r\n this.pushAllHeadings();\r\n\r\n if (injectedContent && injectedContent.length > 0) {\r\n this.injectContent(injectedContent);\r\n } else {\r\n this.pushAllTables();\r\n }\r\n\r\n //this.pushFooter();\r\n //console.log(JSON.stringify(this.docDefinition.content));\r\n\r\n return pdfMake.createPdf(this.docDefinition).download(this.filename + '.pdf');\r\n }\r\n\r\n // Optionally pass in a pre-built document definition, which is just an array\r\n // of content items, as supported by PdfMake.\r\n public buildContent(injectedContent?: any[]): any {\r\n this.pushTitle();\r\n this.pushSubTitle();\r\n this.pushHeaderTable();\r\n this.pushAllHeadings();\r\n\r\n if (injectedContent && injectedContent.length > 0) {\r\n this.injectContent(injectedContent);\r\n } else {\r\n this.pushAllTables();\r\n }\r\n\r\n //this.pushFooter();\r\n return this.docDefinition\r\n }\r\n\r\n private pushTitle(): void {\r\n if (this.titleText !== undefined) {\r\n this.docDefinition.content.push({ text: this.titleText, style: 'header' });\r\n }\r\n }\r\n\r\n private pushSubTitle(): void {\r\n if (this.subTitleText !== undefined) {\r\n this.docDefinition.content.push({ text: this.subTitleText, style: 'subHeader' });\r\n }\r\n }\r\n\r\n private pushHeaderTable(): void {\r\n if (this.headerTable !== undefined) {\r\n this.docDefinition.content.push(this.headerTable.content);\r\n }\r\n }\r\n\r\n private pushAllHeadings(): void {\r\n let i: number;\r\n for (i = 0; i < this.headings.length; i++) {\r\n this.docDefinition.content.push({ text: this.headings[i], style: 'headerText' });\r\n }\r\n }\r\n\r\n getFooter(){\r\n let footerContent = [];\r\n let i: number;\r\n if (this.footer.length > 0){\r\n footerContent.push({ text: ' ', fontSize: 8 });\r\n // add footer line\r\n footerContent.push({\r\n \"fontSize\": 8,\r\n layout: {\r\n hLineColor: function(i, node) {\r\n return 'lightgray';\r\n }\r\n },\r\n \"table\":{\r\n \"widths\":[\"*\"],\r\n \"headerRows\":1,\r\n \"body\":\r\n [\r\n [\r\n {\"border\": [false, false, false, true], \"text\":\" \",\"alignment\":\"left\"},\r\n ],\r\n ]\r\n }\r\n });\r\n footerContent.push({ text: ' ', fontSize: 5 });\r\n }\r\n for (i = 0; i < this.footer.length; i++) {\r\n footerContent.push({ text: this.footer[i], style: 'footerText' });\r\n }\r\n\r\n return footerContent;\r\n }\r\n\r\n private pushFooter(): void {\r\n let i: number;\r\n if (this.footer.length > 0){\r\n this.docDefinition.content.footer.push({ text: ' ', fontSize: 8 });\r\n // add footer line\r\n this.docDefinition.content.footer.push({\r\n \"fontSize\": 8,\r\n layout: {\r\n hLineColor: function(i, node) {\r\n return 'lightgray';\r\n }\r\n },\r\n \"table\":{\r\n \"widths\":[\"*\"],\r\n \"headerRows\":1,\r\n \"body\":\r\n [\r\n [\r\n {\"border\": [false, false, false, true], \"text\":\" \",\"alignment\":\"left\"},\r\n ],\r\n ]\r\n }\r\n });\r\n this.docDefinition.content.footer.push({ text: ' ', fontSize: 5 });\r\n }\r\n for (i = 0; i < this.footer.length; i++) {\r\n this.docDefinition.content.footer.push({ text: this.footer[i], style: 'footerText' });\r\n }\r\n }\r\n\r\n private injectContent(injectedContent: any[]) {\r\n this.docDefinition.content = this.docDefinition.content.concat(injectedContent);\r\n }\r\n\r\n private pushAllTables(): void {\r\n for (let table of this.tables) {\r\n if (table.hasTitle()) {\r\n this.docDefinition.content.push(table.getTitle());\r\n }\r\n\r\n if (table.hasBody()) {\r\n this.docDefinition.content.push(table.getBody());\r\n }\r\n }\r\n }\r\n\r\n private generateDefaultFilename(): string {\r\n // Generate a pseudorandom 16-character string using [0-9a-z].\r\n let randomString: string = (Math.random().toString(36) + '00000000000000000').slice(2, 18);\r\n let timeStamp: Date = new Date();\r\n\r\n return randomString + '-' + timeStamp.toISOString();\r\n }\r\n }\r\n}\r\n","\r\n'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PDFBuilderService {\r\n q: ng.IQService;\r\n userCompanyService: UserCompanyService;\r\n base64logo: string;\r\n static $inject = ['$q', 'userCompanyService'];\r\n\r\n constructor($q, userCompanyService) {\r\n this.q = $q;\r\n this.userCompanyService = userCompanyService\r\n }\r\n private toDataUrl(url, callback) {\r\n try {\r\n var xhr = new XMLHttpRequest();\r\n xhr.onload = function() {\r\n var reader = new FileReader();\r\n reader.onloadend = function() {\r\n callback(reader.result);\r\n }\r\n reader.readAsDataURL(xhr.response);\r\n };\r\n xhr.open('GET', url);\r\n xhr.responseType = 'blob';\r\n xhr.send();\r\n } catch (error) {\r\n callback(null)\r\n }\r\n }\r\n newPdfBuilderInstance(): ng.IPromise {\r\n var deferred = this.q.defer();\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n if(!this.base64logo){\r\n this.toDataUrl(company.companyPdfImage,(image) => {\r\n if(image){\r\n this.base64logo = image;\r\n }else{\r\n console.error(\"Could not get logo\")\r\n }\r\n let pdfBuilder = new PdfBuilder(this.base64logo, company);\r\n deferred.resolve(pdfBuilder);\r\n })\r\n }else{\r\n let pdfBuilder = new PdfBuilder(this.base64logo, company);\r\n deferred.resolve(pdfBuilder);\r\n\r\n }\r\n })\r\n return deferred.promise;\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class CsvBuilder {\r\n private filename: string;\r\n private topLine: string;\r\n private headers: string[];\r\n private fields: string[];\r\n private data: any[];\r\n\r\n constructor() {\r\n this.filename = this.generateDefaultFilename();\r\n this.headers = new Array();\r\n this.data = new Array();\r\n }\r\n\r\n public setFilename(filename: string): CsvBuilder {\r\n if (filename !== null && filename !== undefined) {\r\n this.filename = filename;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public setTopLine(topLine: string): CsvBuilder {\r\n this.topLine = topLine;\r\n return this;\r\n }\r\n\r\n public setHeaders(headers: string[]): CsvBuilder {\r\n this.headers = headers;\r\n return this;\r\n }\r\n\r\n public setData(data: any[][]): CsvBuilder {\r\n this.data = data;\r\n return this;\r\n }\r\n\r\n public build(): void {\r\n let blob: Blob = this.createCsvFile(this.headers, this.data);\r\n this.makeCsv(blob);\r\n }\r\n\r\n private makeCsv(csvBlob: Blob): void {\r\n this.filename += '.csv';\r\n this.saveFile(this.filename, csvBlob)\r\n }\r\n\r\n private saveFile (name, data) {\r\n if (data !== null && navigator.msSaveBlob)\r\n return navigator.msSaveBlob(data, name);\r\n var a = $(\"\");\r\n var url = window.URL.createObjectURL(data);\r\n a.attr(\"href\", url);\r\n a.attr(\"download\", name);\r\n $(\"body\").append(a);\r\n a[0].click();\r\n window.URL.revokeObjectURL(url);\r\n a.remove();\r\n }\r\n\r\n private createCsvFile(headers: string[], data: any[]) {\r\n let EOL: string = '\\r\\n';\r\n let csvContent: string = \"\";\r\n if (this.topLine != null) {\r\n csvContent = '\"' + this.topLine + '\"' + EOL;\r\n }\r\n csvContent = csvContent + headers.\r\n map(header => '\"' + header + '\"').\r\n join(',') + EOL;\r\n\r\n for (let row of data) {\r\n let rowItems: any[] = [];\r\n\r\n for (let field of row) {\r\n let val: any = field;\r\n\r\n if (typeof val === 'string') {\r\n val = val.replace(/\"/g, '\"\"');\r\n }\r\n\r\n if (typeof val === 'number') {\r\n rowItems.push(val);\r\n } else {\r\n rowItems.push('\"' + val + '\"');\r\n }\r\n }\r\n\r\n csvContent += rowItems.join(',') + EOL;\r\n }\r\n\r\n return new Blob([csvContent], { type: 'text/csv;charset=utf-8' });\r\n }\r\n\r\n private generateDefaultFilename(): string {\r\n // Generate a pseudorandom 16-character string using [0-9a-z].\r\n let randomString: string = (Math.random().toString(36) + '00000000000000000').slice(2, 18);\r\n let timeStamp: Date = new Date();\r\n\r\n return randomString + '-' + timeStamp.toISOString();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class TokenService {\r\n oauthSettings: Oidc.OidcTokenManagerSettings;\r\n tokenManager: Oidc.OidcTokenManager;\r\n\r\n constructor() {\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n var dictionary: any = JSON.parse(model);\r\n\r\n this.oauthSettings = dictionary['oauthSettings'];\r\n this.tokenManager = new OidcTokenManager(this.oauthSettings);\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class BearerInjector {\r\n\r\n tokenService: TokenService;\r\n q: ng.IQService;\r\n baseUrl: string;\r\n\r\n static $inject = ['$q', 'tokenService'];\r\n constructor( $q, tokenService) {\r\n this.q = $q;\r\n this.tokenService = tokenService;\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n var dictionary: any = JSON.parse(model);\r\n this.baseUrl = dictionary['hostPath'];\r\n }\r\n\r\n request = (config) => {\r\n if (config.url.indexOf(this.baseUrl, 0) == 0 || config.url.indexOf(\"assets/templates\")== 0)\r\n {\r\n var token = this.tokenService.tokenManager.access_token;\r\n if (token) {\r\n console.log('Adding authorization header for request: ' + config.url);\r\n config.headers['Authorization'] = 'Bearer ' + token;\r\n }\r\n }\r\n return config;\r\n };\r\n\r\n responseError = (response) => {\r\n var x = response;\r\n console.log(response);\r\n if (response.status === 401 && response.config.url.indexOf(\"https://api-global.morningstar.com\") === -1) {\r\n //Store current URL to redirect back to it after login.\r\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\r\n this.tokenService.tokenManager.redirectForToken();\r\n }\r\n if (response.status === 403) {\r\n //identityService.tokenManager.removeToken();\r\n }\r\n return this.q.reject(response);\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class SelectionService {\r\n log: ng.ILogService;\r\n selectedAccountId: string;\r\n selectedWatchlistSecIds: string;\r\n\r\n static $inject = ['$log'];\r\n\r\n constructor($log) {\r\n this.log = $log;\r\n }\r\n\r\n getSelectedAccount(accounts: Array) : Account {\r\n if (accounts && accounts.length > 0) {\r\n var account = accounts.filter(x => x.accountId == this.selectedAccountId)[0];\r\n\r\n if (account == null) {\r\n return accounts[0];\r\n }\r\n\r\n return account;\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class BaseService {\r\n http: ng.IHttpService;\r\n log: ng.ILogService;\r\n baseUrl: string;\r\n tokenService: TokenService;\r\n state: angular.ui.IStateService;\r\n q: ng.IQService;\r\n\r\n static $inject = ['$http', '$log', '$state', '$q', 'tokenService'];\r\n\r\n constructor($http, $log, $state, $q, tokenService) {\r\n this.http = $http;\r\n this.log = $log;\r\n this.tokenService = tokenService;\r\n this.state = $state;\r\n this.q = $q;\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n var dictionary: any = JSON.parse(model);\r\n this.baseUrl = dictionary['hostPath'];\r\n }\r\n\r\n get(url: string): ng.IPromise {\r\n var absoluteUrl: string = this.baseUrl + url;\r\n\r\n this.log.info(\"GET - \" + absoluteUrl);\r\n\r\n let cancel: ng.IDeferred<{}> = this.q.defer();\r\n let config = {\r\n timeout: cancel.promise,\r\n cancel: cancel,\r\n headers : {\r\n /*\"Pragma\": \"no-cache\",\r\n \"Expires\": -1,\r\n \"Cache-Control\": \"no-cache\"*/\r\n }\r\n };\r\n\r\n return this.http.get(absoluteUrl, config)\r\n .then((response) => {\r\n return this.mapResponseData(response);\r\n },\r\n (reason) => {\r\n return this.errorHandler(reason, \"Error calling GET on \" + absoluteUrl);\r\n });\r\n }\r\n\r\n post(url: string, data: any) {\r\n var absoluteUrl: string = this.baseUrl + url;\r\n\r\n this.log.info(\"POST - \" + absoluteUrl);\r\n this.log.info(data);\r\n return this.http.post(absoluteUrl, data)\r\n .then((response) => {\r\n return this.mapResponseData(response);\r\n },\r\n (reason) => {\r\n return this.errorHandler(reason, \"Error calling POST on \" + absoluteUrl);\r\n });\r\n }\r\n\r\n patch(url: string, data: any) {\r\n var absoluteUrl: string = this.baseUrl + url;\r\n\r\n this.log.info(\"PATCH - \" + absoluteUrl);\r\n this.log.info(data);\r\n\r\n return this.http.patch(absoluteUrl, data)\r\n .then((response) => {\r\n return this.mapResponseData(response);\r\n },\r\n (reason) => {\r\n return this.errorHandler(reason, \"Error calling PATCH on \" + absoluteUrl);\r\n });\r\n }\r\n\r\n put(url: string, data: any) {\r\n var absoluteUrl: string = this.baseUrl + url;\r\n\r\n this.log.info(\"PUT - \" + absoluteUrl);\r\n this.log.info(data);\r\n\r\n return this.http.put(absoluteUrl, data)\r\n .then((response) => {\r\n return this.mapResponseData(response);\r\n },\r\n (reason) => {\r\n return this.errorHandler(reason, \"Error calling PUT on \" + absoluteUrl);\r\n });\r\n }\r\n\r\n delete(url: string) {\r\n var absoluteUrl: string = this.baseUrl + url;\r\n\r\n this.log.info(\"DELETE - \" + absoluteUrl);\r\n return this.http.delete(absoluteUrl)\r\n .then((response) => {\r\n return this.mapResponseData(response);\r\n },\r\n (reason) => {\r\n return this.errorHandler(reason, \"Error calling DELETE on \" + absoluteUrl);\r\n });\r\n }\r\n\r\n errorHandler(reason, msg) {\r\n msg = msg || \"Unexpected Error\";\r\n\r\n if (reason.data && reason.data.exceptionMessage) {\r\n this.log.error(reason.data);\r\n }\r\n\r\n if (reason.status === 401) {\r\n //Unauthorized\r\n //Store current URL to redirect back to it after login.\r\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\r\n this.tokenService.tokenManager.redirectForToken();\r\n }\r\n if (reason.status === 403) {\r\n // forbidden\r\n if (reason.data != 'Please verify code send via SMS') {\r\n this.state.go('forbidden');\r\n }\r\n }\r\n /*if (reason.status === 404) {\r\n // forbidden\r\n this.state.go('otherwise');\r\n }*/\r\n /*if (reason.status === 500) {\r\n // internal server error\r\n this.state.go('error');\r\n }*/\r\n throw reason;\r\n }\r\n\r\n mapResponseData(response) {\r\n console.log(response.config.url);\r\n\r\n if (response.data !== null &&\r\n response.data !== undefined &&\r\n response.data.value !== null &&\r\n response.data.value !== undefined) {\r\n return response.data.value;\r\n }\r\n else if ( response.data !== undefined &&\r\n response.data !== null) {\r\n return response.data;\r\n }\r\n else {\r\n return response;\r\n }\r\n }\r\n }\r\n}\r\n","var excludeWords = [\n \"MRS\",\n \"MR\",\n \"CO\",\n \"DR\",\n \"MS\",\n \"NG\",\n \"PTY\",\n \"LTD\",\n \"IAN\",\n \"TIM\",\n \"LEO\",\n \"NIC\",\n \"ONG\",\n \"TU\",\n \"GUO\",\n \"DAI\",\n \"JON\",\n \"JEZ\",\n \"LIM\",\n \"ZOE\",\n \"DEA\",\n \"ZYL\",\n \"EVA\",\n \"AMY\",\n \"ROY\",\n \"AA\",\n \"AAH\",\n \"AAL\",\n \"AAS\",\n \"AB\",\n \"ABA\",\n \"ABB\",\n \"ABO\",\n \"ABS\",\n \"ABY\",\n \"ACE\",\n \"ACH\",\n \"ACT\",\n \"AD\",\n \"ADD\",\n \"ADO\",\n \"ADS\",\n \"ADZ\",\n \"AE\",\n \"AFF\",\n \"AFT\",\n \"AG\",\n \"AGA\",\n \"AGE\",\n \"AGO\",\n \"AGS\",\n \"AH\",\n \"AHA\",\n \"AHI\",\n \"AHS\",\n \"AI\",\n \"AIA\",\n \"AID\",\n \"AIL\",\n \"AIM\",\n \"AIN\",\n \"AIR\",\n \"AIS\",\n \"AIT\",\n \"AKA\",\n \"AKE\",\n \"AL\",\n \"ALA\",\n \"ALB\",\n \"ALE\",\n \"ALF\",\n \"ALL\",\n \"ALP\",\n \"ALS\",\n \"ALT\",\n \"ALU\",\n \"AM\",\n \"AMA\",\n \"AME\",\n \"AMI\",\n \"AMP\",\n \"AMU\",\n \"AN\",\n \"ANA\",\n \"AND\",\n \"ANE\",\n \"ANI\",\n \"ANN\",\n \"ANS\",\n \"ANT\",\n \"ANY\",\n \"APE\",\n \"APO\",\n \"APP\",\n \"APT\",\n \"AR\",\n \"ARB\",\n \"ARC\",\n \"ARD\",\n \"ARE\",\n \"ARF\",\n \"ARK\",\n \"ARM\",\n \"ARS\",\n \"ART\",\n \"ARY\",\n \"AS\",\n \"ASH\",\n \"ASK\",\n \"ASP\",\n \"AT\",\n \"ATE\",\n \"ATS\",\n \"ATT\",\n \"AUA\",\n \"AUE\",\n \"AUF\",\n \"AUK\",\n \"AVA\",\n \"AVE\",\n \"AVO\",\n \"AW\",\n \"AWA\",\n \"AWE\",\n \"AWK\",\n \"AWL\",\n \"AWN\",\n \"AX\",\n \"AXE\",\n \"AY\",\n \"AYE\",\n \"AYS\",\n \"AYU\",\n \"AZO\",\n \"BA\",\n \"BAA\",\n \"BAC\",\n \"BAD\",\n \"BAG\",\n \"BAH\",\n \"BAL\",\n \"BAM\",\n \"BAN\",\n \"BAP\",\n \"BAR\",\n \"BAS\",\n \"BAT\",\n \"BAY\",\n \"BE\",\n \"BED\",\n \"BEE\",\n \"BEG\",\n \"BEL\",\n \"BEN\",\n \"BES\",\n \"BET\",\n \"BEY\",\n \"BEZ\",\n \"BI\",\n \"BIB\",\n \"BID\",\n \"BIG\",\n \"BIN\",\n \"BIO\",\n \"BIS\",\n \"BIT\",\n \"BIZ\",\n \"BO\",\n \"BOA\",\n \"BOB\",\n \"BOD\",\n \"BOG\",\n \"BOH\",\n \"BOI\",\n \"BOK\",\n \"BON\",\n \"BOO\",\n \"BOP\",\n \"BOR\",\n \"BOS\",\n \"BOT\",\n \"BOW\",\n \"BOX\",\n \"BOY\",\n \"BRA\",\n \"BRO\",\n \"BRR\",\n \"BRU\",\n \"BUB\",\n \"BUD\",\n \"BUG\",\n \"BUN\",\n \"BUR\",\n \"BUS\",\n \"BUT\",\n \"BUY\",\n \"BY\",\n \"BYE\",\n \"BYS\",\n \"CAA\",\n \"CAB\",\n \"CAD\",\n \"CAG\",\n \"CAM\",\n \"CAN\",\n \"CAP\",\n \"CAR\",\n \"CAT\",\n \"CAW\",\n \"CAY\",\n \"CAZ\",\n \"CEE\",\n \"CEL\",\n \"CEP\",\n \"CH\",\n \"CHA\",\n \"CHE\",\n \"CHI\",\n \"CID\",\n \"CIG\",\n \"CIS\",\n \"CIT\",\n \"CLY\",\n \"COB\",\n \"COD\",\n \"COG\",\n \"COL\",\n \"CON\",\n \"COO\",\n \"COP\",\n \"COR\",\n \"COS\",\n \"COT\",\n \"COW\",\n \"COY\",\n \"COZ\",\n \"CRU\",\n \"CRY\",\n \"CUB\",\n \"CUD\",\n \"CUE\",\n \"CUP\",\n \"CUR\",\n \"CUT\",\n \"CUZ\",\n \"CWM\",\n \"DA\",\n \"DAB\",\n \"DAD\",\n \"DAE\",\n \"DAG\",\n \"DAH\",\n \"DAK\",\n \"DAL\",\n \"DAM\",\n \"DAN\",\n \"DAP\",\n \"DAS\",\n \"DAW\",\n \"DAY\",\n \"DE\",\n \"DEB\",\n \"DEE\",\n \"DEF\",\n \"DEG\",\n \"DEI\",\n \"DEL\",\n \"DEN\",\n \"DEV\",\n \"DEW\",\n \"DEX\",\n \"DEY\",\n \"DI\",\n \"DIB\",\n \"DID\",\n \"DIE\",\n \"DIF\",\n \"DIG\",\n \"DIM\",\n \"DIN\",\n \"DIP\",\n \"DIS\",\n \"DIT\",\n \"DIV\",\n \"DO\",\n \"DOB\",\n \"DOC\",\n \"DOD\",\n \"DOE\",\n \"DOF\",\n \"DOG\",\n \"DOH\",\n \"DOL\",\n \"DOM\",\n \"DON\",\n \"DOO\",\n \"DOP\",\n \"DOR\",\n \"DOS\",\n \"DOT\",\n \"DOW\",\n \"DOY\",\n \"DRY\",\n \"DSO\",\n \"DUB\",\n \"DUD\",\n \"DUE\",\n \"DUG\",\n \"DUH\",\n \"DUI\",\n \"DUN\",\n \"DUO\",\n \"DUP\",\n \"DUX\",\n \"DYE\",\n \"DZO\",\n \"EA\",\n \"EAN\",\n \"EAR\",\n \"EAS\",\n \"EAT\",\n \"EAU\",\n \"EBB\",\n \"ECH\",\n \"ECO\",\n \"ECU\",\n \"ED\",\n \"EDH\",\n \"EDS\",\n \"EE\",\n \"EEK\",\n \"EEL\",\n \"EEN\",\n \"EF\",\n \"EFF\",\n \"EFS\",\n \"EFT\",\n \"EGG\",\n \"EGO\",\n \"EH\",\n \"EHS\",\n \"EIK\",\n \"EKE\",\n \"EL\",\n \"ELD\",\n \"ELF\",\n \"ELK\",\n \"ELL\",\n \"ELM\",\n \"ELS\",\n \"ELT\",\n \"EM\",\n \"EME\",\n \"EMF\",\n \"EMO\",\n \"EMS\",\n \"EMU\",\n \"EN\",\n \"END\",\n \"ENE\",\n \"ENG\",\n \"ENS\",\n \"EON\",\n \"ER\",\n \"ERA\",\n \"ERE\",\n \"ERF\",\n \"ERG\",\n \"ERK\",\n \"ERM\",\n \"ERN\",\n \"ERR\",\n \"ERS\",\n \"ES\",\n \"ESS\",\n \"EST\",\n \"ET\",\n \"ETA\",\n \"ETH\",\n \"EUK\",\n \"EVE\",\n \"EVO\",\n \"EWE\",\n \"EWK\",\n \"EWT\",\n \"EX\",\n \"EXO\",\n \"EYE\",\n \"FA\",\n \"FAA\",\n \"FAB\",\n \"FAD\",\n \"FAE\",\n \"FAH\",\n \"FAN\",\n \"FAP\",\n \"FAR\",\n \"FAS\",\n \"FAT\",\n \"FAW\",\n \"FAX\",\n \"FAY\",\n \"FE\",\n \"FED\",\n \"FEE\",\n \"FEG\",\n \"FEH\",\n \"FEM\",\n \"FEN\",\n \"FER\",\n \"FES\",\n \"FET\",\n \"FEU\",\n \"FEW\",\n \"FEY\",\n \"FEZ\",\n \"FIB\",\n \"FID\",\n \"FIE\",\n \"FIG\",\n \"FIL\",\n \"FIN\",\n \"FIR\",\n \"FIT\",\n \"FIX\",\n \"FIZ\",\n \"FLU\",\n \"FLY\",\n \"FOB\",\n \"FOE\",\n \"FOG\",\n \"FOH\",\n \"FON\",\n \"FOP\",\n \"FOR\",\n \"FOU\",\n \"FOX\",\n \"FOY\",\n \"FRA\",\n \"FRO\",\n \"FRY\",\n \"FUB\",\n \"FUD\",\n \"FUG\",\n \"FUM\",\n \"FUN\",\n \"FUR\",\n \"FY\",\n \"GAB\",\n \"GAD\",\n \"GAE\",\n \"GAG\",\n \"GAK\",\n \"GAL\",\n \"GAM\",\n \"GAN\",\n \"GAP\",\n \"GAR\",\n \"GAS\",\n \"GAT\",\n \"GAU\",\n \"GAW\",\n \"GAY\",\n \"GED\",\n \"GEE\",\n \"GEL\",\n \"GEM\",\n \"GEN\",\n \"GEO\",\n \"GER\",\n \"GET\",\n \"GEY\",\n \"GHI\",\n \"GI\",\n \"GIB\",\n \"GID\",\n \"GIE\",\n \"GIF\",\n \"GIG\",\n \"GIN\",\n \"GIO\",\n \"GIP\",\n \"GIS\",\n \"GIT\",\n \"GJU\",\n \"GNU\",\n \"GO\",\n \"GOA\",\n \"GOB\",\n \"GOD\",\n \"GOE\",\n \"GON\",\n \"GOO\",\n \"GOR\",\n \"GOS\",\n \"GOT\",\n \"GOV\",\n \"GOX\",\n \"GOY\",\n \"GU\",\n \"GUB\",\n \"GUE\",\n \"GUL\",\n \"GUM\",\n \"GUN\",\n \"GUP\",\n \"GUR\",\n \"GUS\",\n \"GUT\",\n \"GUV\",\n \"GUY\",\n \"GYM\",\n \"GYP\",\n \"HA\",\n \"HAD\",\n \"HAE\",\n \"HAG\",\n \"HAH\",\n \"HAJ\",\n \"HAM\",\n \"HAN\",\n \"HAO\",\n \"HAP\",\n \"HAS\",\n \"HAT\",\n \"HAW\",\n \"HAY\",\n \"HE\",\n \"HEH\",\n \"HEM\",\n \"HEN\",\n \"HEP\",\n \"HER\",\n \"HES\",\n \"HET\",\n \"HEW\",\n \"HEX\",\n \"HEY\",\n \"HI\",\n \"HIC\",\n \"HID\",\n \"HIE\",\n \"HIM\",\n \"HIN\",\n \"HIP\",\n \"HIS\",\n \"HIT\",\n \"HM\",\n \"HMM\",\n \"HO\",\n \"HOA\",\n \"HOB\",\n \"HOC\",\n \"HOD\",\n \"HOE\",\n \"HOG\",\n \"HOH\",\n \"HOI\",\n \"HOM\",\n \"HON\",\n \"HOO\",\n \"HOP\",\n \"HOS\",\n \"HOT\",\n \"HOW\",\n \"HOX\",\n \"HOY\",\n \"HUB\",\n \"HUE\",\n \"HUG\",\n \"HUH\",\n \"HUI\",\n \"HUM\",\n \"HUN\",\n \"HUP\",\n \"HUT\",\n \"HYE\",\n \"HYP\",\n \"ICE\",\n \"ICH\",\n \"ICK\",\n \"ICY\",\n \"ID\",\n \"IDE\",\n \"IDS\",\n \"IF\",\n \"IFF\",\n \"IFS\",\n \"IGG\",\n \"ILK\",\n \"ILL\",\n \"IMP\",\n \"IN\",\n \"ING\",\n \"INK\",\n \"INN\",\n \"INS\",\n \"IO\",\n \"ION\",\n \"IOS\",\n \"IRE\",\n \"IRK\",\n \"IS\",\n \"ISH\",\n \"ISM\",\n \"ISO\",\n \"IT\",\n \"ITA\",\n \"ITS\",\n \"IVY\",\n \"IWI\",\n \"JA\",\n \"JAB\",\n \"JAG\",\n \"JAI\",\n \"JAK\",\n \"JAM\",\n \"JAR\",\n \"JAW\",\n \"JAY\",\n \"JEE\",\n \"JET\",\n \"JEU\",\n \"JEW\",\n \"JIB\",\n \"JIG\",\n \"JIN\",\n \"JO\",\n \"JOB\",\n \"JOE\",\n \"JOG\",\n \"JOL\",\n \"JOR\",\n \"JOT\",\n \"JOW\",\n \"JOY\",\n \"JUD\",\n \"JUG\",\n \"JUN\",\n \"JUS\",\n \"JUT\",\n \"KA\",\n \"KAB\",\n \"KAE\",\n \"KAF\",\n \"KAI\",\n \"KAK\",\n \"KAM\",\n \"KAS\",\n \"KAT\",\n \"KAW\",\n \"KAY\",\n \"KEA\",\n \"KEB\",\n \"KED\",\n \"KEF\",\n \"KEG\",\n \"KEN\",\n \"KEP\",\n \"KET\",\n \"KEX\",\n \"KEY\",\n \"KHI\",\n \"KI\",\n \"KID\",\n \"KIF\",\n \"KIN\",\n \"KIP\",\n \"KIR\",\n \"KIS\",\n \"KIT\",\n \"KO\",\n \"KOA\",\n \"KOB\",\n \"KOI\",\n \"KON\",\n \"KOP\",\n \"KOR\",\n \"KOS\",\n \"KOW\",\n \"KUE\",\n \"KY\",\n \"KYE\",\n \"KYU\",\n \"LA\",\n \"LAB\",\n \"LAC\",\n \"LAD\",\n \"LAG\",\n \"LAH\",\n \"LAM\",\n \"LAP\",\n \"LAR\",\n \"LAS\",\n \"LAT\",\n \"LAV\",\n \"LAW\",\n \"LAX\",\n \"LAY\",\n \"LEA\",\n \"LED\",\n \"LEE\",\n \"LEG\",\n \"LEI\",\n \"LEK\",\n \"LEP\",\n \"LES\",\n \"LET\",\n \"LEU\",\n \"LEV\",\n \"LEW\",\n \"LEX\",\n \"LEY\",\n \"LEZ\",\n \"LI\",\n \"LIB\",\n \"LID\",\n \"LIE\",\n \"LIG\",\n \"LIN\",\n \"LIP\",\n \"LIS\",\n \"LIT\",\n \"LO\",\n \"LOB\",\n \"LOD\",\n \"LOG\",\n \"LOO\",\n \"LOP\",\n \"LOR\",\n \"LOS\",\n \"LOT\",\n \"LOU\",\n \"LOW\",\n \"LOX\",\n \"LOY\",\n \"LUD\",\n \"LUG\",\n \"LUM\",\n \"LUR\",\n \"LUV\",\n \"LUX\",\n \"LUZ\",\n \"LYE\",\n \"LYM\",\n \"MA\",\n \"MAA\",\n \"MAC\",\n \"MAD\",\n \"MAE\",\n \"MAG\",\n \"MAK\",\n \"MAL\",\n \"MAM\",\n \"MAN\",\n \"MAP\",\n \"MAR\",\n \"MAS\",\n \"MAT\",\n \"MAW\",\n \"MAX\",\n \"MAY\",\n \"ME\",\n \"MED\",\n \"MEE\",\n \"MEG\",\n \"MEH\",\n \"MEL\",\n \"MEM\",\n \"MEN\",\n \"MES\",\n \"MET\",\n \"MEU\",\n \"MEW\",\n \"MHO\",\n \"MI\",\n \"MIB\",\n \"MIC\",\n \"MID\",\n \"MIG\",\n \"MIL\",\n \"MIM\",\n \"MIR\",\n \"MIS\",\n \"MIX\",\n \"MIZ\",\n \"MM\",\n \"MNA\",\n \"MO\",\n \"MOA\",\n \"MOB\",\n \"MOC\",\n \"MOD\",\n \"MOE\",\n \"MOG\",\n \"MOI\",\n \"MOL\",\n \"MOM\",\n \"MON\",\n \"MOO\",\n \"MOP\",\n \"MOR\",\n \"MOS\",\n \"MOT\",\n \"MOU\",\n \"MOW\",\n \"MOY\",\n \"MOZ\",\n \"MU\",\n \"MUD\",\n \"MUG\",\n \"MUM\",\n \"MUN\",\n \"MUS\",\n \"MUT\",\n \"MUX\",\n \"MY\",\n \"MYC\",\n \"NA\",\n \"NAB\",\n \"NAE\",\n \"NAG\",\n \"NAH\",\n \"NAM\",\n \"NAN\",\n \"NAP\",\n \"NAS\",\n \"NAT\",\n \"NAW\",\n \"NAY\",\n \"NE\",\n \"NEB\",\n \"NED\",\n \"NEE\",\n \"NEF\",\n \"NEG\",\n \"NEK\",\n \"NEP\",\n \"NET\",\n \"NEW\",\n \"NIB\",\n \"NID\",\n \"NIE\",\n \"NIL\",\n \"NIM\",\n \"NIP\",\n \"NIS\",\n \"NIT\",\n \"NIX\",\n \"NO\",\n \"NOD\",\n \"NOG\",\n \"NOH\",\n \"NOM\",\n \"NON\",\n \"NOO\",\n \"NOR\",\n \"NOS\",\n \"NOT\",\n \"NOW\",\n \"NOX\",\n \"NOY\",\n \"NTH\",\n \"NU\",\n \"NUB\",\n \"NUN\",\n \"NUR\",\n \"NUS\",\n \"NUT\",\n \"NY\",\n \"NYE\",\n \"NYS\",\n \"OAF\",\n \"OAK\",\n \"OAR\",\n \"OAT\",\n \"OB\",\n \"OBA\",\n \"OBE\",\n \"OBI\",\n \"OBO\",\n \"OBS\",\n \"OCA\",\n \"OCH\",\n \"OD\",\n \"ODA\",\n \"ODD\",\n \"ODE\",\n \"ODS\",\n \"OE\",\n \"OES\",\n \"OF\",\n \"OFF\",\n \"OFT\",\n \"OH\",\n \"OHM\",\n \"OHO\",\n \"OHS\",\n \"OI\",\n \"OIK\",\n \"OIL\",\n \"OIS\",\n \"OKA\",\n \"OKE\",\n \"OLD\",\n \"OLE\",\n \"OLM\",\n \"OM\",\n \"OMS\",\n \"ON\",\n \"ONE\",\n \"ONO\",\n \"ONS\",\n \"ONY\",\n \"OO\",\n \"OOF\",\n \"OOH\",\n \"OOM\",\n \"OON\",\n \"OOP\",\n \"OOR\",\n \"OOS\",\n \"OOT\",\n \"OP\",\n \"OPE\",\n \"OPS\",\n \"OPT\",\n \"OR\",\n \"ORA\",\n \"ORB\",\n \"ORC\",\n \"ORD\",\n \"ORE\",\n \"ORF\",\n \"ORS\",\n \"ORT\",\n \"OS\",\n \"OSE\",\n \"OU\",\n \"OUD\",\n \"OUK\",\n \"OUP\",\n \"OUR\",\n \"OUS\",\n \"OUT\",\n \"OVA\",\n \"OW\",\n \"OWE\",\n \"OWL\",\n \"OWN\",\n \"OWT\",\n \"OX\",\n \"OXO\",\n \"OXY\",\n \"OY\",\n \"OYE\",\n \"OYS\",\n \"PA\",\n \"PAC\",\n \"PAD\",\n \"PAH\",\n \"PAL\",\n \"PAM\",\n \"PAN\",\n \"PAP\",\n \"PAR\",\n \"PAS\",\n \"PAT\",\n \"PAV\",\n \"PAW\",\n \"PAX\",\n \"PAY\",\n \"PE\",\n \"PEA\",\n \"PEC\",\n \"PED\",\n \"PEE\",\n \"PEG\",\n \"PEH\",\n \"PEL\",\n \"PEN\",\n \"PEP\",\n \"PER\",\n \"PES\",\n \"PET\",\n \"PEW\",\n \"PHI\",\n \"PHO\",\n \"PHT\",\n \"PI\",\n \"PIA\",\n \"PIC\",\n \"PIE\",\n \"PIG\",\n \"PIN\",\n \"PIP\",\n \"PIR\",\n \"PIS\",\n \"PIT\",\n \"PIU\",\n \"PIX\",\n \"PLU\",\n \"PLY\",\n \"PO\",\n \"POA\",\n \"POD\",\n \"POH\",\n \"POI\",\n \"POL\",\n \"POM\",\n \"POO\",\n \"POP\",\n \"POS\",\n \"POT\",\n \"POW\",\n \"POX\",\n \"POZ\",\n \"PRE\",\n \"PRO\",\n \"PRY\",\n \"PSI\",\n \"PST\",\n \"PUB\",\n \"PUD\",\n \"PUG\",\n \"PUH\",\n \"PUL\",\n \"PUN\",\n \"PUP\",\n \"PUR\",\n \"PUS\",\n \"PUT\",\n \"PUY\",\n \"PYA\",\n \"PYE\",\n \"PYX\",\n \"QAT\",\n \"QI\",\n \"QIN\",\n \"QIS\",\n \"QUA\",\n \"RAD\",\n \"RAG\",\n \"RAH\",\n \"RAI\",\n \"RAJ\",\n \"RAM\",\n \"RAN\",\n \"RAP\",\n \"RAS\",\n \"RAT\",\n \"RAV\",\n \"RAW\",\n \"RAX\",\n \"RAY\",\n \"RE\",\n \"REB\",\n \"REC\",\n \"RED\",\n \"REE\",\n \"REF\",\n \"REG\",\n \"REH\",\n \"REI\",\n \"REM\",\n \"REN\",\n \"REO\",\n \"REP\",\n \"RES\",\n \"RET\",\n \"REV\",\n \"REW\",\n \"REX\",\n \"REZ\",\n \"RHO\",\n \"RHY\",\n \"RIA\",\n \"RIB\",\n \"RID\",\n \"RIF\",\n \"RIG\",\n \"RIM\",\n \"RIN\",\n \"RIP\",\n \"RIT\",\n \"RIZ\",\n \"ROB\",\n \"ROC\",\n \"ROD\",\n \"ROE\",\n \"ROK\",\n \"ROM\",\n \"ROO\",\n \"ROT\",\n \"ROW\",\n \"RUB\",\n \"RUC\",\n \"RUD\",\n \"RUE\",\n \"RUG\",\n \"RUM\",\n \"RUN\",\n \"RUT\",\n \"RYA\",\n \"RYE\",\n \"SAB\",\n \"SAC\",\n \"SAD\",\n \"SAE\",\n \"SAG\",\n \"SAI\",\n \"SAL\",\n \"SAM\",\n \"SAN\",\n \"SAP\",\n \"SAR\",\n \"SAT\",\n \"SAU\",\n \"SAV\",\n \"SAW\",\n \"SAX\",\n \"SAY\",\n \"SAZ\",\n \"SEA\",\n \"SEC\",\n \"SED\",\n \"SEE\",\n \"SEG\",\n \"SEI\",\n \"SEL\",\n \"SEN\",\n \"SER\",\n \"SET\",\n \"SEW\",\n \"SEY\",\n \"SEZ\",\n \"SH\",\n \"SHA\",\n \"SHE\",\n \"SHH\",\n \"SHY\",\n \"SI\",\n \"SIB\",\n \"SIC\",\n \"SIF\",\n \"SIK\",\n \"SIM\",\n \"SIN\",\n \"SIP\",\n \"SIR\",\n \"SIS\",\n \"SIT\",\n \"SIX\",\n \"SKA\",\n \"SKI\",\n \"SKY\",\n \"SLY\",\n \"SMA\",\n \"SNY\",\n \"SO\",\n \"SOB\",\n \"SOC\",\n \"SOD\",\n \"SOG\",\n \"SOH\",\n \"SOL\",\n \"SOM\",\n \"SON\",\n \"SOP\",\n \"SOS\",\n \"SOT\",\n \"SOU\",\n \"SOV\",\n \"SOW\",\n \"SOX\",\n \"SOY\",\n \"SOZ\",\n \"SPA\",\n \"SPY\",\n \"SRI\",\n \"ST\",\n \"STY\",\n \"SUB\",\n \"SUD\",\n \"SUE\",\n \"SUG\",\n \"SUI\",\n \"SUK\",\n \"SUM\",\n \"SUN\",\n \"SUP\",\n \"SUQ\",\n \"SUR\",\n \"SUS\",\n \"SWY\",\n \"SYE\",\n \"SYN\",\n \"TA\",\n \"TAB\",\n \"TAD\",\n \"TAE\",\n \"TAG\",\n \"TAI\",\n \"TAJ\",\n \"TAK\",\n \"TAM\",\n \"TAN\",\n \"TAO\",\n \"TAP\",\n \"TAR\",\n \"TAS\",\n \"TAT\",\n \"TAU\",\n \"TAV\",\n \"TAW\",\n \"TAX\",\n \"TAY\",\n \"TE\",\n \"TEA\",\n \"TEC\",\n \"TED\",\n \"TEE\",\n \"TEF\",\n \"TEG\",\n \"TEL\",\n \"TEN\",\n \"TES\",\n \"TET\",\n \"TEW\",\n \"TEX\",\n \"THE\",\n \"THO\",\n \"THY\",\n \"TI\",\n \"TIC\",\n \"TID\",\n \"TIE\",\n \"TIG\",\n \"TIK\",\n \"TIL\",\n \"TIN\",\n \"TIP\",\n \"TIS\",\n \"TIX\",\n \"TO\",\n \"TOC\",\n \"TOD\",\n \"TOE\",\n \"TOG\",\n \"TOM\",\n \"TON\",\n \"TOO\",\n \"TOP\",\n \"TOR\",\n \"TOT\",\n \"TOW\",\n \"TOY\",\n \"TRY\",\n \"TSK\",\n \"TUB\",\n \"TUG\",\n \"TUI\",\n \"TUM\",\n \"TUN\",\n \"TUP\",\n \"TUT\",\n \"TUX\",\n \"TWA\",\n \"TWO\",\n \"TWP\",\n \"TYE\",\n \"TYG\",\n \"UDO\",\n \"UDS\",\n \"UEY\",\n \"UFO\",\n \"UG\",\n \"UGH\",\n \"UGS\",\n \"UH\",\n \"UKE\",\n \"ULE\",\n \"ULU\",\n \"UM\",\n \"UMM\",\n \"UMP\",\n \"UMS\",\n \"UMU\",\n \"UN\",\n \"UNI\",\n \"UNS\",\n \"UP\",\n \"UPO\",\n \"UPS\",\n \"UR\",\n \"URB\",\n \"URD\",\n \"URE\",\n \"URN\",\n \"URP\",\n \"US\",\n \"USE\",\n \"UT\",\n \"UTA\",\n \"UTE\",\n \"UTS\",\n \"UTU\",\n \"UVA\",\n \"VAC\",\n \"VAE\",\n \"VAG\",\n \"VAN\",\n \"VAR\",\n \"VAS\",\n \"VAT\",\n \"VAU\",\n \"VAV\",\n \"VAW\",\n \"VEE\",\n \"VEG\",\n \"VET\",\n \"VEX\",\n \"VIA\",\n \"VID\",\n \"VIE\",\n \"VIG\",\n \"VIM\",\n \"VIN\",\n \"VIS\",\n \"VLY\",\n \"VOE\",\n \"VOL\",\n \"VOR\",\n \"VOW\",\n \"VOX\",\n \"VUG\",\n \"VUM\",\n \"WAB\",\n \"WAD\",\n \"WAE\",\n \"WAG\",\n \"WAI\",\n \"WAN\",\n \"WAP\",\n \"WAR\",\n \"WAS\",\n \"WAT\",\n \"WAW\",\n \"WAX\",\n \"WAY\",\n \"WE\",\n \"WEB\",\n \"WED\",\n \"WEE\",\n \"WEM\",\n \"WEN\",\n \"WET\",\n \"WEX\",\n \"WEY\",\n \"WHA\",\n \"WHO\",\n \"WHY\",\n \"WIG\",\n \"WIN\",\n \"WIS\",\n \"WIT\",\n \"WIZ\",\n \"WO\",\n \"WOE\",\n \"WOF\",\n \"WOG\",\n \"WOK\",\n \"WON\",\n \"WOO\",\n \"WOP\",\n \"WOS\",\n \"WOT\",\n \"WOW\",\n \"WOX\",\n \"WRY\",\n \"WUD\",\n \"WUS\",\n \"WYE\",\n \"WYN\",\n \"XI\",\n \"XIS\",\n \"XU\",\n \"YA\",\n \"YAD\",\n \"YAE\",\n \"YAG\",\n \"YAH\",\n \"YAK\",\n \"YAM\",\n \"YAP\",\n \"YAR\",\n \"YAW\",\n \"YAY\",\n \"YE\",\n \"YEA\",\n \"YEH\",\n \"YEN\",\n \"YEP\",\n \"YES\",\n \"YET\",\n \"YEW\",\n \"YEX\",\n \"YGO\",\n \"YID\",\n \"YIN\",\n \"YIP\",\n \"YO\",\n \"YOB\",\n \"YOD\",\n \"YOK\",\n \"YOM\",\n \"YON\",\n \"YOU\",\n \"YOW\",\n \"YU\",\n \"YUG\",\n \"YUK\",\n \"YUM\",\n \"YUP\",\n \"YUS\",\n \"ZA\",\n \"ZAG\",\n \"ZAP\",\n \"ZAS\",\n \"ZAX\",\n \"ZEA\",\n \"ZED\",\n \"ZEE\",\n \"ZEK\",\n \"ZEL\",\n \"ZEP\",\n \"ZEX\",\n \"ZHO\",\n \"ZIG\",\n \"ZIN\",\n \"ZIP\",\n \"ZIT\",\n \"ZIZ\",\n \"ZO\",\n \"ZOA\",\n \"ZOL\",\n \"ZOO\",\n \"ZOS\",\n \"ZUZ\",\n \"ZZZ\",\n];\n\n\"use strict\";\nvar toTitleCase = function (str) {\n return str.toLowerCase().replace(/\\b\\w/g, function (l) { return l.toUpperCase(); });\n};\nvar capitalizeRegexp = new RegExp(\"(?!(\" + excludeWords.join(\"|\") + \"))(\\\\b[A-Z]{2,3}\\\\b)\", \"gi\");\nvar capitalizeAbbreviations = function (text) {\n //capitalize Abbreviations\n return text.replace(capitalizeRegexp, function (txt) {\n return txt.toUpperCase();\n });\n};\nvar IdMgr;\n(function (IdMgr) {\n function YesNo() {\n return function (input) {\n return input ? \"Yes\" : \"No\";\n };\n }\n IdMgr.YesNo = YesNo;\n function BuySell() {\n return function (input) {\n if (input == 'B') {\n return 'Buy';\n }\n else if (input == 'S') {\n return 'Sell';\n }\n else {\n return input;\n }\n };\n }\n IdMgr.BuySell = BuySell;\n function NotBefore() {\n return function (items, field, notBeforeDate) {\n var filtered = [];\n angular.forEach(items, function (item) {\n if (moment(item[field]).isAfter(notBeforeDate)) {\n filtered.push(item);\n }\n });\n return filtered;\n };\n }\n IdMgr.NotBefore = NotBefore;\n function NotAfter() {\n return function (items, field, notAfterDate) {\n var filtered = [];\n angular.forEach(items, function (item) {\n if (moment(item[field]).isBefore(notAfterDate)) {\n filtered.push(item);\n }\n });\n return filtered;\n };\n }\n IdMgr.NotAfter = NotAfter;\n function DateFilter() {\n return function (items, key, from, to) {\n if (!items) {\n return null;\n }\n var df = moment(from);\n var dt = moment(to);\n var result = [];\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n var itemDateRaw = item[key];\n var itemDate = moment(itemDateRaw);\n if (itemDate.isSameOrAfter(df) && itemDate.isSameOrBefore(dt)) {\n result.push(item);\n }\n }\n return result;\n };\n }\n IdMgr.DateFilter = DateFilter;\n function AccountName() {\n return function (input) {\n return capitalizeAbbreviations(toTitleCase(input));\n };\n }\n IdMgr.AccountName = AccountName;\n function TitleCase() {\n return function (items, filterOn) {\n if (filterOn === false) {\n return items;\n }\n if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {\n angular.forEach(items, function (item) {\n for (var i = 0; i < items.length; i++) {\n items[i][filterOn] = items[i][filterOn].replace(/\\w\\S*/g, function (txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); });\n }\n });\n }\n return items;\n };\n }\n IdMgr.TitleCase = TitleCase;\n function Unique() {\n return function (items, filterOn) {\n if (filterOn === false) {\n return items;\n }\n if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {\n var hashCheck = {}, newItems = [];\n var extractValueToCompare = function (item) {\n if (angular.isObject(item) && angular.isString(filterOn)) {\n return item[filterOn];\n }\n else {\n return item;\n }\n };\n angular.forEach(items, function (item) {\n var valueToCheck, isDuplicate = false;\n for (var i = 0; i < newItems.length; i++) {\n if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {\n isDuplicate = true;\n break;\n }\n }\n if (!isDuplicate) {\n newItems.push(item);\n }\n });\n items = newItems;\n }\n return items;\n };\n }\n IdMgr.Unique = Unique;\n ;\n function Percent() {\n return function (input, precision) {\n precision = precision || 0;\n return (input || 0.0).toFixed(precision) + \"%\";\n };\n }\n IdMgr.Percent = Percent;\n function PlusMinus() {\n return function (input) {\n return input >= 0 ? \"+\" : \"\";\n };\n }\n IdMgr.PlusMinus = PlusMinus;\n function StripHtml() {\n return function (input) {\n return input ? String(input).replace(/<[^>]+>/gm, '') : '';\n };\n }\n IdMgr.StripHtml = StripHtml;\n function ForAccountType() {\n return function (reportTypes, accountType) {\n var filteredList = [];\n angular.forEach(reportTypes, function (reportType, key) {\n if (accountType === \"Accolade\" || accountType === reportType.accountType) {\n filteredList.push(reportType);\n }\n });\n return filteredList;\n };\n }\n IdMgr.ForAccountType = ForAccountType;\n function Abs() {\n return function (input) {\n if (input === null || input === undefined) {\n return input;\n }\n else {\n return Math.abs(input);\n }\n };\n }\n IdMgr.Abs = Abs;\n function ConvertNegative() {\n return function (input) {\n if (input && input.indexOf(\"-\") === 0) {\n input = String(input).replace('-', '');\n var openingParethensis = \"(\";\n input = openingParethensis.concat(input, \")\");\n }\n return input;\n };\n }\n IdMgr.ConvertNegative = ConvertNegative;\n})(IdMgr || (IdMgr = {}));\nvar filtersModule = angular.module(\"app.filters\", []);\nfiltersModule.filter(\"yesNo\", IdMgr.YesNo);\nfiltersModule.filter(\"buySell\", IdMgr.BuySell);\nfiltersModule.filter(\"notBefore\", IdMgr.NotBefore);\nfiltersModule.filter(\"notAfter\", IdMgr.NotAfter);\nfiltersModule.filter(\"unique\", IdMgr.Unique);\nfiltersModule.filter(\"dateFilter\", IdMgr.DateFilter);\nfiltersModule.filter(\"percent\", IdMgr.Percent);\nfiltersModule.filter(\"plusMinus\", IdMgr.PlusMinus);\nfiltersModule.filter(\"stripHtml\", IdMgr.StripHtml);\nfiltersModule.filter(\"forAccountType\", IdMgr.ForAccountType);\nfiltersModule.filter(\"abs\", IdMgr.Abs);\nfiltersModule.filter(\"titleCase\", IdMgr.TitleCase);\nfiltersModule.filter(\"accountName\", IdMgr.AccountName);\nfiltersModule.filter(\"convertNegative\", IdMgr.ConvertNegative);\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n (function (PdfFormatHint) {\n PdfFormatHint[PdfFormatHint[\"None\"] = 0] = \"None\";\n PdfFormatHint[PdfFormatHint[\"Currency\"] = 1] = \"Currency\";\n PdfFormatHint[PdfFormatHint[\"Currency4decPts\"] = 2] = \"Currency4decPts\";\n })(Patersons.PdfFormatHint || (Patersons.PdfFormatHint = {}));\n var PdfFormatHint = Patersons.PdfFormatHint;\n var HeaderTable = (function () {\n function HeaderTable() {\n this.content = {\n style: { fontSize: 8 },\n margin: [-4, 8, 0, 5],\n table: {\n widths: ['auto', '*', 'auto', 'auto'],\n body: []\n }\n };\n }\n HeaderTable.prototype.addRow = function (nameLeft, valueLeft, nameRight, valueRight) {\n this.content.table.body.push([\n { border: [false, false, false, false], text: nameLeft, style: { bold: true, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: valueLeft, style: { bold: false, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: nameRight, style: { bold: true, alignment: 'right', fontSize: 8 } },\n { border: [false, false, false, false], text: valueRight, style: { bold: false, alignment: 'right', fontSize: 8.5 } }]);\n return this;\n };\n return HeaderTable;\n }());\n var PdfTable = (function () {\n function PdfTable(userCompany) {\n this.userCompany = userCompany;\n }\n PdfTable.prototype.setTitle = function (titleText) {\n var headerStyle = titleText ? 'filledHeader' : '';\n this.tableTitle = {\n style: \"tableTitle\",\n table: {\n widths: ['*'],\n body: [[{ text: titleText, style: headerStyle }]]\n },\n layout: 'noBorders'\n };\n return this;\n };\n PdfTable.prototype.setNormalText = function (titleText) {\n this.tableTitle = {\n table: {\n widths: ['*'],\n body: [[{ text: titleText }]]\n },\n layout: 'noBorders'\n };\n return this;\n };\n PdfTable.prototype.setContent = function (dataRows, fieldnames, headings, formatHints, lastRowIsFooter) {\n /*if (fieldnames.length !== headings.length) {\n throw new RangeError('Number of headings should match number of fields in the table.');\n }\n \n if (formatHints !== null && formatHints !== undefined && fieldnames.length !== formatHints.length) {\n throw new RangeError('Number of format hints should match number of fields in the table.');\n }*/\n var headerRow;\n var content = [];\n if (headings != null) {\n headerRow = this.buildHeadings(headings);\n content.push(headerRow);\n }\n var bodyRows = this.buildBody(dataRows, fieldnames, formatHints, lastRowIsFooter);\n content = content.concat(bodyRows);\n var columnWidths = this.calculateColumnWidths(fieldnames.length, content, lastRowIsFooter);\n if (content)\n this.tableBody = {\n layout: this.getTableLayout(headings, lastRowIsFooter),\n table: {\n widths: columnWidths,\n headerRows: 1,\n body: content\n }\n };\n return this;\n };\n PdfTable.prototype.getTableLayout = function (headings, lastRowIsFooter) {\n var _this = this;\n if (headings && lastRowIsFooter) {\n return {\n hLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 1 || i === node.table.body.length - 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineWidth: function (i, node) {\n return 0;\n }\n };\n }\n if (!lastRowIsFooter) {\n return {\n hLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineWidth: function (i, node) {\n return 0;\n }\n };\n }\n else {\n return {\n hLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === node.table.body.length - 1) {\n return 'lightgray';\n }\n else {\n return 'lightgray';\n }\n },\n vLineWidth: function (i, node) {\n return 0;\n }\n };\n }\n };\n PdfTable.prototype.setContentAligned = function (dataRows, fieldnames, headings, formatHints, lastRowIsFooter) {\n /*if (fieldnames.length !== headings.length) {\n throw new RangeError('Number of headings should match number of fields in the table.');\n }\n \n if (formatHints !== undefined && fieldnames.length !== formatHints.length) {\n throw new RangeError('Number of format hints should match number of fields in the table.');\n }*/\n var headerRow;\n var content = [];\n if (headings != null) {\n headerRow = this.buildHeadingsAligned(headings);\n content.push(headerRow);\n }\n var bodyRows = this.buildBody(dataRows, fieldnames, formatHints, lastRowIsFooter);\n content = content.concat(bodyRows);\n var columnWidths = this.calculateColumnWidths(fieldnames.length, content, lastRowIsFooter);\n if (content)\n this.tableBody = {\n layout: this.getTableLayout(headings, lastRowIsFooter),\n table: {\n widths: columnWidths,\n headerRows: 1,\n body: content\n }\n };\n return this;\n };\n PdfTable.prototype.hasTitle = function () {\n return this.tableTitle !== undefined;\n };\n PdfTable.prototype.hasBody = function () {\n return this.tableBody !== undefined;\n };\n PdfTable.prototype.getTitle = function () {\n return this.tableTitle;\n };\n PdfTable.prototype.getBody = function () {\n return this.tableBody;\n };\n PdfTable.prototype.buildHeadings = function (headings) {\n var headerRow = [];\n for (var _i = 0, headings_1 = headings; _i < headings_1.length; _i++) {\n var heading = headings_1[_i];\n headerRow.push({ border: [false, false, false, true], text: heading, style: 'tableHeader' });\n }\n return headerRow;\n };\n PdfTable.prototype.buildHeadingsAligned = function (headings) {\n var headerRow = [];\n for (var _i = 0, headings_2 = headings; _i < headings_2.length; _i++) {\n var heading = headings_2[_i];\n if (heading.type === \"number\")\n headerRow.push({ border: [false, false, false, true], text: heading.text, style: 'tableHeaderNumeric' });\n else\n headerRow.push({ border: [false, false, false, true], text: heading.text, style: 'tableHeader' });\n }\n return headerRow;\n };\n PdfTable.prototype.buildBody = function (dataRows, fieldnames, formatHints, lastRowIsFooter) {\n var tableContent = [];\n for (var i = 0; i < dataRows.length; i++) {\n var dataRow = dataRows[i];\n var tableRow = [];\n for (var j = 0; j < fieldnames.length; j++) {\n var field = fieldnames[j];\n var formatHint = (formatHints !== undefined && formatHints != null) ? formatHints[j] : PdfFormatHint.None;\n var isFooterRow = lastRowIsFooter && i === dataRows.length - 1;\n if (isFooterRow) {\n if (j === 0) {\n dataRow[field] = \"Total\";\n formatHint = PdfFormatHint.None;\n }\n tableRow.push(this.buildTableFooterCell(dataRow[field], formatHint));\n }\n else {\n tableRow.push(this.buildTableCell(dataRow[field], formatHint));\n }\n }\n tableContent.push(tableRow);\n }\n return tableContent;\n };\n PdfTable.prototype.buildTableCell = function (dataField, formatHint) {\n var cell = {\n border: [false, false, false, true],\n text: this.interpretFormatHint(dataField, formatHint),\n style: 'tableCell'\n };\n if (typeof dataField === 'number') {\n cell.style = 'tableCellNumeric';\n }\n return cell;\n };\n PdfTable.prototype.buildTableFooterCell = function (dataField, formatHint) {\n if (!dataField) {\n dataField = \"\";\n }\n var cell = {\n text: this.interpretFormatHint(dataField, formatHint),\n \"border\": [false, true, false, false],\n style: 'footerCell'\n };\n if (typeof dataField === 'number') {\n cell.style = 'footerCellNumeric';\n }\n return cell;\n };\n PdfTable.prototype.interpretFormatHint = function (dataField, formatHint) {\n if (!dataField)\n return \"\";\n switch (formatHint) {\n case PdfFormatHint.None:\n return dataField.toString();\n case PdfFormatHint.Currency:\n return this.formatAsCurrency(dataField);\n case PdfFormatHint.Currency4decPts:\n return this.formatAsCurrency4DecPts(dataField);\n default:\n return this.toString();\n }\n };\n PdfTable.prototype.addCommas = function (nStr) {\n nStr = nStr + '';\n var x = nStr.split('.');\n var x1 = x[0];\n var x2 = x.length > 1 ? '.' + x[1] : '';\n var rgx = /(\\d+)(\\d{3})/;\n while (rgx.test(x1)) {\n x1 = x1.replace(rgx, '$1' + ',' + '$2');\n }\n return x1 + x2;\n };\n PdfTable.prototype.formatAsCurrency4DecPts = function (amount) {\n /*if (value === null || value === undefined) {\n return undefined;\n }\n \n if (typeof value === 'number') {\n return value.toFixed(2);\n } else {\n return value;\n }*/\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\n return '';\n }\n return amount.toFixed(4).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,');\n };\n PdfTable.prototype.formatAsCurrency = function (amount) {\n /*if (value === null || value === undefined) {\n return undefined;\n }\n \n if (typeof value === 'number') {\n return value.toFixed(2);\n } else {\n return value;\n }*/\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\n return '';\n }\n var i = parseFloat(amount);\n if (isNaN(i)) {\n i = 0.00;\n }\n var minus = '';\n if (i < 0) {\n minus = '-';\n }\n i = Math.abs(i);\n i = parseInt(((i + .005) * 100).toString());\n i = i / 100;\n var s = i.toString();\n if (s.indexOf('.') < 0) {\n s += '.00';\n }\n if (s.indexOf('.') === (s.length - 2)) {\n s += '0';\n }\n s = minus + s;\n return this.addCommas(s);\n };\n PdfTable.prototype.calculateColumnWidths = function (numberOfColumns, tableContent, lastRowIsFooter) {\n var columnWidths = this.initialiseColumnWidths(numberOfColumns);\n var widestColumn = 0;\n for (var rowIndex = 0; rowIndex < tableContent.length; rowIndex++) {\n var row = tableContent[rowIndex];\n if (lastRowIsFooter && rowIndex === tableContent.length - 1) {\n continue;\n }\n for (var i = 0; i < row.length; i++) {\n if (row[i].text && row[widestColumn].text) {\n if (row[i].text.length > row[widestColumn].text.length) {\n widestColumn = i;\n }\n }\n }\n }\n columnWidths[widestColumn] = '*';\n return columnWidths;\n };\n PdfTable.prototype.initialiseColumnWidths = function (numberOfColumns) {\n return Array.apply(null, Array(numberOfColumns)).map(function (v) { return 'auto'; });\n };\n return PdfTable;\n }());\n var PdfBuilder = (function () {\n function PdfBuilder(base64logo, userCompany) {\n this.filename = this.generateDefaultFilename();\n this.headings = new Array();\n this.footer = new Array();\n this.tables = new Array();\n this.headerTable = new HeaderTable();\n this.base64logo = base64logo;\n this.userCompany = userCompany;\n this.styles = {\n logo: {\n margin: [0, 0, 0, 10],\n alignment: 'right'\n },\n tableTitle: {\n fontSize: 8,\n margin: [0, 15, 0, 0]\n },\n header: {\n fontSize: 16,\n bold: false,\n margin: [0, 0, 0, 0],\n color: userCompany.colorSecondary\n },\n filledSubHeader: {\n bold: true,\n fontSize: 8,\n color: 'black',\n fillColor: '#D8D8D8',\n margin: [5, 2, 2, 2],\n alignment: 'left'\n },\n subHeader: {\n fontSize: 13,\n bold: false,\n margin: [0, 5, 0, 10],\n color: userCompany.colorSecondary\n },\n headerText: {\n margin: [0, 0, 0, 3],\n fontSize: 6,\n },\n footerText: {\n fontSize: 5,\n bold: false,\n alignment: 'center'\n },\n tableHeader: {\n fontSize: 8,\n bold: true,\n color: userCompany.colorSecondary,\n },\n tableHeaderNumeric: {\n fontSize: 8,\n bold: true,\n color: userCompany.colorSecondary,\n alignment: 'right'\n },\n filledHeader: {\n bold: true,\n fontSize: 8,\n color: 'white',\n fillColor: userCompany.colorSecondary,\n margin: [5, 2, 2, 2],\n alignment: 'left'\n },\n filledHoldingsHeader: {\n bold: true,\n fontSize: 8,\n color: 'black',\n fillColor: 'lightgray',\n margin: [10, 2, 2, 2],\n },\n footerCell: {\n bold: true,\n border: [false, false, false, false],\n fontSize: 8,\n alignment: 'left'\n },\n tableCell: {\n fontSize: 8,\n margin: [0, 0, 0, 0],\n alignment: 'left'\n },\n tableCellBold: {\n fontSize: 8,\n bold: true,\n margin: [0, 0, 0, 0],\n alignment: 'left'\n },\n tableCellNumeric: {\n fontSize: 8,\n margin: [0, 0, 0, 0],\n alignment: 'right'\n },\n footerCellNumeric: {\n bold: true,\n border: [false, false, false, false],\n fontSize: 8,\n alignment: 'right'\n },\n numericValue: {\n alignment: 'right'\n }\n };\n this.docDefinition = {\n pageSize: 'A4',\n pageOrientation: 'landscape',\n pageMargins: [56, 28, 56, 70],\n style: { font: 'arial' },\n content: [\n this.getImageContent()\n ],\n styles: this.styles,\n footer: function (currentPage, pageCount, pageSize) {\n var footerPDF = userCompany && userCompany.footerPDF;\n var footerDisclaimerItems = [];\n if (footerPDF) {\n var $elem = $(\"
\" + footerPDF + \"
\");\n $(\"p\", $elem).each(function () {\n footerDisclaimerItems.push({\n text: $(this).text(),\n style: 'footerText'\n });\n });\n }\n var footer = [\n {\n \"fontSize\": 1,\n margin: [56, 0, 56, 5],\n layout: {\n hLineColor: function (i, node) {\n return 'lightgray';\n }\n },\n \"table\": {\n \"widths\": [\"*\"],\n \"headerRows\": 1,\n \"body\": [\n [\n { \"border\": [false, false, false, true], \"text\": \" \", \"alignment\": \"left\" },\n ],\n ]\n }\n },\n ];\n footer = footer.concat(footerDisclaimerItems);\n footer.push({\n margin: [56, 0, 56, 0],\n style: { fontSize: 5 },\n table: {\n widths: ['*', '*'],\n body: [\n [\n { \"border\": [false, false, false, false], 'text': moment().tz('Australia/Sydney').format('D MMM YYYY h:mm:ss A [AEST]'), \"style\": { 'alignment': 'left' } },\n { \"border\": [false, false, false, false], 'text': 'Page ' + currentPage + ' of ' + pageCount, \"style\": { 'alignment': 'right' } }\n ]\n ]\n }\n });\n return footer;\n }\n };\n }\n PdfBuilder.prototype.getImageContent = function () {\n return {\n image: this.base64logo,\n style: this.styles.logo,\n width: 141,\n height: 43\n };\n };\n PdfBuilder.prototype.setFilename = function (filename) {\n this.filename = filename;\n return this;\n };\n PdfBuilder.prototype.setTitle = function (titleText) {\n this.titleText = titleText;\n return this;\n };\n PdfBuilder.prototype.setSubTitle = function (subTitleText) {\n this.subTitleText = subTitleText;\n return this;\n };\n PdfBuilder.prototype.addHeaderTableRow = function (nameLeft, valueLeft, nameRight, valueRight) {\n this.headerTable.addRow(nameLeft, valueLeft, nameRight, valueRight);\n return this;\n };\n PdfBuilder.prototype.addHeading = function (headingText) {\n this.headings.push(headingText);\n return this;\n };\n PdfBuilder.prototype.addFooter = function (footerText) {\n this.footer.push(footerText);\n return this;\n };\n PdfBuilder.prototype.addTable = function (titleText, dataRows, fieldNames, headings, formatHints, lastRowIsTotal) {\n var table = new PdfTable(this.userCompany);\n if (dataRows == null) {\n dataRows = [];\n }\n if (!dataRows || dataRows.length === 0) {\n return this;\n }\n this.tables.push(table\n .setTitle(titleText)\n .setContent(dataRows, fieldNames, headings, formatHints, lastRowIsTotal));\n return this;\n };\n PdfBuilder.prototype.addTableAligned = function (titleText, dataRows, fieldNames, headings, formatHints, lastRowIsTotal) {\n var table = new PdfTable(this.userCompany);\n if (dataRows == null) {\n dataRows = [];\n }\n if (!dataRows || dataRows.length === 0) {\n return this;\n }\n this.tables.push(table\n .setTitle(titleText)\n .setContentAligned(dataRows, fieldNames, headings, formatHints, lastRowIsTotal));\n return this;\n };\n PdfBuilder.prototype.addNormalText = function (titleText) {\n var table = new PdfTable(this.userCompany);\n this.tables.push(table.setNormalText(titleText));\n return this;\n };\n // Optionally pass in a pre-built document definition, which is just an array\n // of content items, as supported by PdfMake.\n PdfBuilder.prototype.build = function (injectedContent) {\n this.pushTitle();\n this.pushSubTitle();\n this.pushHeaderTable();\n this.pushAllHeadings();\n if (injectedContent && injectedContent.length > 0) {\n this.injectContent(injectedContent);\n }\n else {\n this.pushAllTables();\n }\n //this.pushFooter();\n //console.log(JSON.stringify(this.docDefinition.content));\n return pdfMake.createPdf(this.docDefinition).download(this.filename + '.pdf');\n };\n // Optionally pass in a pre-built document definition, which is just an array\n // of content items, as supported by PdfMake.\n PdfBuilder.prototype.buildContent = function (injectedContent) {\n this.pushTitle();\n this.pushSubTitle();\n this.pushHeaderTable();\n this.pushAllHeadings();\n if (injectedContent && injectedContent.length > 0) {\n this.injectContent(injectedContent);\n }\n else {\n this.pushAllTables();\n }\n //this.pushFooter();\n return this.docDefinition;\n };\n PdfBuilder.prototype.pushTitle = function () {\n if (this.titleText !== undefined) {\n this.docDefinition.content.push({ text: this.titleText, style: 'header' });\n }\n };\n PdfBuilder.prototype.pushSubTitle = function () {\n if (this.subTitleText !== undefined) {\n this.docDefinition.content.push({ text: this.subTitleText, style: 'subHeader' });\n }\n };\n PdfBuilder.prototype.pushHeaderTable = function () {\n if (this.headerTable !== undefined) {\n this.docDefinition.content.push(this.headerTable.content);\n }\n };\n PdfBuilder.prototype.pushAllHeadings = function () {\n var i;\n for (i = 0; i < this.headings.length; i++) {\n this.docDefinition.content.push({ text: this.headings[i], style: 'headerText' });\n }\n };\n PdfBuilder.prototype.getFooter = function () {\n var footerContent = [];\n var i;\n if (this.footer.length > 0) {\n footerContent.push({ text: ' ', fontSize: 8 });\n // add footer line\n footerContent.push({\n \"fontSize\": 8,\n layout: {\n hLineColor: function (i, node) {\n return 'lightgray';\n }\n },\n \"table\": {\n \"widths\": [\"*\"],\n \"headerRows\": 1,\n \"body\": [\n [\n { \"border\": [false, false, false, true], \"text\": \" \", \"alignment\": \"left\" },\n ],\n ]\n }\n });\n footerContent.push({ text: ' ', fontSize: 5 });\n }\n for (i = 0; i < this.footer.length; i++) {\n footerContent.push({ text: this.footer[i], style: 'footerText' });\n }\n return footerContent;\n };\n PdfBuilder.prototype.pushFooter = function () {\n var i;\n if (this.footer.length > 0) {\n this.docDefinition.content.footer.push({ text: ' ', fontSize: 8 });\n // add footer line\n this.docDefinition.content.footer.push({\n \"fontSize\": 8,\n layout: {\n hLineColor: function (i, node) {\n return 'lightgray';\n }\n },\n \"table\": {\n \"widths\": [\"*\"],\n \"headerRows\": 1,\n \"body\": [\n [\n { \"border\": [false, false, false, true], \"text\": \" \", \"alignment\": \"left\" },\n ],\n ]\n }\n });\n this.docDefinition.content.footer.push({ text: ' ', fontSize: 5 });\n }\n for (i = 0; i < this.footer.length; i++) {\n this.docDefinition.content.footer.push({ text: this.footer[i], style: 'footerText' });\n }\n };\n PdfBuilder.prototype.injectContent = function (injectedContent) {\n this.docDefinition.content = this.docDefinition.content.concat(injectedContent);\n };\n PdfBuilder.prototype.pushAllTables = function () {\n for (var _i = 0, _a = this.tables; _i < _a.length; _i++) {\n var table = _a[_i];\n if (table.hasTitle()) {\n this.docDefinition.content.push(table.getTitle());\n }\n if (table.hasBody()) {\n this.docDefinition.content.push(table.getBody());\n }\n }\n };\n PdfBuilder.prototype.generateDefaultFilename = function () {\n // Generate a pseudorandom 16-character string using [0-9a-z].\n var randomString = (Math.random().toString(36) + '00000000000000000').slice(2, 18);\n var timeStamp = new Date();\n return randomString + '-' + timeStamp.toISOString();\n };\n return PdfBuilder;\n }());\n Patersons.PdfBuilder = PdfBuilder;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var PDFBuilderService = (function () {\n function PDFBuilderService($q, userCompanyService) {\n this.q = $q;\n this.userCompanyService = userCompanyService;\n }\n PDFBuilderService.prototype.toDataUrl = function (url, callback) {\n try {\n var xhr = new XMLHttpRequest();\n xhr.onload = function () {\n var reader = new FileReader();\n reader.onloadend = function () {\n callback(reader.result);\n };\n reader.readAsDataURL(xhr.response);\n };\n xhr.open('GET', url);\n xhr.responseType = 'blob';\n xhr.send();\n }\n catch (error) {\n callback(null);\n }\n };\n PDFBuilderService.prototype.newPdfBuilderInstance = function () {\n var _this = this;\n var deferred = this.q.defer();\n this.userCompanyService.getUserCompany().then(function (company) {\n if (!_this.base64logo) {\n _this.toDataUrl(company.companyPdfImage, function (image) {\n if (image) {\n _this.base64logo = image;\n }\n else {\n console.error(\"Could not get logo\");\n }\n var pdfBuilder = new Patersons.PdfBuilder(_this.base64logo, company);\n deferred.resolve(pdfBuilder);\n });\n }\n else {\n var pdfBuilder = new Patersons.PdfBuilder(_this.base64logo, company);\n deferred.resolve(pdfBuilder);\n }\n });\n return deferred.promise;\n };\n ;\n PDFBuilderService.$inject = ['$q', 'userCompanyService'];\n return PDFBuilderService;\n }());\n Patersons.PDFBuilderService = PDFBuilderService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var CsvBuilder = (function () {\n function CsvBuilder() {\n this.filename = this.generateDefaultFilename();\n this.headers = new Array();\n this.data = new Array();\n }\n CsvBuilder.prototype.setFilename = function (filename) {\n if (filename !== null && filename !== undefined) {\n this.filename = filename;\n }\n return this;\n };\n CsvBuilder.prototype.setTopLine = function (topLine) {\n this.topLine = topLine;\n return this;\n };\n CsvBuilder.prototype.setHeaders = function (headers) {\n this.headers = headers;\n return this;\n };\n CsvBuilder.prototype.setData = function (data) {\n this.data = data;\n return this;\n };\n CsvBuilder.prototype.build = function () {\n var blob = this.createCsvFile(this.headers, this.data);\n this.makeCsv(blob);\n };\n CsvBuilder.prototype.makeCsv = function (csvBlob) {\n this.filename += '.csv';\n this.saveFile(this.filename, csvBlob);\n };\n CsvBuilder.prototype.saveFile = function (name, data) {\n if (data !== null && navigator.msSaveBlob)\n return navigator.msSaveBlob(data, name);\n var a = $(\"\");\n var url = window.URL.createObjectURL(data);\n a.attr(\"href\", url);\n a.attr(\"download\", name);\n $(\"body\").append(a);\n a[0].click();\n window.URL.revokeObjectURL(url);\n a.remove();\n };\n CsvBuilder.prototype.createCsvFile = function (headers, data) {\n var EOL = '\\r\\n';\n var csvContent = \"\";\n if (this.topLine != null) {\n csvContent = '\"' + this.topLine + '\"' + EOL;\n }\n csvContent = csvContent + headers.\n map(function (header) { return '\"' + header + '\"'; }).\n join(',') + EOL;\n for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {\n var row = data_1[_i];\n var rowItems = [];\n for (var _a = 0, row_1 = row; _a < row_1.length; _a++) {\n var field = row_1[_a];\n var val = field;\n if (typeof val === 'string') {\n val = val.replace(/\"/g, '\"\"');\n }\n if (typeof val === 'number') {\n rowItems.push(val);\n }\n else {\n rowItems.push('\"' + val + '\"');\n }\n }\n csvContent += rowItems.join(',') + EOL;\n }\n return new Blob([csvContent], { type: 'text/csv;charset=utf-8' });\n };\n CsvBuilder.prototype.generateDefaultFilename = function () {\n // Generate a pseudorandom 16-character string using [0-9a-z].\n var randomString = (Math.random().toString(36) + '00000000000000000').slice(2, 18);\n var timeStamp = new Date();\n return randomString + '-' + timeStamp.toISOString();\n };\n return CsvBuilder;\n }());\n Patersons.CsvBuilder = CsvBuilder;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var TokenService = (function () {\n function TokenService() {\n var model = document.getElementById(\"model\").textContent.trim();\n var dictionary = JSON.parse(model);\n this.oauthSettings = dictionary['oauthSettings'];\n this.tokenManager = new OidcTokenManager(this.oauthSettings);\n }\n return TokenService;\n }());\n Patersons.TokenService = TokenService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var BearerInjector = (function () {\n function BearerInjector($q, tokenService) {\n var _this = this;\n this.request = function (config) {\n if (config.url.indexOf(_this.baseUrl, 0) == 0 || config.url.indexOf(\"assets/templates\") == 0) {\n var token = _this.tokenService.tokenManager.access_token;\n if (token) {\n console.log('Adding authorization header for request: ' + config.url);\n config.headers['Authorization'] = 'Bearer ' + token;\n }\n }\n return config;\n };\n this.responseError = function (response) {\n var x = response;\n console.log(response);\n if (response.status === 401 && response.config.url.indexOf(\"https://api-global.morningstar.com\") === -1) {\n //Store current URL to redirect back to it after login.\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\n _this.tokenService.tokenManager.redirectForToken();\n }\n if (response.status === 403) {\n }\n return _this.q.reject(response);\n };\n this.q = $q;\n this.tokenService = tokenService;\n var model = document.getElementById(\"model\").textContent.trim();\n var dictionary = JSON.parse(model);\n this.baseUrl = dictionary['hostPath'];\n }\n BearerInjector.$inject = ['$q', 'tokenService'];\n return BearerInjector;\n }());\n Patersons.BearerInjector = BearerInjector;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SelectionService = (function () {\n function SelectionService($log) {\n this.log = $log;\n }\n SelectionService.prototype.getSelectedAccount = function (accounts) {\n var _this = this;\n if (accounts && accounts.length > 0) {\n var account = accounts.filter(function (x) { return x.accountId == _this.selectedAccountId; })[0];\n if (account == null) {\n return accounts[0];\n }\n return account;\n }\n return null;\n };\n SelectionService.$inject = ['$log'];\n return SelectionService;\n }());\n Patersons.SelectionService = SelectionService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var BaseService = (function () {\n function BaseService($http, $log, $state, $q, tokenService) {\n this.http = $http;\n this.log = $log;\n this.tokenService = tokenService;\n this.state = $state;\n this.q = $q;\n var model = document.getElementById(\"model\").textContent.trim();\n var dictionary = JSON.parse(model);\n this.baseUrl = dictionary['hostPath'];\n }\n BaseService.prototype.get = function (url) {\n var _this = this;\n var absoluteUrl = this.baseUrl + url;\n this.log.info(\"GET - \" + absoluteUrl);\n var cancel = this.q.defer();\n var config = {\n timeout: cancel.promise,\n cancel: cancel,\n headers: {}\n };\n return this.http.get(absoluteUrl, config)\n .then(function (response) {\n return _this.mapResponseData(response);\n }, function (reason) {\n return _this.errorHandler(reason, \"Error calling GET on \" + absoluteUrl);\n });\n };\n BaseService.prototype.post = function (url, data) {\n var _this = this;\n var absoluteUrl = this.baseUrl + url;\n this.log.info(\"POST - \" + absoluteUrl);\n this.log.info(data);\n return this.http.post(absoluteUrl, data)\n .then(function (response) {\n return _this.mapResponseData(response);\n }, function (reason) {\n return _this.errorHandler(reason, \"Error calling POST on \" + absoluteUrl);\n });\n };\n BaseService.prototype.patch = function (url, data) {\n var _this = this;\n var absoluteUrl = this.baseUrl + url;\n this.log.info(\"PATCH - \" + absoluteUrl);\n this.log.info(data);\n return this.http.patch(absoluteUrl, data)\n .then(function (response) {\n return _this.mapResponseData(response);\n }, function (reason) {\n return _this.errorHandler(reason, \"Error calling PATCH on \" + absoluteUrl);\n });\n };\n BaseService.prototype.put = function (url, data) {\n var _this = this;\n var absoluteUrl = this.baseUrl + url;\n this.log.info(\"PUT - \" + absoluteUrl);\n this.log.info(data);\n return this.http.put(absoluteUrl, data)\n .then(function (response) {\n return _this.mapResponseData(response);\n }, function (reason) {\n return _this.errorHandler(reason, \"Error calling PUT on \" + absoluteUrl);\n });\n };\n BaseService.prototype.delete = function (url) {\n var _this = this;\n var absoluteUrl = this.baseUrl + url;\n this.log.info(\"DELETE - \" + absoluteUrl);\n return this.http.delete(absoluteUrl)\n .then(function (response) {\n return _this.mapResponseData(response);\n }, function (reason) {\n return _this.errorHandler(reason, \"Error calling DELETE on \" + absoluteUrl);\n });\n };\n BaseService.prototype.errorHandler = function (reason, msg) {\n msg = msg || \"Unexpected Error\";\n if (reason.data && reason.data.exceptionMessage) {\n this.log.error(reason.data);\n }\n if (reason.status === 401) {\n //Unauthorized\n //Store current URL to redirect back to it after login.\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\n this.tokenService.tokenManager.redirectForToken();\n }\n if (reason.status === 403) {\n // forbidden\n if (reason.data != 'Please verify code send via SMS') {\n this.state.go('forbidden');\n }\n }\n /*if (reason.status === 404) {\n // forbidden\n this.state.go('otherwise');\n }*/\n /*if (reason.status === 500) {\n // internal server error\n this.state.go('error');\n }*/\n throw reason;\n };\n BaseService.prototype.mapResponseData = function (response) {\n console.log(response.config.url);\n if (response.data !== null &&\n response.data !== undefined &&\n response.data.value !== null &&\n response.data.value !== undefined) {\n return response.data.value;\n }\n else if (response.data !== undefined &&\n response.data !== null) {\n return response.data;\n }\n else {\n return response;\n }\n };\n BaseService.$inject = ['$http', '$log', '$state', '$q', 'tokenService'];\n return BaseService;\n }());\n Patersons.BaseService = BaseService;\n})(Patersons || (Patersons = {}));\n\n\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var IdentityService = (function (_super) {\n __extends(IdentityService, _super);\n function IdentityService() {\n _super.apply(this, arguments);\n }\n IdentityService.prototype.triggerForgottenPan = function (forgottenPanDetails) {\n return this.post(\"/identity/api/account/ForgottenPan\", forgottenPanDetails);\n };\n ;\n IdentityService.prototype.triggerForgottenPassword = function (forgottenPasswordDetails) {\n return this.post(\"/identity/api/account/ForgottenPassword\", forgottenPasswordDetails);\n };\n ;\n IdentityService.prototype.changePassword = function (changePasswordDetails) {\n return this.post(\"/identity/api/account/ChangePassword\", changePasswordDetails);\n };\n ;\n IdentityService.prototype.changeEmail = function (changeEmailDetails) {\n return this.post(\"/identity/api/account/ChangeEmail\", changeEmailDetails);\n };\n ;\n IdentityService.prototype.changeMobileNumber = function (phoneDetails) {\n return this.post(\"/identity/api/account/ChangeMobileNumber\", phoneDetails);\n };\n ;\n IdentityService.prototype.confirmMobileNumberChange = function (phoneDetails) {\n return this.post(\"/identity/api/account/ConfirmSms\", phoneDetails);\n };\n ;\n IdentityService.prototype.setPassword = function (setPasswordDetails) {\n return this.post(\"/identity/api/account/SetPassword\", setPasswordDetails);\n };\n ;\n IdentityService.prototype.request2FAToken = function () {\n return this.post(\"/identity/api/account/Request2FAToken\", null);\n };\n ;\n IdentityService.prototype.getSkipMobileRegistration = function () {\n return this.get(\"/identity/api/account/GetSkipMobileRegistration\");\n };\n ;\n IdentityService.prototype.getIsPhoneNumberVerifyed = function () {\n return this.get(\"/identity/api/account/IsPhoneNumberVerifyed\");\n };\n ;\n IdentityService.prototype.getPhoneNumber = function () {\n return this.get(\"/identity/api/account/GetPhoneNumber\");\n };\n ;\n IdentityService.prototype.getUserAddressDetails = function () {\n return this.get(\"/identity/api/account/GetUserAddressDetails\");\n };\n IdentityService.prototype.saveSkipMobileRegistration = function (skipMobileDetails) {\n return this.post(\"/identity/api/account/SaveSkipMobileRegistration\", skipMobileDetails);\n };\n ;\n return IdentityService;\n }(Patersons.BaseService));\n Patersons.IdentityService = IdentityService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var AnalysisService = (function (_super) {\n __extends(AnalysisService, _super);\n function AnalysisService() {\n _super.apply(this, arguments);\n }\n AnalysisService.prototype.getWatchlists = function () {\n return this.get(\"/dataService/odata/watchlists\");\n };\n ;\n AnalysisService.prototype.getAWatchlist = function (watchlistId) {\n return this.get(\"/dataService/odata/watchlists(\" + watchlistId + \")\");\n };\n ;\n AnalysisService.prototype.patchWatchlist = function (watchlist) {\n return this.patch(\"/dataService/odata/watchlists(\" + watchlist.id + ')', watchlist);\n };\n ;\n AnalysisService.prototype.postWatchlist = function (newWatchlist) {\n return this.post(\"/dataService/odata/watchlists\", newWatchlist);\n };\n ;\n AnalysisService.prototype.deleteWatchlist = function (watchlistId) {\n return this.delete(\"/dataService/odata/watchlists(\" + watchlistId + \")\");\n };\n ;\n return AnalysisService;\n }(Patersons.BaseService));\n Patersons.AnalysisService = AnalysisService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SessionTimeoutModalCtrl = (function () {\n function SessionTimeoutModalCtrl($scope, $uibModalInstance, currentState) {\n this.scope = $scope;\n this.scope.currentState = currentState;\n this.modalInstance = $uibModalInstance;\n this.scope.events = this;\n }\n SessionTimeoutModalCtrl.prototype.close = function (data) {\n this.modalInstance.close(data);\n };\n ;\n SessionTimeoutModalCtrl.prototype.dismiss = function (data) {\n this.modalInstance.dismiss(data);\n };\n ;\n SessionTimeoutModalCtrl.$inject = ['$scope', '$uibModalInstance', 'currentState'];\n return SessionTimeoutModalCtrl;\n }());\n Patersons.SessionTimeoutModalCtrl = SessionTimeoutModalCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SessionService = (function () {\n function SessionService(tokenService, $rootScope, $uibModal, $uibModalStack, $analytics) {\n var _this = this;\n this.sessionTimeoutHandler = null;\n this.sessionPreTimeoutHandler = null;\n this.sessionTimeoutKey = '$psl.sessionTimeout';\n this.tokenService = tokenService;\n this.modalInstance = $uibModal;\n this.modalStack = $uibModalStack;\n this.$analytics = $analytics;\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n var session = _this.checkSession();\n // if (!session) {\n // event.preventDefault();\n // return;\n // }\n });\n }\n SessionService.prototype.setSessionExpiringModal = function () {\n var _this = this;\n this.modalStack.dismissAll();\n this.openModal = this.modalInstance.open({\n templateUrl: 'assets/templates/common/sessionTimeoutModal.html',\n size: 'sm',\n controller: Patersons.SessionTimeoutModalCtrl,\n keyboard: false,\n backdrop: 'static',\n openedClass: 'timeout-modal',\n resolve: {\n currentState: function () { return 'expiring'; }\n }\n }).result.then(function (result) {\n if (result == 'yes') {\n _this.checkSession();\n }\n });\n };\n SessionService.prototype.setSessionExpiredModal = function () {\n var _this = this;\n this.modalStack.dismissAll();\n this.openModal = this.modalInstance.open({\n templateUrl: 'assets/templates/common/sessionTimeoutModal.html',\n size: 'sm',\n controller: Patersons.SessionTimeoutModalCtrl,\n keyboard: false,\n backdrop: 'static',\n openedClass: 'timeout-modal',\n resolve: {\n currentState: function () { return 'expired'; }\n }\n }).result.then(function (result) {\n if (result == 'ok') {\n _this.handleSessionTimedout();\n }\n });\n };\n SessionService.prototype.checkSession = function () {\n var _this = this;\n console.log('checking timeout');\n var sessionTimeoutExists = localStorage.getItem(this.sessionTimeoutKey);\n var now = new Date();\n var timeout = new Date(+sessionTimeoutExists);\n var isLoggedIn = this.isLoggedIn();\n var timeoutInMinutes = 20;\n clearTimeout(this.sessionTimeoutHandler);\n clearTimeout(this.sessionPreTimeoutHandler);\n if (isLoggedIn) {\n if ((now > timeout) && sessionTimeoutExists) {\n console.log('timedout');\n //need to log user out here\n this.setSessionExpiredModal();\n return false;\n }\n else {\n var timeout_1 = now.getTime() + (timeoutInMinutes * 60 * 1000); // add x minutes\n console.log('extending session');\n localStorage.setItem(this.sessionTimeoutKey, timeout_1.toString());\n this.sessionPreTimeoutHandler = setTimeout(function () {\n console.log(\"Timeout is coming up\");\n _this.setSessionExpiringModal();\n }, (timeout_1 - (1 * 60 * 1000)) - now.getTime()); // 1 minute before\n this.sessionTimeoutHandler = setTimeout(function () {\n console.log(\"Timeout is past\");\n _this.setSessionExpiredModal();\n }, (timeout_1) - now.getTime()); // timeout has passed\n return true;\n }\n }\n else {\n localStorage.removeItem(this.sessionTimeoutKey);\n return true;\n }\n };\n SessionService.prototype.handleSessionTimedout = function () {\n window.stop();\n localStorage.removeItem(this.sessionTimeoutKey);\n this.$analytics.eventTrack('Logout Session Timed Out', {\n category: 'Logout'\n });\n window.location = \"/identity/connect/endsession\";\n // this.tokenService.tokenManager.redirectForLogout();\n return false;\n };\n SessionService.prototype.login = function () {\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\n this.tokenService.tokenManager.redirectForToken();\n };\n SessionService.prototype.logout = function () {\n this.$analytics.eventTrack('Logout Success', {\n category: 'Logout'\n });\n this.tokenService.tokenManager.removeToken();\n window.location = \"/identity/connect/endsession\";\n // this.tokenService.tokenManager.redirectForLogout();\n };\n SessionService.prototype.isLoggedIn = function () {\n return this.tokenService.tokenManager && !this.tokenService.tokenManager.expired;\n };\n SessionService.prototype.getCurrentUserProfile = function () {\n if (this.isLoggedIn()) {\n return this.tokenService.tokenManager.profile;\n }\n else {\n this.login();\n }\n };\n SessionService.$inject = ['tokenService', '$rootScope', '$uibModal', '$uibModalStack', '$analytics'];\n return SessionService;\n }());\n Patersons.SessionService = SessionService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SizeDetectorService = (function () {\n function SizeDetectorService() {\n this.initSizeDetector();\n }\n SizeDetectorService.prototype.initSizeDetector = function () {\n var _this = this;\n console.log(\"initializing size detector\");\n $(document).ready(function ($) {\n _this.$html = $('html');\n $(window).resize(function () {\n _this.checkWidth();\n });\n //Fire it when the page first loads:\n _this.checkWidth();\n });\n };\n SizeDetectorService.prototype.checkWidth = function () {\n var windowWidth = document.body.clientWidth;\n this.$html.removeClass('table-xSmall table-small table-medium table-large');\n if (windowWidth < 569) {\n return this.$html.addClass('table-small');\n }\n else if (windowWidth >= 569 && windowWidth < 1024) {\n return this.$html.addClass('table-medium');\n }\n else if (windowWidth > 1024) {\n return this.$html.addClass('table-large');\n }\n };\n ;\n return SizeDetectorService;\n }());\n Patersons.SizeDetectorService = SizeDetectorService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var MorningStarService = (function () {\n function MorningStarService() {\n this.getRecentResearch = function (filterBy1Year) {\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: \"https://content.morningstar.com.au/equityxml/customResearchReportXml?client=canaccordgenuity&format=json&v=2&rowsreturn=everything\",\n type: \"GET\",\n }).then(function (res) {\n if (res && res.customArcResearchList) {\n if (filterBy1Year) {\n var oneYearAgo = new Date();\n oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);\n var filteredItems = res.customArcResearchList.filter(function (item) {\n var date = new Date(item.dateWritten);\n return date >= oneYearAgo;\n });\n resolve(filteredItems);\n }\n else {\n resolve(res.customArcResearchList);\n }\n }\n else {\n resolve(null);\n }\n }).fail(function (res) {\n resolve(res);\n });\n });\n };\n this.getASXAnnouncementsDocument = function (path) {\n var query = {\n path: path\n };\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: \"/financeService/Morningstar/GetASXAnnouncementDocument\",\n data: query,\n type: \"GET\",\n }).then(function (res) {\n resolve(res);\n }).fail(function (res) {\n resolve(res);\n });\n });\n };\n this.getASXAnnouncements = function (asxcode, dateRange, page) {\n var query = {};\n if (asxcode) {\n query.asxcode = asxcode;\n }\n if (dateRange) {\n query.dateRange = dateRange;\n }\n if (page) {\n query.page = page;\n }\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: \"/financeService/Morningstar/GetASXAnnouncements\",\n data: query,\n type: \"GET\",\n }).then(function (res) {\n resolve(res);\n }).fail(function (res) {\n resolve(res);\n });\n });\n };\n }\n MorningStarService.prototype.mapAgilityExchangeCodeToMIC = function (exchangeCode) {\n switch (exchangeCode) {\n case \"HKE\":\n case \"HKG\":\n exchangeCode = \"EX$$$$XHKG\";\n break;\n case \"SGX\":\n case \"SES\":\n exchangeCode = \"EX$$$$XSES\";\n break;\n case \"NAS\":\n exchangeCode = \"EX$$$$XNAS\";\n break;\n case \"NYS\":\n exchangeCode = \"EX$$$$XNYS\";\n break;\n case \"AME\":\n case \"ASE\":\n exchangeCode = \"EX$$$$XASE\";\n break;\n case \"LSE\":\n case \"LON\":\n exchangeCode = \"EX$$$$XLON\";\n break;\n case \"ETR\":\n case \"FRA\":\n exchangeCode = \"EX$$$$XFRA\";\n break;\n case \"PAR\":\n exchangeCode = \"EX$$$$XPAR\";\n break;\n case \"ARC\":\n case \"ARCX\":\n exchangeCode = \"EX$$$$ARCX\";\n break;\n case \"AMS\":\n exchangeCode = \"EX$$$$XAMS\";\n break;\n case \"MAD\":\n case \"MCE\":\n exchangeCode = \"EX$$$$XMCE\";\n break;\n case \"MTA\":\n case \"MIL\":\n exchangeCode = \"EX$$$$XMIL\";\n break;\n case \"AXW\":\n case \"ASX\":\n exchangeCode = \"EX$$$$XASX\";\n break;\n default:\n exchangeCode = \"UNL\";\n break;\n }\n return exchangeCode;\n };\n MorningStarService.prototype.getMorningStarDataForSecurityCode = function (exchangeCode, securityCode) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (!exchangeCode || !securityCode) {\n resolve(null);\n return;\n }\n // replace : with . for the M* API\n var symbol = securityCode.replace(/:/g, \".\");\n // need to append 0 to HKG/KHE security codes\n if (exchangeCode == \"HKE\" || exchangeCode == \"HKG\") {\n symbol = \"0\" + symbol;\n }\n $.ajax({\n url: \"https://lt.morningstar.com/api/rest.svc/4ostbpo1me/security/screener?page=1&pageSize=1&sortOrder=name=asc&outputType=json&version=1&languageId=en-AU¤cyId=AUD&universeIds=UNIVE$$ALL&securityDataPoints=holdingTypeId%7CSecId%7CAPIR%7CName%7CExchangeCode%7CSymbol%7CFundShareClassId&filters=ExchangeID:EQ:\" + _this.mapAgilityExchangeCodeToMIC(exchangeCode) + \"|Symbol:EQ:\" + symbol,\n type: \"GET\",\n }).then(function (res) {\n if (res.total > 0) {\n resolve(res.rows[0]);\n }\n else {\n resolve(null);\n }\n }).fail(function (res) {\n resolve(res);\n });\n });\n };\n MorningStarService.prototype.getMorningStarDataForSecurityId = function (securityId) {\n return new Promise(function (resolve, reject) {\n $.ajax({\n url: \"https://lt.morningstar.com/api/rest.svc/4ostbpo1me/security/screener?page=1&pageSize=1&sortOrder=name=asc&outputType=json&version=1&languageId=en-AU¤cyId=AUD&universeIds=UNIVE$$ALL&securityDataPoints=holdingTypeId%7CSecId%7CAPIR%7CName%7CExchangeCode%7CSymbol%7CFundShareClassId&filters=SecId:EQ:\" + securityId,\n type: \"GET\",\n }).then(function (res) {\n if (res.total > 0) {\n resolve(res.rows[0]);\n }\n else {\n resolve(null);\n }\n }).fail(function (res) {\n resolve(res);\n });\n });\n };\n return MorningStarService;\n }());\n Patersons.MorningStarService = MorningStarService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var NavigationService = (function () {\n function NavigationService() {\n this.sections = ['dashboard', 'portfolio', 'analysis', 'research'];\n }\n NavigationService.prototype.activateSection = function (section) {\n this.deactivateAll();\n var sectionDiv = angular.element(document.querySelector('#' + section + '-section'));\n sectionDiv.addClass('active-section');\n };\n NavigationService.prototype.deactivateSection = function (section) {\n var sectionDiv = angular.element(document.querySelector('#' + section + '-section'));\n sectionDiv.removeClass('active-section');\n };\n NavigationService.prototype.deactivateAll = function () {\n for (var _i = 0, _a = this.sections; _i < _a.length; _i++) {\n var section = _a[_i];\n var sectionDiv = angular.element(document.querySelector('#' + section + '-section'));\n sectionDiv.removeClass('active-section');\n }\n };\n return NavigationService;\n }());\n Patersons.NavigationService = NavigationService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ClientConfigService = (function (_super) {\n __extends(ClientConfigService, _super);\n function ClientConfigService() {\n _super.apply(this, arguments);\n }\n ClientConfigService.prototype.getAdviser = function () {\n return this.get(\"/dataService/api/adviser\");\n };\n ;\n ClientConfigService.prototype.getChangeRequestCount = function () {\n return this.get(\"/dataService/odata/changeRequests/ChangeRequestService.GetChangeRequestsForApprovalCount\");\n };\n return ClientConfigService;\n }(Patersons.BaseService));\n Patersons.ClientConfigService = ClientConfigService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n (function (ResearchPublicationType) {\n ResearchPublicationType[ResearchPublicationType[\"AustralianInvestor\"] = \"AustralianInvestor\"] = \"AustralianInvestor\";\n ResearchPublicationType[ResearchPublicationType[\"MorningMarket\"] = \"MorningMarket\"] = \"MorningMarket\";\n ResearchPublicationType[ResearchPublicationType[\"WeeklyMarketWrap\"] = \"WeeklyMarketWrap\"] = \"WeeklyMarketWrap\";\n })(Patersons.ResearchPublicationType || (Patersons.ResearchPublicationType = {}));\n var ResearchPublicationType = Patersons.ResearchPublicationType;\n var MyDetailsService = (function (_super) {\n __extends(MyDetailsService, _super);\n function MyDetailsService() {\n _super.apply(this, arguments);\n }\n MyDetailsService.prototype.getAccoladeOptions = function () {\n return this.get(\"/dataService/odata/accoladeoptions/Holdings.GetByUserId\");\n };\n ;\n MyDetailsService.prototype.updateAccoladeOptions = function (accoladeOptions) {\n return this.put(\"/dataService/odata/accoladeoptions(\" + accoladeOptions.id + \")\", accoladeOptions);\n };\n ;\n MyDetailsService.prototype.getResearchSubscriptions = function () {\n return this.get(\"/dataService/api/ResearchSubscriptions\");\n };\n ;\n MyDetailsService.prototype.getResearchSubscription = function (publication) {\n return this.get(\"/dataService/api/ResearchSubscriptions/\" + publication);\n };\n ;\n MyDetailsService.prototype.updateResearchSubscriptions = function (data) {\n return this.patch(\"/dataService/api/ResearchSubscriptions\", data.reduce(function (acc, curr) {\n if (curr.enabled) {\n acc[curr.id] = curr.isSubscribed;\n }\n return acc;\n }, {}));\n };\n ;\n return MyDetailsService;\n }(Patersons.BaseService));\n Patersons.MyDetailsService = MyDetailsService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PortfolioService = (function (_super) {\n __extends(PortfolioService, _super);\n function PortfolioService($http, $log, $state, $q, tokenService) {\n _super.call(this, $http, $log, $state, $q, tokenService);\n this.portfolios = {};\n this.portfolioOrder = [];\n }\n PortfolioService.prototype.getPortfolioOrder = function () {\n var _this = this;\n this.portfolioOrder = [];\n return this.get(\"/dataService/api/Portfolios/GetPortfolioOrder\").then(function (results) {\n _this.portfolioOrder = results;\n }, function (reason) {\n console.log('No order data loaded ');\n _this.log.error(reason);\n });\n };\n PortfolioService.prototype.getPortfolios = function (accounts) {\n var _this = this;\n this.portfolios = {};\n if (!Array.isArray(accounts)) {\n accounts = [accounts];\n }\n var allPromises = new Array();\n var _loop_1 = function() {\n var accountCode = accounts[i];\n foundPortolio = this_1.portfolios[accountCode];\n if (foundPortolio === undefined) {\n this_1.log.debug(\"Load portfolio with accountCode: \" + accountCode);\n allPromises.push(this_1.get(\"/dataService/api/Portfolios/\" + accountCode)\n .then(function (results) {\n _this.log.info(results);\n results.summaryError = false;\n _this.portfolios[accountCode] = results;\n _this.log.info(_this.portfolios[accountCode]);\n }, function (reason) {\n // error handling: can't get account details\n console.log('No account data loaded ' + accountCode);\n var accountPlaceholder = new Patersons.Account();\n accountPlaceholder.accountId = accountCode;\n accountPlaceholder.accountName = 'Currently Unavailable';\n accountPlaceholder.summaryError = true;\n _this.portfolios[accountCode] = accountPlaceholder;\n _this.log.info(_this.portfolios[accountCode]);\n _this.log.error(reason);\n }));\n }\n };\n var this_1 = this;\n var foundPortolio;\n for (var i = 0; i < accounts.length; i++) {\n _loop_1();\n }\n return Promise.all(allPromises);\n };\n PortfolioService.prototype.getCombinedPortfolioData = function () {\n var _this = this;\n if (!this.tokenService.tokenManager.profile) {\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\n this.tokenService.tokenManager.redirectForToken();\n // this.state.go('dashboard')\n throw \"Get Profile first\";\n }\n var acccounts = [];\n if (this.tokenService.tokenManager.profile[\"account\"]) {\n if (this.tokenService.tokenManager.profile[\"account\"] instanceof Array) {\n acccounts = this.tokenService.tokenManager.profile[\"account\"];\n }\n else {\n acccounts = [this.tokenService.tokenManager.profile[\"account\"]];\n }\n }\n var agacccounts = [];\n if (this.tokenService.tokenManager.profile[\"agaccount\"]) {\n if (this.tokenService.tokenManager.profile[\"agaccount\"] instanceof Array) {\n agacccounts = this.tokenService.tokenManager.profile[\"agaccount\"];\n }\n else {\n agacccounts = [this.tokenService.tokenManager.profile[\"agaccount\"]];\n }\n }\n acccounts = acccounts.concat(agacccounts);\n return new Promise(function (resolve, reject) {\n _this.getPortfolios(acccounts)\n .then(function (result) {\n return _this.getPortfolioOrder();\n })\n .then(function (result) {\n _this.log.info('All portfolios loaded' + _this.portfolios);\n var accounts = new Array();\n for (var key in _this.portfolios) {\n _this.log.info(key);\n var account = _this.portfolios[key];\n account.isAuthorisedAgentAccount = (agacccounts.indexOf(account.accountId) > -1);\n accounts.push(account);\n }\n // order the accounts\n var accountsOrdered = new Array();\n _this.portfolioOrder.forEach(function (portfolioOrder) {\n var account = accounts.filter(function (account) {\n return account.accountId === portfolioOrder.accountId;\n });\n if (account && account[0]) {\n accountsOrdered.push(account[0]);\n }\n });\n // add the rest of the accounts as before\n accounts.sort(function (a, b) {\n return a.accountId > b.accountId ? 1 : ((b.accountId > a.accountId) ? -1 : 0);\n }).forEach(function (account) {\n if (accountsOrdered.indexOf(account) === -1) {\n accountsOrdered.push(account);\n }\n });\n resolve(accountsOrdered);\n });\n });\n };\n ;\n PortfolioService.prototype.getPortfolioData = function () {\n var _this = this;\n if (!this.tokenService.tokenManager.profile) {\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\n this.tokenService.tokenManager.redirectForToken();\n }\n var acccounts = [];\n if (this.tokenService.tokenManager.profile[\"account\"] instanceof Array) {\n acccounts = this.tokenService.tokenManager.profile[\"account\"];\n }\n else {\n acccounts = [this.tokenService.tokenManager.profile[\"account\"]];\n }\n return this.getPortfolios(acccounts)\n .then(function (result) {\n _this.log.info('All portfolios loaded' + _this.portfolios);\n var accounts = new Array();\n for (var key in _this.portfolios) {\n _this.log.info(key);\n var account = _this.portfolios[key];\n account.isAuthorisedAgentAccount = false;\n accounts.push(account);\n }\n return accounts.sort(function (a, b) {\n return a.accountId > b.accountId ? 1 : ((b.accountId > a.accountId) ? -1 : 0);\n });\n });\n };\n ;\n // get dashboard -> account -> header values\n PortfolioService.prototype.getTopSectors = function (accountCode) {\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/topSectors\");\n };\n PortfolioService.prototype.getTopAssetClass = function (accountCode) {\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/topAssetClass\");\n };\n PortfolioService.prototype.getAccoladeTopSectors = function (accountCode) {\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/AccoladeTopSectors\");\n };\n PortfolioService.prototype.getAccoladeTopAssetClass = function (accountCode) {\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/AccoladeTopAssetClass\");\n };\n PortfolioService.prototype.getAccoladeHoldings = function (accountCode) {\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/AccoladeHoldings\");\n };\n PortfolioService.prototype.updateTaxFileNumber = function (accountCode, taxFileNumber, taxFileNumberType) {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetTaxFileNumber', '{\"Number\": \"' + taxFileNumber + '\", \"TaxFileNumberType\": \"' + taxFileNumberType + '\"}');\n };\n PortfolioService.prototype.updateBankDetails = function (accountCode, bankDetails) {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetBankAccount', bankDetails);\n };\n ;\n PortfolioService.prototype.updateAllBankDetails = function (accountCode, bankDetails) {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetAllBankAccounts', bankDetails);\n };\n ;\n PortfolioService.prototype.updatePostalAddressDetails = function (accountCode, addressDetail) {\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetPostalAddress\", addressDetail);\n };\n ;\n PortfolioService.prototype.updateResidentialAddressDetails = function (accountCode, addressDetail) {\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetResidentialAddress\", addressDetail);\n };\n ;\n PortfolioService.prototype.updateRegistrationAddressDetails = function (accountCode, addressDetail) {\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetRegistrationAddress\", addressDetail);\n };\n ;\n /*updateAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetAddress\", addressDetail);\n };\n \n updateSensitiveAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetSensitiveAddress', addressDetail);\n };*/\n PortfolioService.prototype.updateEmailAddress = function (accountCode, emailAddress) {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetEmailAddress', emailAddress);\n };\n ;\n PortfolioService.prototype.updateSensitiveEmailAddress = function (accountCode, emailAddress) {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetSensitiveEmailAddress', emailAddress);\n };\n ;\n PortfolioService.prototype.updatePhoneNumbers = function (accountCode, account) {\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetPhoneNumber', account);\n };\n ;\n PortfolioService.prototype.getInternationalShares = function (accountId) {\n return this.get(\"/dataService/api/Shares/\" + accountId + '/International');\n };\n ;\n PortfolioService.prototype.getInternationalSharesForHoldings = function (account) {\n if (account.accountType && account.accountType.toUpperCase() === 'STANDARD') {\n return this.get(\"/dataService/api/Shares/\" + account.accountId + '/InternationalStandard');\n }\n else {\n return this.get(\"/dataService/api/Shares/\" + account.accountId + '/InternationalAccolade');\n }\n };\n ;\n PortfolioService.prototype.getShares = function (accountId) {\n return this.get(\"/dataService/api/Shares/\" + accountId);\n };\n ;\n PortfolioService.prototype.getCombinedShares = function (accountId) {\n return this.get(\"/dataService/api/Shares/\" + accountId + \"/All\");\n };\n ;\n PortfolioService.prototype.getCashAccounts = function (accountId) {\n return this.get(\"/dataService/api/CashAccounts/\" + accountId);\n };\n ;\n PortfolioService.prototype.getHighInterestCashAccounts = function (accountId) {\n return this.get(\"/dataService/api/CashAccounts/\" + accountId + \"/HighInterest\");\n };\n ;\n PortfolioService.prototype.getTermDeposits = function (accountId) {\n return this.get(\"/dataService/api/TermDeposits/\" + accountId);\n };\n ;\n PortfolioService.prototype.getPortfolioValue = function (account) {\n if (account.accountType && account.accountType.toUpperCase() === 'STANDARD') {\n return this.get(\"/dataService/api/StandardPortfolioValue/\" + account.accountId);\n }\n else {\n return this.get(\"/dataService/api/AccoladePortfolioValue/\" + account.accountId);\n }\n };\n ;\n PortfolioService.prototype.getBackdatedPortfolioData = function (accountCode, asAt) {\n return this.get(\"/dataService/api/BackdatedHolding/\" + accountCode + \"/\" + moment(asAt).format(\"YYYY-MM-DD\"));\n };\n ;\n PortfolioService.prototype.getContractNotes = function (accountCode, dateFrom, dateTo) {\n return this.get(\"/dataService/api/ContractNotes/\" + accountCode + \"/\" + moment(dateFrom).format(\"YYYY-MM-DD\") + \"/\" + moment(dateTo).format(\"YYYY-MM-DD\"));\n };\n ;\n PortfolioService.prototype.getMarketOrders = function (accountCode) {\n return this.get(\"/dataService/api/MarketOrders/\" + accountCode);\n };\n ;\n PortfolioService.prototype.getOrderDepthData = function (securityCode) {\n return this.get(\"/financeService/OrderDepth/\" + securityCode);\n };\n ;\n PortfolioService.prototype.placeOrderRequest = function (details) {\n return this.post(\"/dataService/odata/OrderRequests\", details);\n };\n ;\n PortfolioService.prototype.getOrderRequests = function () {\n return this.get(\"/dataService/odata/OrderRequests/\");\n };\n ;\n PortfolioService.prototype.createCancelOrder = function (order) {\n return this.post(\"/dataService/odata/OrderRequests\", order);\n };\n ;\n PortfolioService.$inject = ['$http', '$log', '$state', '$q', 'tokenService'];\n return PortfolioService;\n }(Patersons.BaseService));\n Patersons.PortfolioService = PortfolioService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ReportService = (function (_super) {\n __extends(ReportService, _super);\n function ReportService() {\n _super.apply(this, arguments);\n }\n ReportService.prototype.getFile = function (url) {\n var _this = this;\n this.log.info(\"reportService getting binary pdf data for\" + url);\n return this.http.get(url, { responseType: 'arraybuffer' })\n .then(function (data) {\n var file = new Blob([data], { type: 'application/pdf' });\n var fileURL = URL.createObjectURL(file);\n window.open(fileURL);\n }, function (reason) { return _this.errorHandler(reason, \"Error retrieving binary pdf data\"); });\n };\n ;\n ReportService.prototype.getAllAccoladeNotifications = function () {\n this.log.info(\"reportService getting investor docs notifications\");\n return this.get('/dataService/api/InvestorDocs/GetAllNotifications');\n };\n ReportService.prototype.acknowledgeAccoladeNotifications = function () {\n this.log.info(\"reportService acknolegding investor docs notifications\");\n return this.get('/dataService/api/InvestorDocs/AcknowledgeAllNotifications');\n };\n ReportService.prototype.getReport = function (reportType, accountCode, dateFrom, dateTo) {\n return this.get(\"/dataService/api/Reporting?reportType=\" + reportType + \"&accountCode=\" + accountCode + \"&dateFrom=\" + dateFrom.toISOString() + \"&dateTo=\" + dateTo.toISOString());\n };\n ;\n ReportService.prototype.checkFreezeWindow = function () {\n return this.get(\"/dataService/api/Reporting/CheckFreezeWindow\");\n };\n ;\n return ReportService;\n }(Patersons.BaseService));\n Patersons.ReportService = ReportService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ReportDownloadService = (function () {\n function ReportDownloadService($q, $filter, pdfBuilderService, userCompanyService) {\n var _this = this;\n this.q = $q;\n this.filter = $filter;\n this.pdfBuilderService = pdfBuilderService;\n this.userCompanyService = userCompanyService;\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.userCompany = company;\n });\n this.pdfBuilderService.newPdfBuilderInstance().then(function (pdfBuilder) {\n _this.pdfBuilder = pdfBuilder;\n });\n }\n ReportDownloadService.prototype.downloadPdfFile = function (report, account) {\n var _this = this;\n this.report = report;\n this.account = account;\n var fileName = this.getFileName();\n this.getPdfTemplateDefinition().then(function (def) {\n var reportDefinition = _this.getReportDefinition(def);\n //console.log(JSON.stringify(reportDefinition));\n pdfMake.createPdf(reportDefinition).download(fileName + '.pdf');\n });\n };\n ;\n ReportDownloadService.prototype.downloadCsvFile = function (report, account) {\n this.report = report;\n this.account = account;\n var fileName = this.getFileName();\n this.makeCsv(fileName + '.csv');\n };\n ;\n ReportDownloadService.prototype.makeCsv = function (filename) {\n var blob = this.createCsvFile();\n if (window.navigator.msSaveOrOpenBlob) {\n navigator.msSaveBlob(blob, filename);\n }\n else {\n var downloadLink = document.createElement('a');\n downloadLink.href = window.URL.createObjectURL(blob);\n downloadLink.target = '_blank';\n downloadLink.setAttribute('download', filename);\n document.body.appendChild(downloadLink);\n downloadLink.click();\n downloadLink.remove();\n }\n };\n //pdf and csv download\n ReportDownloadService.prototype.getReportDefinition = function (doc) {\n switch (this.report.reportType) {\n case Patersons.ReportType.CapitalTransactions:\n return this.getCapitalTransactionStatement(doc);\n case Patersons.ReportType.QuarterlyReports:\n return this.getQuarterlyReportsReport(doc);\n case Patersons.ReportType.Cash:\n return this.getCashReport(doc);\n case Patersons.ReportType.Income:\n return this.getIncomeReport(doc);\n case Patersons.ReportType.CapitalGains:\n return this.getCapitalGainsReport(doc);\n case Patersons.ReportType.UnrealisedCapitalGains:\n return this.getUnrealisedCapitalGainsReport(doc);\n case Patersons.ReportType.Performance:\n return this.getPerformanceReport(doc);\n case Patersons.ReportType.TaxReports:\n return this.getTaxReportsReport(doc);\n case Patersons.ReportType.Valuation:\n return this.getValuationStatement(doc);\n case Patersons.ReportType.StandardLedger:\n return this.getStandardLedger(doc);\n default:\n console.error('Unrecognised report type encountered: ' + this.report.reportType);\n return null;\n }\n };\n ReportDownloadService.prototype.getColumnDefinitions = function (reportType) {\n switch (reportType) {\n case Patersons.ReportType.CapitalTransactions:\n return {\n columnNames: ['tradeDate', 'settlementDate', 'quantity', 'code', 'description', 'unitPrice', 'grossAmount', 'brokerage', 'gst', 'netAmount'],\n /*displayNames: [\n { text: 'Trade Date', alignment: 'left'},\n { text: 'Settlement Date', alignment: 'left'},\n { text: 'Quantity', alignment: 'right'},\n { text: 'Code', alignment: 'left'},\n { text: 'Description', alignment: 'left'},\n { text: 'Unit Price', alignment: 'right'},\n { text: 'Gross Amount', alignment: 'right'},\n { text: 'Brokerage', alignment: 'right'},\n { text: 'GST', alignment: 'right'},\n { text: 'Net Amount', alignment: 'right'},\n ],*/\n displayNames: [\n 'Trade Date',\n 'Settlement Date',\n 'Quantity',\n 'Code',\n 'Description',\n 'Unit Price',\n 'Gross Amount',\n 'Brokerage',\n 'GST',\n 'Net Amount'\n ],\n csvColumnNames: ['tradeDate', 'settlementDate', 'quantity', 'code', 'description', 'unitPrice', 'grossAmount', 'brokerage', 'gst', 'netAmount', 'tradeCategory'],\n csvDisplayNames: ['Trade Date', 'Settlement Date', 'Quantity', 'Code', 'Description', 'Unit Price', 'Gross Amount', 'Brokerage', 'GST', 'Net Amount', 'Category'],\n columnWidths: ['auto', 'auto', 'auto', 'auto', '*', 'auto', 'auto', 'auto', 'auto', 'auto']\n };\n case Patersons.ReportType.QuarterlyReports:\n return {\n columnNames: [\"name\"],\n /*displayNames: [\n {text: \"Title\", alignment: 'left'}\n ],*/\n displayNames: [\n \"Title\"\n ],\n csvColumnNames: [\"name\"],\n csvDisplayNames: [\"Report Name\"],\n columnWidths: ['*']\n };\n case Patersons.ReportType.Cash:\n return {\n columnNames: [\"date\", \"description\", \"debit\", \"credit\", \"balance\"],\n /*displayNames: [\n { text: \"Date\", alignment: 'left'},\n { text: \"Description\", alignment: 'left'},\n { text: \"Debit\", alignment: 'right'},\n { text: \"Credit\", alignment: 'right'},\n { text: \"Balance\", alignment: 'right'}\n ],*/\n displayNames: [\n \"Date\",\n \"Description\",\n \"Debit\",\n \"Credit\",\n \"Balance\"\n ],\n csvColumnNames: [\"date\", \"description\", \"debit\", \"credit\", \"balance\", \"cashSecurityGroupName\"],\n csvDisplayNames: [\"Date\", \"Description\", \"Debit\", \"Credit\", \"Balance\", \"Cash Security Group\"],\n columnWidths: ['auto', '*', 90, 90, 90]\n };\n case Patersons.ReportType.Income:\n return {\n columnNames: ['payDate', 'exDate', 'code', 'description', 'amount', 'frankingCredits', 'withholdingTax', 'gst'],\n /*displayNames: [\n { text:\"Pay-Date\", alignment: 'left'},\n { text:\"Ex-Date\", alignment: 'left'},\n { text:\"Code\", alignment: 'left'},\n { text:\"Description\", alignment: 'left'},\n { text:\"Amount Received / Paid\",alignment: 'right'},\n { text:\"Franking Credits\", alignment: 'right'},\n { text:\"Withholding Tax\", alignment: 'right'},\n { text:\"GST\", alignment: 'right'}\n ],*/\n displayNames: [\n \"Pay-Date\",\n \"Ex-Date\",\n \"Code\",\n \"Description\",\n \"Amount Received / Paid\",\n \"Franking Credits\",\n \"Withholding Tax\",\n \"GST\"\n ],\n csvColumnNames: ['payDate', 'exDate', 'code', 'description', 'amount', 'frankingCredits', 'withholdingTax', 'gst', 'transType', 'subTransType'],\n csvDisplayNames: [\"Pay-Date\", \"Ex-Date\", \"Code\", \"Description\", \"Amount Received / Paid\", \"Franking Credits\", \"Withholding Tax\", \"GST\", \"Type\", \"SubType\"],\n //columnWidths: [50, 50, 40, \"*\", 90, 90, 90, 90]\n columnWidths: [50, 50, '*', 200, 50, 50, 50, 50]\n };\n case Patersons.ReportType.CapitalGains:\n return {\n columnNames: ['purchaseDate', 'saleDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'salePrice', 'capitalProceeds'],\n /*displayNames: [\n { text:'Purchase Date', alignment: 'left'},\n { text:'Sale Date', alignment: 'left'},\n { text:'Quantity', alignment: 'right'},\n { text:'Capital Proceeds', alignment: 'right'},\n { text:'Total Cost', alignment: 'right'},\n { text:'Reduced Cost Base', alignment: 'right'},\n { text:'Indexed Cost Base', alignment: 'right'},\n { text:'Discount Cost Base', alignment: 'right'},\n { text:'Capital Loss', alignment: 'right'},\n { text:'Indexed Gain', alignment: 'right'},\n { text:'Gross Discount Gain', alignment: 'right'},\n { text:'Other Gain', alignment: 'right'},\n ],*/\n displayNames: [\n 'Purchase Date',\n 'Sale Date',\n 'Quantity',\n 'Cost Price',\n 'Total Cost',\n 'Reduced Cost Base',\n 'Indexed Cost Base',\n 'Discount Cost Base',\n 'Capital Loss',\n 'Indexed Gain',\n 'Gross Discount Gain',\n 'Other Gain',\n 'Sale Price',\n 'Capital Proceeds',\n ],\n csvColumnNames: ['purchaseDate', 'saleDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'securityDescription', 'assetClass', 'salePrice', 'capitalProceeds'],\n csvDisplayNames: ['Purchase Date', 'Sale Date', 'Quantity', 'Cost Price', 'Total Cost', 'Reduced Cost Base', 'Indexed Cost Base', 'Discount Cost Base', 'Capital Loss', 'Indexed Gain', 'Gross Discount Gain', 'Other Gain', 'Security Description', 'Asset Class', 'Sale Price', 'Capital Proceeds'],\n columnWidths: [\"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\"]\n };\n case Patersons.ReportType.UnrealisedCapitalGains:\n return {\n columnNames: ['purchaseDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'marketPrice', 'marketValue'],\n /*displayNames: [\n { text:'Purchase Date', alignment: 'left'},\n { text:'Quantity', alignment: 'right'},\n { text:'Market Value', alignment: 'right'},\n { text:'Total Cost', alignment: 'right'},\n { text:'Reduced Cost Base', alignment: 'right'},\n { text:'Indexed Cost Base', alignment: 'right'},\n { text:'Discounted Cost Base', alignment: 'right'},\n { text:'Capital Loss', alignment: 'right'},\n { text:'Indexed Gain', alignment: 'right'},\n { text:'Gross Discount Gain', alignment: 'right'},\n { text:'Other Gain', alignment: 'right'},\n ],*/\n displayNames: [\n 'Purchase Date',\n 'Quantity',\n 'Cost Price',\n 'Total Cost',\n 'Reduced Cost Base',\n 'Indexed Cost Base',\n 'Discounted Cost Base',\n 'Capital Loss',\n 'Indexed Gain',\n 'Gross Discount Gain',\n 'Other Gain',\n 'Market Price',\n 'Market Value',\n ],\n csvColumnNames: ['purchaseDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'securityDescription', 'assetClass', 'marketPrice', 'marketValue'],\n csvDisplayNames: ['Purchase Date', 'Quantity', 'Cost Price', 'Total Cost', 'Reduced Cost Base', 'Indexed Cost Base', 'Discounted Cost Base', 'Capital Loss', 'Indexed Gain', 'Gross Discount Gain', 'Other Gain', 'Security Description', 'Asset Class', 'Market Price', 'Market Value'],\n columnWidths: ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*']\n };\n case Patersons.ReportType.Performance:\n return {\n columnNames: ['openMarketValue', 'netContributionsWithdrawals', 'netAssetMovement', 'income', 'expenses', 'managementFees', 'closedMarketValue', 'irr'],\n /*displayNames: [\n { text:'Open Market Value', alignment: 'right'},\n { text:'Net Contributions / Withdrawals', alignment: 'right'},\n { text:'Net Asset Movement', alignment: 'right'},\n { text:'Income', alignment: 'right'},\n { text:'Expenses', alignment: 'right'},\n { text:'Management Fees', alignment: 'right'},\n { text:'Closed Market Value', alignment: 'right'},\n { text:'IRR', alignment: 'right'}\n ],*/\n displayNames: [\n 'Open Market Value',\n 'Net Contributions / Withdrawals',\n 'Net Asset Movement',\n 'Income',\n 'Expenses',\n 'Management Fees',\n 'Closed Market Value',\n 'IRR'\n ],\n csvColumnNames: ['openMarketValue', 'netContributionsWithdrawals', 'netAssetMovement', 'income', 'expenses', 'managementFees', 'closedMarketValue', 'irr'],\n csvDisplayNames: ['Open Market Value', 'Net Contributions / Withdrawals', 'Net Asset Movement', 'Income', 'Expenses', 'Management Fees', 'Closed Market Value', 'IRR'],\n columnWidths: ['*', 300]\n };\n case Patersons.ReportType.TaxReports:\n return {\n columnNames: [\"name\"],\n /*displayNames: [\n { text:\"Title\", alignment: 'left'}\n ],*/\n displayNames: [\n \"Title\"\n ],\n csvColumnNames: [\"name\"],\n csvDisplayNames: [\"Report Name\"],\n columnWidths: ['*']\n };\n case Patersons.ReportType.Valuation:\n //remove Gross Yield, Estimated Income and Estimated Franking Credits for CG accounts\n if (this.userCompany.enableFeature) {\n var result = {\n columnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\", \"profitOrLoss\", \"pctAssets\", \"estAnnualIncome\", \"estFrankingCredits\", \"estGrossYield\"],\n displayNames: [\n \"Code\",\n \"Security Name\",\n \"Quantity\",\n \"Cost Price\",\n \"Reduced Cost Base\",\n \"Market Price\",\n \"Market Value\",\n \"Profit (Loss)\",\n \"Pct. Assets\",\n \"Historic Income\",\n \"Historic Fr. Credits\",\n \"Historic Gross Yield\"\n ],\n columnNamesInternational: [\n \"code\",\n \"currency\",\n \"securityName\",\n \"quantity\",\n \"nativeCostPrice\",\n \"nativeTotalCost\",\n \"nativeMarketPrice\",\n \"nativeMarketValue\",\n \"nativeProfitLoss\",\n \"totalCost\",\n \"marketValue\",\n \"profitOrLoss\",\n \"pctAssets\",\n \"estAnnualIncome\"\n ],\n displayNamesInternational: [\n \"Code\",\n \"Currency\",\n \"Name\",\n \"Quantity\",\n \"Native Cost Price\",\n \"Native Total Cost\",\n \"Native Market Price\",\n \"Native Market Value\",\n \"Native Profit (Loss)\",\n \"AUD Total Cost\",\n \"AUD Market Value\",\n \"AUD Profit (Loss)\",\n \"Pct. Assets\",\n \"Historic Income\"\n ],\n csvColumnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\", \"profitOrLoss\", \"pctAssets\", \"estAnnualIncome\", \"estFrankingCredits\", \"estGrossYield\"],\n csvDisplayNames: [\"Code\", \"Security Name\", \"Quantity\", \"Cost Price\", \"Reduced Cost Base\", \"Market Price\", \"Market Value\", \"Profit (Loss)\", \"Pct. Assets\", \"Historic Income\", \"Historic Fr. Credits\", \"Historic Gross Yield\"],\n columnWidths: [\"auto\", \"*\", 50, 40, 60, 50, 60, 50, 40, 60, 50, 40],\n columnWidthsInternational: [\"auto\", \"auto\", \"*\", 40, 40, 50, 50, 50, 40, 50, 50, 40, 40, 40],\n csvGroupBy: \"category\",\n totalColumnNames: [\"totalCost\", \"marketValue\", \"estAnnualIncome\", \"estFrankingCredits\", \"estAnnualGrossIncome\", \"estGrossYield\"],\n totalDisplayNames: [\"Total Cost\", \"Total Market Value\", \"Est.Annual Income\", \"Est.Annual Franking Credit\", \"Est.Annual Gross Income\", \"Est.Annual Gross Yield\"],\n totalColumnWidths: [\"*\", \"*\", \"*\", \"*\", \"*\", \"*\"],\n csvTotalColumnNames: [\"\", \"\", \"\", \"\", \"\", \"totalCost\", \"marketValue\", \"profitOrLoss\", \"estAnnualIncome\", \"estFrankingCredits\", \"estAnnualGrossIncome\", \"estGrossYield\"],\n csvTotalDisplayNames: [\"\", \"\", \"\", \"\", \"\", \"Total Cost\", \"Total Market Value\", \"Profit (Loss)\", \"Historic Income\", \"Historic Franking Credits\", \"Historic Gross Income\", \"Historic Gross Yield\"],\n };\n return result;\n }\n else {\n var result = {\n columnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\", \"profitOrLoss\", \"pctAssets\"],\n displayNames: [\n \"Code\",\n \"Security Name\",\n \"Quantity\",\n \"Cost Price\",\n \"Reduced Cost Base\",\n \"Market Price\",\n \"Market Value\",\n \"Profit (Loss)\",\n \"Pct. Assets\",\n ],\n displayNamesInternational: [\n \"Code\",\n \"Currency\",\n \"Name\",\n \"Quantity\",\n \"Native Cost Price\",\n \"Native Total Cost\",\n \"Native Market Price\",\n \"Native Market Value\",\n \"Native Profit (Loss)\",\n \"AUD Total Cost\",\n \"AUD Market Value\",\n \"AUD Profit (Loss)\",\n \"Pct. Assets\",\n ],\n columnNamesInternational: [\n \"code\",\n \"currency\",\n \"securityName\",\n \"quantity\",\n \"nativeCostPrice\",\n \"nativeTotalCost\",\n \"nativeMarketPrice\",\n \"nativeMarketValue\",\n \"nativeProfitLoss\",\n \"totalCost\",\n \"marketValue\",\n \"profitOrLoss\",\n \"pctAssets\"\n ],\n csvColumnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\", \"profitOrLoss\", \"pctAssets\"],\n csvDisplayNames: [\"Code\", \"Security Name\", \"Quantity\", \"Cost Price\", \"Reduced Cost Base\", \"Market Price\", \"Market Value\", \"Profit (Loss)\", \"Pct. Assets\"],\n columnWidths: [\"auto\", \"*\", 50, 40, 60, 50, 60, 50, 40],\n columnWidthsInternational: [\"auto\", \"auto\", \"*\", 40, 40, 50, 50, 50, 40, 50, 50, 40, 40],\n csvGroupby: \"category\",\n totalColumnNames: [\"totalCost\", \"marketValue\"],\n totalDisplayNames: [\"Total Cost\", \"Total Market Value\"],\n totalColumnWidths: [\"*\", \"*\",],\n csvTotalColumnNames: [\"\", \"\", \"\", \"\", \"\", \"totalCost\", \"marketValue\", \"profitOrLoss\", \"estAnnualIncome\"],\n scvTotalDisplayNames: [\"\", \"\", \"\", \"\", \"\", \"Total Cost\", \"Total Market Value\", \"Profit (Loss)\", \"Historic Income\"],\n };\n return result;\n }\n case Patersons.ReportType.StandardLedger:\n return {\n columnNames: [\"ledgerDate\", \"description\", \"amount\", \"balance\", \"currency\", \"reference\"],\n /*displayNames: [\n { text:\"Date\", alignment: 'left'},\n { text:\"Description\", alignment: 'left'},\n { text:\"Amount\", alignment: 'right'},\n { text:\"Balance\", alignment: 'right'},\n { text:\"Currency\", alignment: 'right'},\n { text:\"Reference\", alignment: 'right'}\n ],*/\n displayNames: [\n \"Date\",\n \"Description\",\n \"Amount\",\n \"Balance\",\n \"Currency\",\n \"Reference\"\n ],\n csvColumnNames: [\"ledgerDate\", \"description\", \"amount\", \"balance\", \"currency\", \"reference\"],\n csvDisplayNames: [\"Date\", \"Description\", \"Amount\", \"Balance\", \"Currency\", \"Reference\"],\n columnWidths: [\"auto\", \"*\", \"auto\", \"auto\", \"auto\", \"auto\"]\n };\n default:\n console.error('Unrecognised report type encountered: ' + reportType);\n return null;\n }\n };\n ReportDownloadService.prototype.getCapitalTransactionStatement = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var statement = this.report;\n var transactions, footer, colspan = 1;\n if (statement && statement.tradeCategories && statement.tradeCategories.length > 0) {\n var categories = statement.tradeCategories;\n for (var i = 0; i < categories.length; i++) {\n var category = categories[i];\n doc.content.push(this.headerRow(category.name));\n transactions = category.transactions;\n footer = category.subtotal;\n footer.tradeDate = null;\n footer.settlementDate = null;\n footer.quantity = 'n/a';\n footer.unitPrice = 'n/a';\n doc.content.push(this.table(transactions, headerCols, displayHeaderCols, widths, null, colspan, footer));\n }\n }\n return doc;\n };\n ReportDownloadService.prototype.getCapitalGainsReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var report = this.report;\n var footer, colspan = 1;\n if (report && report.assetClasses.length > 0) {\n var assetClasses = report.assetClasses;\n for (var i = 0; i < assetClasses.length; i++) {\n var assetClass = assetClasses[i];\n doc.content.push(this.headerRow(assetClass.name));\n // AE: Capital Gains Report header row fix\n doc.content.push(this.table(null, headerCols, displayHeaderCols, widths, null, colspan, null));\n var assets = assetClass.assets;\n for (var j = 0; j < assets.length; j++) {\n var asset = assets[j];\n doc.content.push(this.subHeaderRow(asset.name));\n footer = asset.subtotal;\n footer.purchaseDate = null;\n footer.saleDate = null;\n doc.content.push(this.table(asset.capitalGains, headerCols, null, widths, null, colspan, footer));\n }\n footer = assetClass.subtotal;\n footer.purchaseDate = null;\n footer.saleDate = null;\n footer.quantity = null;\n doc.content.push(this.subTotalTable(null, headerCols, null, widths, 'Sub Total', colspan, footer));\n }\n footer = report.total;\n footer.purchaseDate = null;\n footer.saleDate = null;\n footer.quantity = null;\n doc.content.push(this.totalTable(null, headerCols, null, widths, 'Total', colspan, footer));\n }\n return doc;\n };\n ReportDownloadService.prototype.getUnrealisedCapitalGainsReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var report = this.report;\n var footer, colspan = 1;\n if (report && report.assetClasses.length > 0) {\n var assetClasses = report.assetClasses;\n for (var i = 0; i < assetClasses.length; i++) {\n var assetClass = assetClasses[i];\n doc.content.push(this.headerRow(assetClass.name));\n // AE: Unreleased Capital Gains headers row fix\n doc.content.push(this.table(null, headerCols, displayHeaderCols, widths, null, colspan, null));\n var assets = assetClass.assets;\n for (var j = 0; j < assets.length; j++) {\n var asset = assets[j];\n doc.content.push(this.subHeaderRow(asset.name));\n footer = asset.subtotal;\n footer.purchaseDate = null;\n doc.content.push(this.table(asset.capitalGains, headerCols, null, widths, null, colspan, footer));\n }\n footer = assetClass.subtotal;\n footer.purchaseDate = null;\n footer.quantity = 'n/a';\n footer.marketValue = 'n/a';\n footer.indexedCostBase = 'n/a';\n footer.discountedCostBase = 'n/a';\n footer.indexedGain = 'n/a';\n doc.content.push(this.subTotalTable(null, headerCols, null, widths, 'Sub Total', colspan, footer));\n }\n footer = report.total;\n footer.purchaseDate = null;\n footer.quantity = 'n/a';\n footer.marketValue = 'n/a';\n footer.indexedCostBase = 'n/a';\n footer.discountedCostBase = 'n/a';\n footer.indexedGain = 'n/a';\n doc.content.push(this.totalTable(null, headerCols, null, widths, 'Total', colspan, footer));\n }\n return doc;\n };\n ReportDownloadService.prototype.getPerformanceReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var report = this.report;\n if (!report) {\n return null;\n }\n var columnNames = columnDefinitions.columnNames;\n var displayNames = columnDefinitions.displayNames;\n var performanceTable = {\n table: {\n widths: columnDefinitions.columnWidths,\n headerRows: 0,\n body: []\n },\n layout: this.getPerformanceLayout() //this.layoutThinLightBorder()\n };\n doc.content.push(this.headerRow(\"Performance\"));\n for (var i = 0; i < columnNames.length; i++) {\n var displayName = displayNames[i];\n var item = columnNames[i];\n var value = this.currencyFormatted(report[item]);\n if (i == 0 || i > columnNames.length - 3) {\n performanceTable.table.body.push([\n { text: displayName, border: [false, false, false, true], style: this.pdfBuilder.styles.tableCellBold },\n { text: value, alignment: 'right', border: [false, false, false, true], style: this.pdfBuilder.styles.tableCellBold }\n ]);\n }\n else {\n performanceTable.table.body.push([\n { text: displayName, border: [false, false, false, true], style: this.pdfBuilder.styles.tableCell },\n { text: value, alignment: 'right', border: [false, false, false, true], style: this.pdfBuilder.styles.tableCell }\n ]);\n }\n }\n doc.content.push(performanceTable);\n return doc;\n };\n ReportDownloadService.prototype.capitalizeFirstLetter = function (string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n };\n // Holdings report\n ReportDownloadService.prototype.handleLongString = function (category) {\n category.items.forEach(function (x, index) {\n var words = x.securityName.split(\" \");\n var code = x.code.split(/[_\\s]+/);\n // split the words into subwords\n for (var i = 0; i < words.length; i++) {\n if (words[i].length > 5) {\n words[i] = words[i].substring(0, 5) + \" \" + words[i].substring(5);\n }\n }\n for (var i = 0; i < code.length; i++) {\n if (code[i].length > 3) {\n code[i] = code[i].substring(0, 3) + \" \" + code[i].substring(3);\n }\n }\n var newCode = code.join(\" \");\n category.items[index].code = newCode;\n var newSentence = words.join(\" \");\n category.items[index].securityName = newSentence;\n });\n };\n ReportDownloadService.prototype.getValuationStatement = function (doc) {\n var _this = this;\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var headerColsInternational = columnDefinitions.columnNamesInternational;\n var displayHeaderCols = columnDefinitions.displayNames;\n var displayHeaderColsInternational = columnDefinitions.displayNamesInternational;\n var widths = columnDefinitions.columnWidths;\n var widthsInternational = columnDefinitions.columnWidthsInternational;\n var valuationStatement = this.report;\n var tableBody = [];\n // Non-LOA securities\n if (valuationStatement.nonLoaSecurities) {\n var categories = valuationStatement.nonLoaSecurities;\n for (var i = 0; i < categories.length; i++) {\n var category = categories[i];\n this.handleLongString(category);\n tableBody = [];\n if (category.categoryName.includes(\"International\")) {\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderColsInternational));\n tableBody.push(this.formatSubheadingRow(category.categoryName, headerColsInternational.length));\n var lineItems = this.formatDataForPdf(category.items);\n var footer = this.formatDataForPdf(category.subtotal);\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerColsInternational, null, null, 0, footer));\n doc.content.push(this.tableWithHeader(tableBody, headerColsInternational, widthsInternational));\n }\n else {\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\n tableBody.push(this.formatSubheadingRow(category.categoryName, headerCols.length));\n var lineItems = this.formatDataForPdf(category.items);\n var footer = this.formatDataForPdf(category.subtotal);\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\n }\n }\n }\n // Non-LOA unsettled dividends\n if (valuationStatement.nonLoaUnsettledDividends) {\n var dividends = valuationStatement.nonLoaUnsettledDividends;\n if (dividends.items && dividends.items.length > 0) {\n tableBody = [];\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\n tableBody.push(this.formatSubheadingRow(\"Unsettled Dividends\", headerCols.length));\n var lineItems = this.formatDataForPdf(dividends.items);\n var footer = this.formatDataForPdf(dividends.subtotal);\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\n }\n }\n // LOA securities\n if (valuationStatement.loaSecurities) {\n var categories = valuationStatement.loaSecurities;\n for (var i = 0; i < categories.length; i++) {\n tableBody = [];\n var category = categories[i];\n this.handleLongString(category);\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\n tableBody.push(this.formatSubheadingRow(category.categoryName, headerCols.length));\n var lineItems = this.formatDataForPdf(category.items);\n var footer = this.formatDataForPdf(category.subtotal);\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\n }\n }\n // LOA unsettled dividends\n if (valuationStatement.loaUnsettledDividends) {\n var dividends = valuationStatement.loaUnsettledDividends;\n if (dividends.items && dividends.items.length > 0) {\n tableBody = [];\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\n tableBody.push(this.formatSubheadingRow(\"Unsettled Dividends\", headerCols.length));\n var lineItems = this.formatDataForPdf(dividends.items);\n var footer = this.formatDataForPdf(dividends.subtotal);\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\n }\n }\n if (valuationStatement.managedAccounts) {\n Object.keys(valuationStatement.managedAccounts).forEach(function (key) {\n if (valuationStatement.managedAccounts[key].items.length) {\n var categories = valuationStatement.managedAccounts[key].items;\n tableBody = [];\n tableBody.push(_this.getHoldingsHeaderRow(displayHeaderCols));\n tableBody.push(_this.formatSubheadingRow(_this.capitalizeFirstLetter(key), headerCols.length));\n for (var i = 0; i < categories.length; i++) {\n var category = categories[i];\n _this.handleLongString(category);\n tableBody.push(_this.formatNestedSubheadingRow(category.categoryName, headerCols.length));\n var lineItems = _this.formatDataForPdf(category.items);\n var footer = _this.formatDataForPdf(category.subtotal);\n tableBody = tableBody.concat(_this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\n }\n doc.content.push(_this.tableWithHeader(tableBody, headerCols, widths, displayHeaderCols));\n }\n });\n }\n // doc.content.push(this.tableWithHeader(tableBody, headerCols, widths, displayHeaderCols));\n // Grand totals\n if (valuationStatement.grandTotal) {\n var total = [];\n total.push(valuationStatement.grandTotal);\n doc.content.push(this.headerRow(\"Grand Totals\"));\n doc.content.push(this.table(total, columnDefinitions.totalColumnNames, columnDefinitions.totalDisplayNames, columnDefinitions.totalColumnWidths, null, 0, null));\n }\n return doc;\n };\n ReportDownloadService.prototype.getQuarterlyReportsReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var quarterlyReport = this.report;\n var colspan = 1;\n if (quarterlyReport && quarterlyReport.investorDocs && quarterlyReport.investorDocs.length > 0) {\n doc.content.push(this.table(quarterlyReport.investorDocs, headerCols, displayHeaderCols, widths, null, colspan, null));\n }\n return doc;\n };\n ReportDownloadService.prototype.getTaxReportsReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var taxReport = this.report;\n var colspan = 1;\n if (taxReport && taxReport.investorDocs && taxReport.investorDocs.length > 0) {\n doc.content.push(this.table(taxReport.investorDocs, headerCols, displayHeaderCols, widths, null, colspan, null));\n }\n return doc;\n };\n ReportDownloadService.prototype.getCashReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var cashReport = this.report;\n var transactions, footer, colspan = 1;\n if (cashReport && cashReport.transactionGroups && cashReport.transactionGroups.length > 0) {\n var groups = cashReport.transactionGroups;\n for (var i = 0; i < groups.length; i++) {\n var group = groups[i];\n doc.content.push(this.headerRow(group.name));\n transactions = group.transactions;\n footer = group.closingBalance;\n doc.content.push(this.table(transactions, headerCols, displayHeaderCols, widths, null, colspan, footer));\n }\n }\n return doc;\n };\n ReportDownloadService.prototype.getIncomeReport = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var incomeReport = this.report;\n var categories;\n var subCategories;\n var footer;\n var colspan = 4;\n if (incomeReport && incomeReport.transactionTypeCategories && incomeReport.transactionTypeCategories.length > 0) {\n var categories = incomeReport.transactionTypeCategories;\n for (var cat = 0; cat < categories.length; cat++) {\n var category = categories[cat];\n doc.content.push(this.headerRow(category.name));\n doc.content.push(this.tableWithHeader(null, columnDefinitions, widths, displayHeaderCols));\n for (var subCat = 0; subCat < category.subCategories.length; subCat++) {\n var subCategory = category.subCategories[subCat];\n if (subCategory.name != category.name) {\n doc.content.push(this.subHeaderRow(subCategory.name));\n }\n var lineItems = subCategory.lineItems;\n doc.content.push(this.table(lineItems, headerCols, null, widths, null, null, null));\n }\n footer = category.subtotal;\n footer.payDate = null;\n footer.exDate = null;\n footer.code = null;\n footer.description = null;\n doc.content.push(this.table(null, headerCols, null, widths, \"TOTAL \" + category.name.toUpperCase(), colspan, footer));\n }\n if (incomeReport && incomeReport.grandTotal) {\n footer = incomeReport.grandTotal;\n footer.payDate = null;\n footer.exDate = null;\n footer.code = null;\n footer.description = null;\n doc.content.push(this.table(null, headerCols, null, widths, \"INCOME LESS EXPENSES:\", colspan, footer));\n }\n }\n return doc;\n };\n ReportDownloadService.prototype.getStandardLedger = function (doc) {\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var colspan = 1;\n var standardLedgerReport = this.report;\n if (standardLedgerReport &&\n standardLedgerReport.ledgerEntries &&\n standardLedgerReport.ledgerEntries.length > 0) {\n var entries = standardLedgerReport.ledgerEntries;\n doc.content.push(this.headerRow(\"Ledger\"));\n doc.content.push(this.ledgerTable(entries, headerCols, displayHeaderCols, widths, null, colspan, null));\n }\n return doc;\n };\n ReportDownloadService.prototype.formatDataForPdf = function (data) {\n var _this = this;\n if (!data)\n return null;\n var pdfData = angular.copy(data);\n if (pdfData instanceof Array) {\n pdfData.map(function (item) {\n _this.formatDataRow(item);\n });\n }\n else {\n this.formatDataRow(pdfData);\n }\n return pdfData;\n };\n ReportDownloadService.prototype.formatDataRow = function (item) {\n if (item == null || item === undefined)\n return null;\n switch (this.report.reportType) {\n case Patersons.ReportType.CapitalTransactions:\n item.tradeDate = this.dateFormatted(item.tradeDate);\n item.settlementDate = this.dateFormatted(item.settlementDate);\n item.quantity = this.currencyFormatted(item.quantity);\n item.unitPrice = this.currencyFormatted(item.unitPrice);\n item.grossAmount = this.currencyFormatted(item.grossAmount);\n item.brokerage = this.currencyFormatted(item.brokerage);\n item.gst = this.currencyFormatted(item.gst);\n item.netAmount = this.currencyFormatted(item.netAmount);\n break;\n case Patersons.ReportType.QuarterlyReports:\n break;\n case Patersons.ReportType.Cash:\n item.date = this.dateFormatted(item.date);\n item.debit = this.currencyFormatted(this.absoluteValue(item.debit));\n item.credit = this.currencyFormatted(item.credit);\n item.balance = this.currencyFormatted(item.balance);\n break;\n case Patersons.ReportType.Income:\n item.payDate = this.dateFormatted(item.payDate);\n item.exDate = this.dateFormatted(item.exDate);\n item.amount = this.currencyFormatted(item.amount);\n item.frankingCredits = this.currencyFormatted(item.frankingCredits);\n item.withholdingTax = this.currencyFormatted(item.withholdingTax);\n item.gst = this.currencyFormatted(item.gst);\n break;\n case Patersons.ReportType.CapitalGains:\n item.purchaseDate = this.dateFormatted(item.purchaseDate);\n item.saleDate = this.dateFormatted(item.saleDate);\n item.quantity = this.integerFormatted(item.quantity);\n item.costPrice = this.currencyFormatted(item.costPrice);\n item.totalCost = this.currencyFormatted(item.totalCost);\n item.reducedCostBase = this.currencyFormatted(item.reducedCostBase);\n item.indexedCostBase = this.currencyFormatted(item.indexedCostBase);\n item.discountedCostBase = this.currencyFormatted(item.discountedCostBase);\n item.capitalLoss = this.currencyFormatted(item.capitalLoss);\n item.indexedGain = this.currencyFormatted(item.indexedGain);\n item.grossDiscountGain = this.currencyFormatted(item.grossDiscountGain);\n item.salePrice = this.currencyFormatted(item.salePrice);\n item.otherGain = this.currencyFormatted(item.otherGain);\n item.capitalProceeds = this.currencyFormatted(item.capitalProceeds);\n break;\n case Patersons.ReportType.UnrealisedCapitalGains:\n item.purchaseDate = this.dateFormatted(item.purchaseDate);\n item.quantity = this.integerFormatted(item.quantity);\n item.costPrice = this.currencyFormatted(item.costPrice);\n item.totalCost = this.currencyFormatted(item.totalCost);\n item.reducedCostBase = this.currencyFormatted(item.reducedCostBase);\n item.indexedCostBase = this.currencyFormatted(item.indexedCostBase);\n item.discountedCostBase = this.currencyFormatted(item.discountedCostBase);\n item.capitalLoss = this.currencyFormatted(item.capitalLoss);\n item.indexedGain = this.currencyFormatted(item.indexedGain);\n item.grossDiscountGain = this.currencyFormatted(item.grossDiscountGain);\n item.otherGain = this.currencyFormatted(item.otherGain);\n item.marketPrice = this.currencyFormatted(item.marketPrice);\n item.marketValue = this.currencyFormatted(item.marketValue);\n break;\n case Patersons.ReportType.Performance:\n break;\n case Patersons.ReportType.TaxReports:\n break;\n case Patersons.ReportType.Valuation:\n if (item.hasOwnProperty(\"unsettledIncome\")) {\n item.code = item.securityCode;\n item.marketValue = this.currencyFormatted(item.unsettledIncome);\n }\n else {\n item.quantity = this.currencyFormatted(item.quantity);\n item.costPrice = this.formatAsCurrency4DecPts(item.costPrice);\n item.totalCost = this.currencyFormatted(item.totalCost);\n item.price = this.formatAsCurrency4DecPts(item.price);\n item.marketValue = this.currencyFormatted(item.marketValue);\n item.profitOrLoss = this.currencyFormatted(item.profitOrLoss);\n item.pctAssets = this.percentFormatted(item.pctAssets);\n item.estAnnualIncome = this.currencyFormatted(item.estAnnualIncome);\n item.estAnnualGrossIncome = this.currencyFormatted(item.estAnnualGrossIncome);\n item.estFrankingCredits = this.currencyFormatted(item.estFrankingCredits);\n item.estGrossYield = this.percentFormatted(item.estGrossYield);\n item.nativeCostPrice = this.currencyFormatted(item.nativeCostPrice);\n item.nativeTotalCost = this.currencyFormatted(item.nativeTotalCost);\n item.nativeMarketPrice = this.currencyFormatted(item.nativeMarketPrice);\n item.nativeMarketValue = this.currencyFormatted(item.nativeMarketValue);\n item.nativeProfitLoss = this.currencyFormatted(item.nativeProfitLoss);\n }\n break;\n case Patersons.ReportType.StandardLedger:\n item.ledgerDate = this.dateFormatted(item.ledgerDate);\n item.amount = this.currencyFormatted(item.amount);\n item.balance = this.currencyFormatted(item.balance);\n item.isCancelled = IdMgr.YesNo()(item.isCancelled);\n item.isOpen = IdMgr.YesNo()(item.isOpen);\n break;\n default:\n console.error('Unrecognised report type encountered: ' + this.report.reportType);\n return null;\n }\n return item;\n };\n ReportDownloadService.prototype.dateFormatted = function (date) {\n return date ? moment(date).format(\"DD-MM-YYYY\") : null;\n };\n ReportDownloadService.prototype.getPdfTemplateDefinition = function () {\n var deferred = this.q.defer();\n var timestamp = moment.tz(this.report.creationDateUtc, 'Australia/Sydney').format(\"h:mm a [AEST on] D MMM YYYY\");\n var reportTitle = this.report.title;\n //let adviserName = this.account.adviserName ? this.account.adviserName : \"\";\n //let dateHeading: any[] = this.buildDateHeading(this.report.asAtDate, this.report.dateFrom, this.report.dateTo);\n var docDefinition = {\n pageSize: 'A4',\n pageOrientation: 'landscape',\n pageMargins: [56, 28, 56, 60],\n content: [\n this.pdfBuilder.getImageContent(),\n {\n text: reportTitle,\n style: this.pdfBuilder.styles.header,\n margin: [0, 0, 0, 0]\n },\n {\n text: this.filter(\"accountName\")(this.account.designation ? this.account.accountName + ' ' + this.account.designation : this.account.accountName),\n style: this.pdfBuilder.styles.subHeader,\n margin: [0, 5, 0, 10]\n },\n this.buildHeadingTable(this.report.asAtDate, this.report.dateFrom, this.report.dateTo),\n ],\n footer: this.pdfBuilder.docDefinition.footer,\n styles: {\n header: {\n fontSize: 16,\n bold: false,\n margin: [5, 5, 0, 10]\n },\n headerText: {\n margin: [5, 5, 5, 5]\n },\n lastHeaderText: {\n margin: [5, 5, 5, 15]\n },\n tableHeader: {\n fontSize: 8,\n bold: true,\n alignment: 'center',\n fillColor: '#dadada',\n margin: [5, 5, 0, 10]\n },\n filledHeader: {\n bold: true,\n fontSize: 8,\n color: 'white',\n fillColor: this.pdfBuilder.userCompany.colorSecondary,\n margin: [10, 2, 2, 2],\n },\n filledHoldingsHeader: {\n bold: true,\n fontSize: 8,\n color: 'white',\n fillColor: '#dadada',\n margin: [10, 2, 2, 2],\n },\n secondaryHeader: {\n bold: true,\n fontSize: 8,\n color: 'black',\n alignment: 'left'\n },\n footerRow: {\n bold: true,\n fontSize: 8,\n margin: [0, 2, 2, 2]\n },\n footerText: {\n fontSize: 5,\n bold: false,\n alignment: 'center'\n }\n }\n };\n deferred.resolve(docDefinition);\n return deferred.promise;\n };\n ReportDownloadService.prototype.appendSpannedCells = function (row, span) {\n // For a colspanning cell, we must still define the empty cells.\n for (var i = 1; i < span; i++) {\n row.push({ border: [false, false, false, false] });\n }\n return row;\n };\n ReportDownloadService.prototype.formatNestedSubheadingRow = function (label, colspan) {\n var row = [];\n row.push({\n border: [false, false, false, false],\n text: label,\n colSpan: colspan,\n style: this.pdfBuilder.styles.filledSubHeader,\n margin: [0, 5, 5, 5],\n alignment: 'left' });\n this.appendSpannedCells(row, colspan);\n return row;\n };\n ReportDownloadService.prototype.formatSubheadingRow = function (label, colspan) {\n var row = [];\n row.push({\n border: [false, false, false, false],\n text: label,\n colSpan: colspan,\n style: this.pdfBuilder.styles.filledHeader,\n margin: [0, 5, 5, 5],\n alignment: 'left' });\n this.appendSpannedCells(row, colspan);\n return row;\n };\n ReportDownloadService.prototype.headerRow = function (label) {\n return {\n table: {\n widths: ['*'],\n body: [\n [\n {\n border: [false, false, false, false],\n text: label,\n style: this.pdfBuilder.styles.filledHeader,\n margin: [5, 2, 2, 2]\n }\n ]\n ]\n },\n layout: 'noBorders'\n };\n };\n ReportDownloadService.prototype.subHeaderRow = function (label) {\n return {\n table: {\n widths: ['*'],\n body: [[{ text: label, style: 'secondaryHeader', margin: [5, 2, 2, 2] }]]\n },\n layout: 'noBorders'\n };\n };\n // if footerLabel - Sub Total\n ReportDownloadService.prototype.table = function (transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\n var data = this.formatDataForPdf(transactions);\n var footer = this.formatDataForPdf(footerData);\n return {\n fontSize: 8,\n table: {\n widths: widths,\n headerRows: 0,\n body: this.buildTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\n },\n layout: (headers) ? this.getTablelayout(false, false, true, false) : this.getTablelayout(false, false, false, false) //(headers) ? this.layoutThinLightBorderHeader() : this.layoutThinLightBorder()\n };\n };\n // if footerLabel - Sub Total\n ReportDownloadService.prototype.ledgerTable = function (transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\n var data = this.formatDataForPdf(transactions);\n var footer = this.formatDataForPdf(footerData);\n return {\n fontSize: 8,\n table: {\n widths: widths,\n headerRows: 0,\n body: this.buildTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\n },\n layout: this.getTablelayout(false, false, false, false, true)\n };\n };\n // if footerLabel - Sub Total\n ReportDownloadService.prototype.subTotalTable = function (transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\n var data = this.formatDataForPdf(transactions);\n var footer = this.formatDataForPdf(footerData);\n return {\n fontSize: 8,\n table: {\n widths: widths,\n headerRows: 0,\n body: this.buildSubTotalTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\n },\n layout: this.getTablelayout(true, false, false, false)\n };\n };\n // if footerLabel - Sub Total\n ReportDownloadService.prototype.totalTable = function (transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\n var data = this.formatDataForPdf(transactions);\n var footer = this.formatDataForPdf(footerData);\n return {\n fontSize: 8,\n table: {\n widths: widths,\n headerRows: 0,\n body: this.buildSubTotalTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\n },\n layout: this.getTablelayout(false, true, false, false)\n };\n };\n ReportDownloadService.prototype.tableWithHeader = function (bodyRows, columns, columnWidths, headers) {\n var isHoldings = false;\n var tableBody = [];\n if (bodyRows) {\n isHoldings = true;\n for (var i = 0; i < bodyRows.length; i++) {\n tableBody.push(bodyRows[i]);\n }\n }\n else {\n if (headers) {\n tableBody.push(this.getHeaderRow(headers));\n }\n }\n return {\n fontSize: 8,\n table: {\n widths: columnWidths,\n headerRows: 1,\n body: tableBody\n },\n margin: isHoldings ? [0, 0, 0, 10] : [],\n layout: (isHoldings) ?\n this.getTablelayout(false, false, false, true) :\n this.getTablelayout(false, false, true, false)\n };\n };\n ReportDownloadService.prototype.buildHeadingTable = function (asAtDate, dateFrom, dateTo) {\n var headingTable = {\n style: { fontSize: 8 },\n margin: [-4, 8, 0, 5],\n table: {\n widths: ['auto', '*', 'auto', 'auto'],\n body: []\n }\n };\n headingTable.table.body.push([\n { border: [false, false, false, false], text: 'Adviser: ', style: { bold: true, alignment: 'left' } },\n { border: [false, false, false, false], text: this.account.adviserName ? this.account.adviserName : \"\", style: { bold: false, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\n ]);\n headingTable.table.body.push([\n { border: [false, false, false, false], text: 'Account No: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: this.account.accountId, style: { bold: false, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\n ]);\n if (!asAtDate) {\n headingTable.table.body.push([\n { border: [false, false, false, false], text: 'From Date: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: moment(dateFrom).format(\"YYYY-MM-DD\"), style: { bold: false, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\n ]);\n headingTable.table.body.push([\n { border: [false, false, false, false], text: 'To Date: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: moment(dateTo).format(\"YYYY-MM-DD\"), style: { bold: false, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\n ]);\n }\n headingTable.table.body.push([\n { border: [false, false, false, false], text: 'Report Generated At: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: moment.tz(new Date(), 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), style: { bold: false, alignment: 'left', fontSize: 8 } },\n { border: [false, false, false, false], text: (asAtDate) ? 'As at:' : '', style: { bold: true, alignment: 'right', fontSize: 8 } },\n { border: [false, false, false, false], text: (asAtDate) ? moment(asAtDate).tz('Sydney/Australia').format(\"D MMM YYYY hh:mm:ss A [AEST]\") : '', style: { bold: false, alignment: 'right', fontSize: 8.5 } }\n ]);\n return headingTable;\n };\n // footerLabel - Sub Total\n ReportDownloadService.prototype.buildTableBody = function (data, columns, headers, footerLabel, footerLabelColspan, footerData) {\n var _this = this;\n var body = [];\n if (headers) {\n body.push(this.getHeaderRow(headers));\n }\n if (data) {\n data.forEach(function (row) {\n var dataRow = _this.getRow(row, columns);\n body.push(dataRow);\n });\n }\n if (footerData) {\n body.push(this.getFooterRow(footerLabel, columns, footerLabelColspan, footerData));\n }\n return body;\n };\n // footerLabel - Sub Total\n ReportDownloadService.prototype.buildSubTotalTableBody = function (data, columns, headers, footerLabel, footerLabelColspan, footerData) {\n var _this = this;\n var body = [];\n if (headers) {\n body.push(this.getHeaderRow(headers));\n }\n if (data) {\n data.forEach(function (row) {\n var dataRow = _this.getSubTotalRow(row, columns);\n body.push(dataRow);\n });\n }\n if (footerData) {\n body.push(this.getSubTotalFooterRow(footerLabel, columns, footerLabelColspan, footerData));\n }\n return body;\n };\n ReportDownloadService.prototype.isNumericHeader = function (header) {\n var numericHeaders = [\n 'Quantity',\n 'Price',\n 'Cost',\n 'Value',\n 'Assets',\n 'Income',\n 'Credit',\n 'Debit',\n 'Balance',\n 'Yield',\n 'Amount',\n 'Brokerage',\n 'GST',\n 'Tax',\n 'Capital',\n 'Gain',\n 'Loss'\n ];\n return numericHeaders.some(function (v) { return header.indexOf(v) >= 0; });\n };\n ReportDownloadService.prototype.getHeaderRow = function (headers) {\n var formattedHeaders = [];\n if (headers) {\n for (var h = 0; h < headers.length; h++) {\n formattedHeaders.push({\n border: [false, false, false, true],\n text: headers[h],\n style: this.pdfBuilder.styles.tableHeader,\n alignment: this.isNumericHeader(headers[h]) ? 'right' : 'left'\n });\n }\n }\n return formattedHeaders;\n };\n ReportDownloadService.prototype.getHoldingsHeaderRow = function (headers) {\n var formattedHeaders = [];\n if (headers) {\n for (var h = 0; h < headers.length; h++) {\n formattedHeaders.push({\n border: [false, true, false, true],\n text: headers[h],\n style: this.pdfBuilder.styles.filledHoldingsHeader,\n alignment: this.isNumericHeader(headers[h]) ? 'right' : 'left'\n });\n }\n }\n return formattedHeaders;\n };\n ReportDownloadService.prototype.getRow = function (data, columns) {\n var _this = this;\n var result = [];\n columns.forEach(function (column) {\n if (column && data[column]) {\n var style = JSON.parse(JSON.stringify(_this.pdfBuilder.styles.tableCell));\n if (column === \"profitOrLoss\" || column === \"nativeProfitLoss\") {\n var value = parseFloat(data[column]);\n if (!isNaN(value)) {\n if (value != 0) {\n if (value > 0) {\n style.fillColor = '#dff0d8';\n }\n else {\n style.fillColor = '#f2dede';\n }\n }\n }\n }\n result.push({\n border: [false, false, false, true],\n text: data[column].toString(),\n style: style,\n alignment: !isNaN(data[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left'\n });\n }\n else {\n result.push({ border: [false, false, false, true], text: '' });\n }\n });\n return result;\n };\n ReportDownloadService.prototype.getSubTotalRow = function (data, columns) {\n var _this = this;\n var result = [];\n columns.forEach(function (column) {\n if (column && data[column]) {\n result.push({\n border: [false, true, false, false],\n text: data[column].toString(),\n style: _this.pdfBuilder.styles.tableCell,\n alignment: !isNaN(data[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left'\n });\n }\n else {\n result.push({ border: [false, true, false, false], text: '' });\n }\n });\n return result;\n };\n ReportDownloadService.prototype.getFooterRow = function (footerLabel, columns, footerColspan, footerData) {\n var workingColumns = angular.copy(columns);\n var result = [];\n if (footerLabel) {\n result = [{\n text: footerLabel,\n colSpan: footerColspan,\n style: { bold: true },\n alignment: 'left',\n border: [false, false, false, false]\n }];\n delete workingColumns[0]; //this is to keep the same col count same as the rest of the table rows\n }\n if (!workingColumns || workingColumns.length <= 0) {\n return result;\n }\n workingColumns.forEach(function (column) {\n if (column && footerData[column]) {\n result.push({\n text: footerData[column].toString(),\n style: { bold: true },\n alignment: !isNaN(footerData[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left',\n margin: [0, 0, 0, 0],\n border: [false, true, false, false]\n });\n }\n else {\n result.push({ text: '', style: { bold: true }, border: [false, false, false, false] });\n }\n });\n return result;\n };\n ReportDownloadService.prototype.getSubTotalFooterRow = function (footerLabel, columns, footerColspan, footerData) {\n var workingColumns = angular.copy(columns);\n var result = [];\n if (footerLabel) {\n result = [{\n text: footerLabel,\n colSpan: footerColspan,\n style: 'footerRow',\n alignment: 'left',\n border: [false, true, false, false]\n }];\n delete workingColumns[0]; //this is to keep the same col count same as the rest of the table rows\n }\n if (!workingColumns || workingColumns.length <= 0) {\n return result;\n }\n workingColumns.forEach(function (column) {\n if (column && footerData[column]) {\n result.push({\n text: footerData[column].toString(),\n style: 'footerRow',\n alignment: !isNaN(footerData[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left',\n margin: [0, 0, 0, 0],\n border: [false, true, false, false]\n });\n }\n else {\n result.push({ text: '', style: 'footerRow', border: [false, true, false, false] });\n }\n });\n return result;\n };\n ReportDownloadService.prototype.integerFormatted = function (amount) {\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\n return '';\n }\n var i = parseInt(amount);\n return this.addCommas(i.toString());\n };\n ReportDownloadService.prototype.formatAsCurrency4DecPts = function (amount) {\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\n return '';\n }\n return amount.toFixed(4).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,');\n };\n ReportDownloadService.prototype.currencyFormatted = function (amount) {\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\n return '';\n }\n var i = parseFloat(amount);\n if (isNaN(i)) {\n i = 0.00;\n }\n var minus = '';\n if (i < 0) {\n minus = '-';\n }\n i = Math.abs(i);\n i = parseInt(((i + .005) * 100).toString());\n i = i / 100;\n var s = i.toString();\n if (s.indexOf('.') < 0) {\n s += '.00';\n }\n if (s.indexOf('.') === (s.length - 2)) {\n s += '0';\n }\n s = minus + s;\n return this.addCommas(s);\n };\n ReportDownloadService.prototype.addCommas = function (nStr) {\n nStr = nStr + '';\n var x = nStr.split('.');\n var x1 = x[0];\n var x2 = x.length > 1 ? '.' + x[1] : '';\n var rgx = /(\\d+)(\\d{3})/;\n while (rgx.test(x1)) {\n x1 = x1.replace(rgx, '$1' + ',' + '$2');\n }\n return x1 + x2;\n };\n ReportDownloadService.prototype.absoluteValue = function (amount) {\n if (amount === null || amount === undefined) {\n return null;\n }\n return Math.abs(amount);\n };\n ReportDownloadService.prototype.percentFormatted = function (amount) {\n var numberString = this.currencyFormatted(amount);\n return numberString + \"%\";\n };\n ReportDownloadService.prototype.getFileName = function () {\n if (this.account == null) {\n return \"\";\n }\n if (this.report == null) {\n return \"\";\n }\n var accountId = this.account.accountId;\n var startDate = moment(this.report.dateFrom).format(\"YYYY-MM-DD\");\n var endDate = moment(this.report.dateTo).format(\"YYYY-MM-DD\");\n return accountId + \"-\" + this.report.reportType + \"-\" + startDate + \"_\" + endDate;\n };\n ReportDownloadService.prototype.createCsvFile = function () {\n var nowDate = moment(new Date());\n var topLine = ReportDownloadService.getCsvTopLine(this.account, this.report.creationDateUtc, this.report.dateFrom, this.report.dateTo, this.report.asAtDate);\n var columnDefinition = this.getColumnDefinitions(this.report.reportType);\n var header = this.getCsvColumnHeadings();\n var columnNames = this.getCsvColumnNames();\n var data = this.getCsvData();\n var groupBy = columnDefinition.csvGroupBy;\n var csvContent = [];\n var processCsvRows = function (rows) {\n for (var i = 0; i < rows.length; i++) {\n var row = rows[i];\n var rowItems = [];\n for (var columnIndex = 0; columnIndex < columnNames.length; columnIndex++) {\n var val = row[columnNames[columnIndex]];\n rowItems.push(val);\n }\n csvContent.push(rowItems);\n }\n };\n if (groupBy) {\n csvContent.push([topLine]);\n csvContent.push([]);\n // Group data by category\n var groupedData = data.reduce(function (acc, row) {\n var category = row[groupBy];\n if (!acc[category]) {\n acc[category] = [];\n }\n acc[category].push(row);\n return acc;\n }, {});\n // Loop through each category and its rows\n for (var category in groupedData) {\n csvContent.push([category]);\n csvContent.push(header); // Add column headings for each category\n var rows = groupedData[category];\n // Loop through each row in the current category\n processCsvRows(rows);\n }\n }\n else {\n csvContent.push([topLine]);\n csvContent.push(header);\n processCsvRows(data);\n }\n var managedAccounts = this.report.managedAccounts;\n if (managedAccounts) {\n Object.keys(managedAccounts).forEach(function (key) {\n if (managedAccounts[key].items.length) {\n csvContent.push([\"CG Managed Accounts\"]);\n for (var i = 0; i < managedAccounts[key].items.length; i++) {\n if (managedAccounts[key].items[i] && managedAccounts[key].items[i].items.length > 0) {\n var asset = managedAccounts[key].items[i];\n csvContent.push([asset.categoryName, \"\", \"\", \"\", asset.subtotal.totalCost, \"\", asset.subtotal.marketValue, asset.subtotal.profitOrLoss, asset.subtotal.pctAssets, \"\", \"\", \"\"]);\n csvContent.push(header);\n processCsvRows(asset.items);\n }\n }\n }\n });\n }\n var csvTotalColumnNames = columnDefinition.csvTotalColumnNames;\n var csvTotalDisplayNames = columnDefinition.csvTotalDisplayNames;\n if (columnDefinition.csvTotalColumnNames) {\n var totals = this.report.grandTotal;\n //Grand totals\n csvContent.push(csvTotalDisplayNames);\n var rowItems = [];\n for (var columnIndex = 0; columnIndex < csvTotalColumnNames.length; columnIndex++) {\n var val = totals[csvTotalColumnNames[columnIndex]];\n rowItems.push(val);\n }\n csvContent.push(rowItems);\n }\n var EOL = '\\r\\n';\n var csvContentString = \"\";\n for (var _i = 0, csvContent_1 = csvContent; _i < csvContent_1.length; _i++) {\n var row = csvContent_1[_i];\n var rowItems_1 = [];\n for (var _a = 0, row_1 = row; _a < row_1.length; _a++) {\n var field = row_1[_a];\n var val_1 = field;\n if (val_1 === undefined || val_1 === null) {\n val_1 = \"\";\n }\n if (typeof val_1 === 'string') {\n val_1 = val_1.replace(/\"/g, '\"\"');\n }\n if (typeof val_1 === 'number') {\n rowItems_1.push(val_1);\n }\n else {\n rowItems_1.push('\"' + val_1 + '\"');\n }\n }\n csvContentString += rowItems_1.join(',') + EOL;\n }\n return new Blob([csvContentString], { type: 'text/csv;charset=utf-8' });\n };\n ReportDownloadService.prototype.getColumnNames = function () {\n var definitions = this.getColumnDefinitions(this.report.reportType);\n return definitions ? definitions.columnNames : null;\n };\n ReportDownloadService.prototype.getCsvColumnHeadings = function () {\n var definitions = this.getColumnDefinitions(this.report.reportType);\n return definitions ? definitions.csvDisplayNames : null;\n };\n ReportDownloadService.prototype.getCsvColumnNames = function () {\n var definitions = this.getColumnDefinitions(this.report.reportType);\n return definitions ? definitions.csvColumnNames : null;\n };\n ReportDownloadService.getCsvTopLine = function (account, creationDateUtc, dateFrom, dateTo, asAtDate) {\n var adviser = account.adviserName ? account.adviserName :\n account.adviserCode ? account.adviserCode : \"\";\n var timestamp = moment.tz(creationDateUtc, 'Australia/Sydney').format(\"h:mm a [AEST on] D MMM YYYY\");\n var dateString;\n if (asAtDate === undefined) {\n var fromDateStr = moment(dateFrom).format(\"[From:] D MMM YYYY\");\n var toDateStr = moment(dateTo).format(\"[To:] D MMM YYYY\");\n dateString = fromDateStr + ' ' + toDateStr;\n }\n else {\n var asAtDateStr = moment(asAtDate).format(\"[As at:] D MMM YYYY\");\n dateString = asAtDateStr;\n }\n return 'Adviser: ' + adviser +\n ', Account: ' + account.accountId +\n ', ' + dateString +\n ', Report generated at: ' + timestamp;\n };\n ReportDownloadService.prototype.getCsvData = function () {\n switch (this.report.reportType) {\n case Patersons.ReportType.CapitalTransactions:\n return this.getCapitalTransactionStatementCsv();\n case Patersons.ReportType.QuarterlyReports:\n return this.getQuarterlyReportsCsv();\n case Patersons.ReportType.Cash:\n return this.getCashCsv();\n case Patersons.ReportType.Income:\n return this.getIncomeCsv();\n case Patersons.ReportType.CapitalGains:\n return this.getCapitalGainsCsv();\n case Patersons.ReportType.UnrealisedCapitalGains:\n return this.getUnrealisedCapitalGainsCsv();\n case Patersons.ReportType.Performance:\n return this.getPerformanceCsv();\n case Patersons.ReportType.TaxReports:\n return this.getTaxReportsCsv();\n case Patersons.ReportType.Valuation:\n return this.getValuationStatementCsv();\n case Patersons.ReportType.StandardLedger:\n return this.getStandardLedgerCsv();\n default:\n console.error('Unrecognised report type encountered: ' + this.report.reportType);\n return null;\n }\n };\n ReportDownloadService.prototype.getCapitalTransactionStatementCsv = function () {\n var _this = this;\n var result = [], csvData;\n var statement = this.report;\n var transactions;\n if (statement && statement.tradeCategories && statement.tradeCategories.length > 0) {\n var categories = statement.tradeCategories;\n for (var i = 0; i < categories.length; i++) {\n var category = categories[i];\n transactions = category.transactions;\n csvData = angular.copy(transactions);\n csvData.map(function (txn) {\n delete txn.isSell;\n delete txn.sign;\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n }\n return result;\n };\n ReportDownloadService.prototype.getCapitalGainsCsv = function () {\n var _this = this;\n var result = [], csvData;\n var report = this.report;\n if (report && report.assetClasses.length > 0) {\n var assetClasses = report.assetClasses;\n for (var i = 0; i < assetClasses.length; i++) {\n var assetClass = assetClasses[i];\n var assets = assetClass.assets;\n for (var j = 0; j < assets.length; j++) {\n var asset = assets[j];\n var capitalGains = asset.capitalGains;\n csvData = angular.copy(capitalGains);\n csvData.map(function (txn) {\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n }\n }\n return result;\n };\n ReportDownloadService.prototype.getUnrealisedCapitalGainsCsv = function () {\n var _this = this;\n var result = [], csvData;\n var report = this.report;\n if (report && report.assetClasses.length > 0) {\n var assetClasses = report.assetClasses;\n for (var i = 0; i < assetClasses.length; i++) {\n var assetClass = assetClasses[i];\n var assets = assetClass.assets;\n for (var j = 0; j < assets.length; j++) {\n var asset = assets[j];\n var capitalGains = asset.capitalGains;\n csvData = angular.copy(capitalGains);\n csvData.map(function (txn) {\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n }\n }\n return result;\n };\n ReportDownloadService.prototype.getPerformanceCsv = function () {\n var report = this.report;\n return [report];\n };\n ReportDownloadService.prototype.getQuarterlyReportsCsv = function () {\n var _this = this;\n var result = [], csvData;\n var quarterlyReportsListReport = this.report;\n if (quarterlyReportsListReport && quarterlyReportsListReport.investorDocs && quarterlyReportsListReport.investorDocs.length > 0) {\n var entries = quarterlyReportsListReport.investorDocs;\n csvData = angular.copy(entries);\n csvData.map(function (txn) {\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n return result;\n };\n ReportDownloadService.prototype.getTaxReportsCsv = function () {\n var _this = this;\n var result = [], csvData;\n var taxReportsListReport = this.report;\n if (taxReportsListReport && taxReportsListReport.investorDocs && taxReportsListReport.investorDocs.length > 0) {\n var entries = taxReportsListReport.investorDocs;\n csvData = angular.copy(entries);\n csvData.map(function (txn) {\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n return result;\n };\n ReportDownloadService.prototype.getCashCsv = function () {\n var _this = this;\n var result = [], csvData;\n var cashReport = this.report;\n if (cashReport && cashReport.transactionGroups && cashReport.transactionGroups.length > 0) {\n var groups = cashReport.transactionGroups;\n for (var i = 0; i < groups.length; i++) {\n var group = groups[i];\n var transactions = group.transactions;\n csvData = angular.copy(transactions);\n csvData.map(function (txn) {\n delete txn.aac;\n delete txn.accountName;\n delete txn.netValue;\n delete txn.openingBalance;\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n }\n return result;\n };\n ReportDownloadService.prototype.getIncomeCsv = function () {\n var _this = this;\n var result = [], csvData, transactions;\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\n var headerCols = columnDefinitions.columnNames;\n var displayHeaderCols = columnDefinitions.displayNames;\n var widths = columnDefinitions.columnWidths;\n var incomeReport = this.report;\n var transactionTypeCategories = incomeReport.transactionTypeCategories;\n if (transactionTypeCategories && transactionTypeCategories.length > 0) {\n for (var cat = 0; cat < transactionTypeCategories.length; cat++) {\n var subcategories = transactionTypeCategories[cat].subCategories;\n for (var subCat = 0; subCat < subcategories.length; subCat++) {\n var lineItems = subcategories[subCat].lineItems;\n csvData = angular.copy(lineItems);\n csvData.map(function (txn) {\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n }\n }\n return result;\n };\n ReportDownloadService.prototype.getStandardLedgerCsv = function () {\n var _this = this;\n var result = [], csvData, transactions;\n var standardLedgerReport = this.report;\n if (standardLedgerReport && standardLedgerReport.ledgerEntries && standardLedgerReport.ledgerEntries.length > 0) {\n var entries = standardLedgerReport.ledgerEntries;\n csvData = angular.copy(entries);\n csvData.map(function (txn) {\n return _this.formatDataRow(txn);\n });\n result = result.concat(csvData);\n }\n return result;\n };\n ReportDownloadService.prototype.getValuationStatementCsv = function () {\n var _this = this;\n var result = [];\n var csvData;\n var statement = this.report;\n if (statement.nonLoaSecurities && statement.nonLoaSecurities.length > 0) {\n var categories = statement.nonLoaSecurities;\n categories.forEach(function (cat) {\n csvData = angular.copy(cat.items);\n csvData = csvData.map(function (itm) {\n return {\n category: itm.categoryName,\n code: itm.code,\n securityName: itm.securityName,\n quantity: itm.quantity,\n costPrice: _this.safeFixedDecimals(itm.costPrice, 4),\n totalCost: _this.safeFixedDecimals(itm.totalCost, 2),\n price: _this.safeFixedDecimals(itm.price, 4),\n marketValue: _this.safeFixedDecimals(itm.marketValue, 2),\n profitOrLoss: _this.safeFixedDecimals(itm.profitOrLoss, 2),\n pctAssets: _this.safeFixedDecimals(itm.pctAssets, 2),\n estAnnualIncome: _this.safeFixedDecimals(itm.estAnnualIncome, 2),\n estFrankingCredits: _this.safeFixedDecimals(itm.estFrankingCredits, 2),\n estGrossYield: _this.safeFixedDecimals(itm.estGrossYield, 2)\n };\n });\n result = result.concat(csvData);\n });\n }\n if (statement.nonLoaUnsettledDividends && statement.nonLoaUnsettledDividends.items && statement.nonLoaUnsettledDividends.items.length > 0) {\n var dividends = statement.nonLoaUnsettledDividends;\n csvData = angular.copy(dividends.items);\n csvData = csvData.map(function (itm) {\n return {\n category: \"Unsettled Dividends\",\n code: itm.securityCode,\n securityName: itm.securityName,\n quantity: null,\n costPrice: null,\n totalCost: null,\n price: null,\n marketValue: _this.safeFixedDecimals(itm.unsettledIncome, 2),\n profitOrLoss: null,\n pctAssets: null,\n estAnnualIncome: null,\n estFrankingCredits: null,\n estGrossYield: null\n };\n });\n result = result.concat(csvData);\n }\n if (statement.loaSecurities && statement.loaSecurities.length > 0) {\n var categories = statement.loaSecurities;\n categories.forEach(function (cat) {\n csvData = angular.copy(cat.items);\n csvData = csvData.map(function (itm) {\n return {\n category: itm.categoryName,\n code: itm.code,\n securityName: itm.securityName,\n quantity: itm.quantity,\n costPrice: _this.safeFixedDecimals(itm.costPrice, 4),\n totalCost: _this.safeFixedDecimals(itm.totalCost, 2),\n price: _this.safeFixedDecimals(itm.price, 4),\n marketValue: _this.safeFixedDecimals(itm.marketValue, 2),\n profitOrLoss: _this.safeFixedDecimals(itm.profitOrLoss, 2),\n pctAssets: _this.safeFixedDecimals(itm.pctAssets, 2),\n estAnnualIncome: _this.safeFixedDecimals(itm.estAnnualIncome, 2),\n estFrankingCredits: _this.safeFixedDecimals(itm.estFrankingCredits, 2),\n estGrossYield: _this.safeFixedDecimals(itm.estGrossYield, 2)\n };\n });\n result = result.concat(csvData);\n });\n }\n if (statement.loaUnsettledDividends && statement.loaUnsettledDividends.items && statement.loaUnsettledDividends.items.length > 0) {\n var dividends = statement.loaUnsettledDividends;\n csvData = angular.copy(dividends.items);\n csvData = csvData.map(function (itm) {\n return {\n category: \"Unsettled Dividends\",\n code: itm.securityCode,\n securityName: itm.securityName,\n quantity: null,\n costPrice: null,\n totalCost: null,\n price: null,\n marketValue: _this.safeFixedDecimals(itm.unsettledIncome, 2),\n profitOrLoss: null,\n pctAssets: null,\n estAnnualIncome: null,\n estFrankingCredits: null,\n estGrossYield: null\n };\n });\n result = result.concat(csvData);\n }\n return result;\n };\n ReportDownloadService.prototype.safeFixedDecimals = function (value, decimals) {\n if (value === null || value === undefined) {\n return undefined;\n }\n return parseFloat(value.toFixed(decimals));\n };\n ReportDownloadService.prototype.getPerformanceLayout = function () {\n var _this = this;\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 1 || i === node.table.body.length - 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n };\n ReportDownloadService.prototype.getTablelayout = function (subtotal, total, headers, holdings, noFooter) {\n var _this = this;\n if (noFooter === void 0) { noFooter = null; }\n if (holdings) {\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 0) {\n return 'black';\n }\n if (i === 2 || i === node.table.body.length - 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n //return 'lightgray';\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n }\n if (subtotal) {\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 0) {\n return _this.userCompany.colorSecondary;\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n }\n if (total) {\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 0) {\n return _this.userCompany.colorSecondary;\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n }\n if (headers) {\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 1 || i === node.table.body.length - 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n }\n if (noFooter) {\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n }\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n //hLineColor: function(i, node) { return 'lightgray';},\n hLineColor: function (i, node) {\n if (i === node.table.body.length) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; }\n };\n };\n ReportDownloadService.prototype.layoutThinLightBorderHeader = function () {\n var _this = this;\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 1 || i === node.table.body.length - 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; },\n };\n };\n ReportDownloadService.prototype.layoutThinLightBorderHeaderHoldings = function () {\n var _this = this;\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n hLineColor: function (i, node) {\n if (i === 2 || i === node.table.body.length - 1) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; },\n };\n };\n ReportDownloadService.prototype.layoutThinLightBorder = function () {\n var _this = this;\n return {\n hLineWidth: function (i, node) { return 1; },\n vLineWidth: function (i, node) { return 1; },\n //hLineColor: function(i, node) { return 'lightgray';},\n hLineColor: function (i, node) {\n if (i === node.table.body.length) {\n return _this.userCompany.colorSecondary;\n }\n else {\n return 'lightgray';\n }\n },\n vLineColor: function (i, node) { return 'lightgray'; },\n };\n };\n ReportDownloadService.$inject = ['$q', '$filter', 'pdfBuilderService', 'userCompanyService'];\n return ReportDownloadService;\n }());\n Patersons.ReportDownloadService = ReportDownloadService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var BulkDownloadService = (function () {\n function BulkDownloadService($q, $window, $http) {\n this.downloadItems = function (items, zipFilename) {\n var zip = new JSZip();\n var http = this.http;\n var window = this.window;\n var fileDownloads = [];\n angular.forEach(items, function (item) {\n fileDownloads.push(http.get(item.uri, { responseType: 'arraybuffer' })\n .then(function (result) {\n var filename = item.name;\n // If the item has a pretty filename then use it as the filename\n if (item.prettyFileName && item.prettyFileName !== '') {\n filename = item.prettyFileName;\n }\n console.info('Zipping ' + filename);\n zip.file(filename, result.data, { binary: true });\n })\n .catch(function (response) {\n console.error('Error downloading file from ' + item.uri, response.status, response.data);\n }));\n });\n var deferred = this.q.defer();\n return this.q.all(fileDownloads)\n .then(function () {\n console.info('Generating zip file');\n zip.generateAsync({ type: \"blob\" })\n .then(function (blob) {\n window.saveAs(blob, zipFilename);\n deferred.resolve();\n return deferred.promise;\n })\n .catch(function (response) {\n console.error('Error saving zip file', response.status, response.data);\n deferred.reject(response);\n return deferred.promise;\n });\n });\n };\n this.q = $q;\n this.http = $http;\n this.window = $window;\n }\n BulkDownloadService.$inject = ['$q', '$window', '$http'];\n return BulkDownloadService;\n }());\n Patersons.BulkDownloadService = BulkDownloadService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var HelpService = (function (_super) {\n __extends(HelpService, _super);\n function HelpService() {\n _super.apply(this, arguments);\n }\n HelpService.prototype.getFAQs = function () {\n return this.get(\"/dataService/api/Faqs\");\n };\n ;\n return HelpService;\n }(Patersons.BaseService));\n Patersons.HelpService = HelpService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var NewsService = (function (_super) {\n __extends(NewsService, _super);\n function NewsService() {\n _super.apply(this, arguments);\n }\n NewsService.prototype.getNews = function () {\n return this.get(\"/dataService/api/News\");\n };\n ;\n return NewsService;\n }(Patersons.BaseService));\n Patersons.NewsService = NewsService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var UserCompanyService = (function (_super) {\n __extends(UserCompanyService, _super);\n function UserCompanyService() {\n _super.apply(this, arguments);\n this.userCompany = null;\n }\n UserCompanyService.prototype.waitForGettingData = function () {\n var _this = this;\n var deferred = this.q.defer();\n var check = function () {\n setTimeout(function () {\n if (!_this.isGettingData) {\n deferred.resolve(true);\n }\n else {\n check();\n }\n }, 300);\n };\n check();\n return deferred.promise;\n };\n UserCompanyService.prototype.setFavicon = function () {\n if (this.userCompany && this.userCompany.faviconImage && !this.isFaviconSet) {\n $(\"#favicon\").attr(\"href\", this.userCompany.faviconImage);\n $(\"#favicon-shortcut\").attr(\"href\", this.userCompany.faviconImage);\n this.isFaviconSet = true;\n }\n };\n UserCompanyService.prototype.setTheme = function () {\n if (this.userCompany.colorPrimary && this.userCompany.colorPrimaryDarker && this.userCompany.colorTertiary && this.userCompany.colorSecondary && !this.isThemeSet) {\n document.documentElement.style.setProperty('--color-primary', this.userCompany.colorPrimary);\n document.documentElement.style.setProperty('--color-primary-darker', this.userCompany.colorPrimaryDarker);\n document.documentElement.style.setProperty('--color-tertiary', this.userCompany.colorTertiary);\n document.documentElement.style.setProperty('--color-secondary', this.userCompany.colorSecondary);\n cssVars({\n variables: {\n '--color-primary': this.userCompany.colorPrimary,\n '--color-primary-darker': this.userCompany.colorPrimaryDarker,\n '--color-tertiary': this.userCompany.colorTertiary,\n '--color-secondary': this.userCompany.colorSecondary,\n }\n });\n this.isThemeSet = true;\n }\n };\n UserCompanyService.prototype.getUserCompany = function () {\n var _this = this;\n //provide a fallback company so that the portal does not fail if the API is down\n var fallbackCompany = {\n companyName: \"Canaccord Genuity\",\n companyPdfImage: \"/assets/content/CG WM Digital Black-01.svg\",\n companyPdfImage: \"/assets/content/CG WM Digital Black-01.svg\",\n contactEmail: \"CGAU-CGA@cgf.com\",\n contactPhone: \"1300 582 256\",\n enableWholesaleClientsResearch: false,\n };\n var deferred = this.q.defer(); // Type the deferred to get better 'intellisense' support\n if (this.isGettingData) {\n this.waitForGettingData().then(function () {\n deferred.resolve(_this.userCompany);\n });\n }\n else {\n if (this.userCompany === null) {\n this.isGettingData = true;\n var promise = this.get(\"/dataService/api/userCompany\");\n promise.then(function (data) {\n _this.userCompany = data;\n _this.isGettingData = false;\n _this.setFavicon();\n _this.setTheme();\n deferred.resolve(_this.userCompany);\n }, function (err) {\n _this.isGettingData = false;\n _this.setFavicon();\n _this.setTheme();\n deferred.resolve(fallbackCompany);\n });\n }\n else {\n this.isGettingData = false;\n this.setFavicon();\n deferred.resolve(this.userCompany);\n }\n }\n return deferred.promise;\n };\n ;\n return UserCompanyService;\n }(Patersons.BaseService));\n Patersons.UserCompanyService = UserCompanyService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var RecaptchaVerifyService = (function (_super) {\n __extends(RecaptchaVerifyService, _super);\n function RecaptchaVerifyService() {\n _super.apply(this, arguments);\n }\n // Confirm the response token received from Google Recaptcha is valid\n // This is posted to a server side controller so as not to expose the Recaptcha secret\n RecaptchaVerifyService.prototype.siteVerify = function (response) {\n var rv = new Patersons.RecaptchaVerify();\n rv.remoteip = '';\n rv.response = response;\n var absoluteUrl = this.baseUrl + \"/dataService/api/recaptcha\";\n return this.post(\"/dataService/api/recaptcha\", rv);\n };\n ;\n return RecaptchaVerifyService;\n }(Patersons.BaseService));\n Patersons.RecaptchaVerifyService = RecaptchaVerifyService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ConfigurationService = (function (_super) {\n __extends(ConfigurationService, _super);\n function ConfigurationService() {\n _super.apply(this, arguments);\n }\n ConfigurationService.prototype.getValueByKey = function (key) {\n return this.get(\"/dataService/odata/appconfigurations('\" + key + \"')\");\n };\n return ConfigurationService;\n }(Patersons.BaseService));\n Patersons.ConfigurationService = ConfigurationService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var BannerService = (function (_super) {\n __extends(BannerService, _super);\n function BannerService() {\n _super.apply(this, arguments);\n }\n BannerService.prototype.getCurrent = function () {\n return this.get(\"/dataService/odata/banners?$filter=publishDate lt \" + new Date().toJSON() + \"&$orderby=publishDate desc&$top=1\");\n };\n return BannerService;\n }(Patersons.BaseService));\n Patersons.BannerService = BannerService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ChangeRequest = (function () {\n function ChangeRequest() {\n this.isApproved = false;\n this.isRejected = false;\n }\n return ChangeRequest;\n }());\n Patersons.ChangeRequest = ChangeRequest;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ChangeRequestService = (function (_super) {\n __extends(ChangeRequestService, _super);\n function ChangeRequestService() {\n _super.apply(this, arguments);\n }\n ChangeRequestService.prototype.getChangeRequests = function () {\n return this.get(\"/dataService/odata/changeRequests\");\n };\n ChangeRequestService.prototype.getChangeRequestsForApproval = function () {\n return this.get(\"/dataService/odata/changeRequests/ChangeRequestService.GetChangeRequestsForApproval\");\n };\n ChangeRequestService.prototype.approveChangeRequest = function (changeRequestId, verificationCode) {\n return this.post('/dataService/odata/changeRequests(' + changeRequestId + ')/ChangeRequestService.ApproveChangeRequest', { smsToken: verificationCode });\n };\n ;\n ChangeRequestService.prototype.rejectChangeRequest = function (changeRequestId) {\n return this.post('/dataService/odata/changeRequests(' + changeRequestId + ')/ChangeRequestService.RejectChangeRequest', null);\n };\n ;\n ChangeRequestService.prototype.areAllAccountApproversRegistered = function (accountCode) {\n return this.get(\"/dataService/api/portfolios/\" + accountCode + \"/AreAllAccountApproversRegistered\");\n };\n ;\n ChangeRequestService.prototype.getAccountApproversCount = function (accountCode) {\n return this.get(\"/dataService/api/portfolios/\" + accountCode + \"/GetAccountApproversCount\");\n };\n ;\n return ChangeRequestService;\n }(Patersons.BaseService));\n Patersons.ChangeRequestService = ChangeRequestService;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var Feed = (function () {\n function Feed() {\n }\n return Feed;\n }());\n Patersons.Feed = Feed;\n var ResearchFeedService = (function (_super) {\n __extends(ResearchFeedService, _super);\n function ResearchFeedService() {\n _super.apply(this, arguments);\n }\n ResearchFeedService.prototype.getAllPrivateWealthResearch = function () {\n return this.get(\"/dataService/api/ResearchArticles/AllPrivateWealthResearch\");\n };\n ResearchFeedService.prototype.getAllStrategyAndEconomics = function () {\n return this.get(\"/dataService/api/ResearchArticles/AllStrategyAndEconomics\");\n };\n ResearchFeedService.prototype.getFeaturedStrategyAndEconomics = function () {\n return this.get(\"/dataService/api/ResearchArticles/FeaturedStrategyAndEconomics\");\n };\n ResearchFeedService.prototype.getTop3StrategyAndEconomics = function () {\n return this.get(\"/dataService/api/ResearchArticles/Top3StrategyAndEconomics\");\n };\n ResearchFeedService.prototype.getTop3PrivateWealthResearch = function () {\n return this.get(\"/dataService/api/ResearchArticles/Top3PrivateWealthResearch\");\n };\n ResearchFeedService.prototype.getLatestMorningMarket = function () {\n return this.get(\"/dataService/api/ResearchArticles/LatestMorningMarket\");\n };\n ResearchFeedService.prototype.getAllQuantitativeAnalysis = function () {\n return this.get(\"/dataService/api/ResearchArticles/AllQuantitativeAnalysis\");\n };\n ResearchFeedService.prototype.getFeaturedQuantitativeAnalysis = function () {\n return this.get(\"/dataService/api/ResearchArticles/FeaturedQuantitativeAnalysis\");\n };\n ResearchFeedService.prototype.getFeaturedPrivateWealthResearch = function () {\n return this.get(\"/dataService/api/ResearchArticles/FeaturedPrivateWealthResearch\");\n };\n ResearchFeedService.prototype.getTop3QuantitativeAnalysis = function () {\n return this.get(\"/dataService/api/ResearchArticles/Top3QuantitativeAnalysis\");\n };\n ResearchFeedService.prototype.getArticle = function (articleId) {\n return this.get(\"/dataService/api/ResearchArticles/GetArticle?articleId=\" + articleId);\n };\n ResearchFeedService.prototype.getLatestFeedItemForCategory = function (feedItems, category) {\n console.log(feedItems);\n if (feedItems === null || feedItems === undefined) {\n return null;\n }\n var filteredItems = feedItems.filter(function (item) { return item.publication.toLowerCase() === category.toLowerCase(); });\n return this.orderFeedItemsByPublishedDateDescending(filteredItems)[0];\n };\n ResearchFeedService.prototype.getLatestFeedItemExcludingCategories = function (feedItems, categories, index) {\n if (feedItems === null || feedItems === undefined) {\n return null;\n }\n var filteredItems = feedItems.filter(function (item) { return !item.categories.some(function (c) { return categories.indexOf(c) != -1; }); });\n if (filteredItems.length <= index) {\n return null;\n }\n return this.orderFeedItemsByPublishedDateDescending(filteredItems)[index];\n };\n ResearchFeedService.prototype.orderFeedItemsByPublishedDateDescending = function (feedItems) {\n if (feedItems === null || feedItems === undefined) {\n return null;\n }\n return feedItems.sort(function (a, b) {\n return moment(b.publishedDate).toDate().getTime() - moment(a.publishedDate).toDate().getTime();\n });\n };\n return ResearchFeedService;\n }(Patersons.BaseService));\n Patersons.ResearchFeedService = ResearchFeedService;\n})(Patersons || (Patersons = {}));\n\nvar myServiceModule = angular.module(\"app.services\", []);\nmyServiceModule.value(\"version\", \"1.0.0\");\nmyServiceModule.service('selectionService', Patersons.SelectionService);\nmyServiceModule.service('tokenService', Patersons.TokenService);\nmyServiceModule.service('sessionService', Patersons.SessionService);\nmyServiceModule.service('bearerInjector', Patersons.BearerInjector);\nmyServiceModule.service('identityService', Patersons.IdentityService);\nmyServiceModule.service('analysisService', Patersons.AnalysisService);\nmyServiceModule.service('clientConfigService', Patersons.ClientConfigService);\nmyServiceModule.service('portfolioService', Patersons.PortfolioService);\nmyServiceModule.service('myDetailsService', Patersons.MyDetailsService);\nmyServiceModule.service('recaptchaVerifyService', Patersons.RecaptchaVerifyService);\nmyServiceModule.service('configurationService', Patersons.ConfigurationService);\nmyServiceModule.service('bannerService', Patersons.BannerService);\nmyServiceModule.service('reportService', Patersons.ReportService);\nmyServiceModule.service('reportDownloadService', Patersons.ReportDownloadService);\nmyServiceModule.service('navigationService', Patersons.NavigationService);\nmyServiceModule.service('bulkDownloadService', Patersons.BulkDownloadService);\nmyServiceModule.service('helpService', Patersons.HelpService);\nmyServiceModule.service('newsService', Patersons.NewsService);\nmyServiceModule.service('userCompanyService', Patersons.UserCompanyService);\nmyServiceModule.service('changeRequestService', Patersons.ChangeRequestService);\nmyServiceModule.service('morningStarService', Patersons.MorningStarService);\nmyServiceModule.service('researchFeedService', Patersons.ResearchFeedService);\nmyServiceModule.service('pdfBuilderService', Patersons.PDFBuilderService);\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var MorningStarXrayPortfolio = (function () {\n function MorningStarXrayPortfolio() {\n this.apiOptions = '{type: 3}';\n this.holdingAllocation = new Array();\n this.benchmark = new MorningStarXrayIdentifier('EUCA000620', 'MSID', 0); // the morningstar MSID they gave us...it will probably change\n }\n return MorningStarXrayPortfolio;\n }());\n Patersons.MorningStarXrayPortfolio = MorningStarXrayPortfolio;\n var MorningStarXrayIdentifier = (function () {\n function MorningStarXrayIdentifier($identifier, $type, $amount) {\n this.Identifier = $identifier;\n this.IdentifierType = $type;\n this.Amount = $amount;\n }\n return MorningStarXrayIdentifier;\n }());\n Patersons.MorningStarXrayIdentifier = MorningStarXrayIdentifier;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var Investor = (function () {\n function Investor() {\n }\n return Investor;\n }());\n Patersons.Investor = Investor;\n var AccoladeOptions = (function () {\n function AccoladeOptions() {\n }\n return AccoladeOptions;\n }());\n Patersons.AccoladeOptions = AccoladeOptions;\n var ResearchSubscription = (function () {\n function ResearchSubscription() {\n }\n return ResearchSubscription;\n }());\n Patersons.ResearchSubscription = ResearchSubscription;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var OrderRequest = (function () {\n function OrderRequest() {\n }\n return OrderRequest;\n }());\n Patersons.OrderRequest = OrderRequest;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var User = (function () {\n function User() {\n }\n return User;\n }());\n Patersons.User = User;\n var Profile = (function () {\n function Profile() {\n }\n return Profile;\n }());\n Patersons.Profile = Profile;\n var ProfileAddress = (function () {\n function ProfileAddress() {\n }\n Object.defineProperty(ProfileAddress.prototype, \"address\", {\n get: function () {\n return [this.addressLine1, this.addressLine2, this.addressLine3, this.addressLine4, this.postcode, this.country].filter(Boolean).join(\"\\n\");\n },\n enumerable: true,\n configurable: true\n });\n return ProfileAddress;\n }());\n Patersons.ProfileAddress = ProfileAddress;\n var PhoneDetails = (function () {\n function PhoneDetails() {\n }\n return PhoneDetails;\n }());\n Patersons.PhoneDetails = PhoneDetails;\n var ForgottenPanDetails = (function () {\n function ForgottenPanDetails() {\n }\n return ForgottenPanDetails;\n }());\n Patersons.ForgottenPanDetails = ForgottenPanDetails;\n var ForgottenPasswordDetails = (function () {\n function ForgottenPasswordDetails() {\n }\n return ForgottenPasswordDetails;\n }());\n Patersons.ForgottenPasswordDetails = ForgottenPasswordDetails;\n var CreateAccount = (function () {\n function CreateAccount() {\n }\n return CreateAccount;\n }());\n Patersons.CreateAccount = CreateAccount;\n var TaxFileNumber = (function () {\n function TaxFileNumber() {\n }\n return TaxFileNumber;\n }());\n Patersons.TaxFileNumber = TaxFileNumber;\n var PasswordResetDetails = (function () {\n function PasswordResetDetails() {\n }\n return PasswordResetDetails;\n }());\n Patersons.PasswordResetDetails = PasswordResetDetails;\n var SetPasswordDetails = (function () {\n function SetPasswordDetails() {\n }\n return SetPasswordDetails;\n }());\n Patersons.SetPasswordDetails = SetPasswordDetails;\n var ChangePasswordDetails = (function () {\n function ChangePasswordDetails() {\n }\n return ChangePasswordDetails;\n }());\n Patersons.ChangePasswordDetails = ChangePasswordDetails;\n var ChangeEmailDetails = (function () {\n function ChangeEmailDetails() {\n }\n return ChangeEmailDetails;\n }());\n Patersons.ChangeEmailDetails = ChangeEmailDetails;\n var SkipMobileDetails = (function () {\n function SkipMobileDetails() {\n this.skipMobileRegistration = true;\n }\n return SkipMobileDetails;\n }());\n Patersons.SkipMobileDetails = SkipMobileDetails;\n var PhoneConfirmationDetails = (function () {\n function PhoneConfirmationDetails() {\n }\n return PhoneConfirmationDetails;\n }());\n Patersons.PhoneConfirmationDetails = PhoneConfirmationDetails;\n var EmailConfirmation = (function () {\n function EmailConfirmation() {\n }\n return EmailConfirmation;\n }());\n Patersons.EmailConfirmation = EmailConfirmation;\n var ClientAdviser = (function () {\n function ClientAdviser(firstname, surname, telephone, email, description, headshotLarge, headshotSmall) {\n this.Firstname = firstname;\n this.Surname = surname;\n this.Telephone = telephone;\n this.Email = email;\n this.Description = description;\n this.HeadshotLarge = headshotLarge;\n this.HeadshotSmall = headshotSmall;\n }\n return ClientAdviser;\n }());\n Patersons.ClientAdviser = ClientAdviser;\n var RecaptchaVerify = (function () {\n function RecaptchaVerify() {\n }\n return RecaptchaVerify;\n }());\n Patersons.RecaptchaVerify = RecaptchaVerify;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var UserPreferences = (function () {\n function UserPreferences() {\n this.pan = '';\n this.skipMobileRegistration = false;\n }\n UserPreferences.load = function (pan) {\n var prefsString = localStorage.getItem(UserPreferences.preferenceKeyName(pan));\n var prefs = JSON.parse(prefsString) || new UserPreferences();\n prefs.pan = pan;\n return prefs;\n };\n UserPreferences.prototype.save = function () {\n var prefsString = JSON.stringify(this, this.jsonReplacer);\n localStorage.setItem(UserPreferences.preferenceKeyName(this.pan), prefsString);\n };\n UserPreferences.preferenceKeyName = function (pan) {\n return \"Patersons.Preferences.\" + pan;\n };\n UserPreferences.prototype.jsonReplacer = function (key, value) {\n if (key == 'pan') {\n return undefined;\n }\n else {\n return value;\n }\n };\n return UserPreferences;\n }());\n Patersons.UserPreferences = UserPreferences;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var WatchlistItem = (function () {\n function WatchlistItem(watchlistId, isin) {\n this.isin = isin;\n this.watchlistId = watchlistId;\n }\n return WatchlistItem;\n }());\n Patersons.WatchlistItem = WatchlistItem;\n var Watchlist = (function () {\n function Watchlist(watchlistId, name, description) {\n this.id = watchlistId;\n this.name = name;\n this.description = description;\n this.watchlistItems = new Array();\n }\n return Watchlist;\n }());\n Patersons.Watchlist = Watchlist;\n var Security = (function () {\n function Security() {\n }\n return Security;\n }());\n Patersons.Security = Security;\n (function (SelectListType) {\n SelectListType[SelectListType[\"portfolio\"] = 1] = \"portfolio\";\n SelectListType[SelectListType[\"model\"] = 2] = \"model\";\n SelectListType[SelectListType[\"watchlist\"] = 3] = \"watchlist\";\n })(Patersons.SelectListType || (Patersons.SelectListType = {}));\n var SelectListType = Patersons.SelectListType;\n var WatchlistSelectListDescriptor = (function () {\n function WatchlistSelectListDescriptor() {\n }\n return WatchlistSelectListDescriptor;\n }());\n Patersons.WatchlistSelectListDescriptor = WatchlistSelectListDescriptor;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var Account = (function () {\n function Account() {\n this.headerLoaded = false;\n this.summaryLoaded = false;\n this.summaryError = false;\n this.headerError = false;\n this.isAuthorisedAgentAccount = false;\n }\n return Account;\n }());\n Patersons.Account = Account;\n var AccountAddresses = (function () {\n function AccountAddresses() {\n }\n return AccountAddresses;\n }());\n Patersons.AccountAddresses = AccountAddresses;\n var BankingDetails = (function () {\n function BankingDetails() {\n }\n return BankingDetails;\n }());\n Patersons.BankingDetails = BankingDetails;\n // NOTE: In the UI templates, these are referred to as 'Contract Notes'.\n var ConfirmationNote = (function () {\n function ConfirmationNote() {\n }\n return ConfirmationNote;\n }());\n Patersons.ConfirmationNote = ConfirmationNote;\n var Holding = (function () {\n function Holding(marketValue, totalCost, assetCategory, isin, securityName) {\n this.marketValue = marketValue;\n this.totalCost = totalCost;\n this.assetCategory = assetCategory;\n this.isin = isin;\n this.securityName = securityName;\n }\n return Holding;\n }());\n Patersons.Holding = Holding;\n var Sector = (function () {\n function Sector() {\n }\n return Sector;\n }());\n Patersons.Sector = Sector;\n var BankAccountDetail = (function () {\n function BankAccountDetail() {\n }\n return BankAccountDetail;\n }());\n Patersons.BankAccountDetail = BankAccountDetail;\n var CashDeposit = (function () {\n function CashDeposit() {\n }\n return CashDeposit;\n }());\n Patersons.CashDeposit = CashDeposit;\n var TermDeposit = (function () {\n function TermDeposit() {\n }\n TermDeposit.prototype.hasData = function () {\n return ((typeof this.accountCode != 'undefined' && this.accountCode) ||\n (typeof this.balance != 'undefined' && this.balance) ||\n (typeof this.rate != 'undefined' && this.rate) ||\n (typeof this.maturityDate != 'undefined' && this.maturityDate) ||\n (typeof this.provider != 'undefined' && this.provider));\n };\n return TermDeposit;\n }());\n Patersons.TermDeposit = TermDeposit;\n var Quote = (function () {\n function Quote() {\n }\n return Quote;\n }());\n Patersons.Quote = Quote;\n var Address = (function () {\n function Address() {\n }\n return Address;\n }());\n Patersons.Address = Address;\n var EmailAddress = (function () {\n function EmailAddress(id, emailAddressType, email) {\n this.id = id;\n this.email = email;\n this.emailAddressType = emailAddressType;\n }\n return EmailAddress;\n }());\n Patersons.EmailAddress = EmailAddress;\n var Portfolio = (function () {\n function Portfolio() {\n this.Holdings = new Array();\n }\n return Portfolio;\n }());\n Patersons.Portfolio = Portfolio;\n var SelectedAccountTotal = (function () {\n function SelectedAccountTotal() {\n this.cashBalanceTotal = 0;\n this.equityTotalCostTotal = 0;\n this.equityMarketValueTotal = 0;\n this.equityProfitLossTotal = 0;\n this.equityEstimatedIncomeTotal = 0;\n }\n return SelectedAccountTotal;\n }());\n Patersons.SelectedAccountTotal = SelectedAccountTotal;\n var Banner = (function () {\n function Banner() {\n }\n return Banner;\n }());\n Patersons.Banner = Banner;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var CallbackCtrl = (function () {\n function CallbackCtrl($scope, $location, $window, $state, $http, tokenService, applicationInsightsService, identityService, $analytics) {\n var _this = this;\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.http = $http;\n this.tokenService = tokenService;\n this.identityService = identityService;\n this.state = $state;\n this.$analytics = $analytics;\n var url = this.location.url();\n var querystring = url.substring(url.lastIndexOf('#'), url.length);\n this.scope.events = this;\n console.log(querystring);\n var promise = this.tokenService.tokenManager.processTokenCallbackAsync(querystring);\n promise.then(function (value) {\n // The following sets the unique id for app insights to the sub\n var uuidKey = \"$$appInsights__uuid\";\n var uuid = applicationInsightsService._localStorage.get(uuidKey);\n if (uuid != tokenService.tokenManager.profile.sub) {\n var uuid = applicationInsightsService._localStorage.set(uuidKey, tokenService.tokenManager.profile.sub);\n }\n $scope.events.navigateOnSuccess();\n }, function (reason) {\n alert('An error has occurred: ' + (reason && reason.message || \"Unknown error\"));\n _this.tokenService.tokenManager.removeToken();\n //this.tokenService.tokenManager.redirectForLogout();\n window.location = \"/identity/connect/endsession\";\n });\n }\n CallbackCtrl.prototype.navigateOnSuccess = function () {\n var _this = this;\n var redirect_to = '/dashboard';\n var redirect_uri = window.localStorage.getItem('$psl.redirect_uri');\n if (redirect_uri) {\n window.localStorage.removeItem('$psl.redirect_uri');\n if (redirect_uri.indexOf(\"confirmPassword\") === -1) {\n redirect_to = redirect_uri;\n }\n }\n if (this.tokenService.tokenManager.profile) {\n var profile = this.tokenService.tokenManager.profile;\n //let prefs: UserPreferences = UserPreferences.load(profile.preferred_username);\n this.$analytics.setUsername(profile.preferred_username);\n var trackLoginSuccess = function (callback) {\n if (window['google_tag_manager']) {\n var dataLayer = window[\"dataLayer\"] || [];\n dataLayer.push({\n 'event': 'interaction',\n 'target': 'Login',\n 'action': 'Login Success',\n 'userId': profile.preferred_username,\n 'eventCallback': function () {\n callback();\n },\n 'eventTimeout': 1500\n });\n }\n else {\n callback();\n }\n };\n trackLoginSuccess(function () {\n _this.identityService.getSkipMobileRegistration().\n then(function (skipMobile) {\n if (skipMobile === true) {\n console.log(skipMobile);\n _this.window.location.href = redirect_to;\n return false;\n }\n else {\n // check if phone number is verifyed\n _this.identityService.getIsPhoneNumberVerifyed().\n then(function (phone_number_verified) {\n // if phone is veryfied\n if (phone_number_verified === true) {\n console.log(profile);\n // go to dashboard\n _this.window.location.href = redirect_to;\n return false;\n }\n else {\n // else\n _this.identityService.saveSkipMobileRegistration(new Patersons.SkipMobileDetails()).\n then(function () {\n _this.window.location.href = '/registerMobile';\n }).\n catch(function () {\n _this.window.location.href = '/registerMobile';\n });\n }\n });\n }\n }).\n catch(function (response) {\n _this.window.location.href = redirect_to;\n return false;\n });\n });\n }\n else {\n this.window.location.href = redirect_to;\n return false;\n }\n };\n CallbackCtrl.$inject = ['$scope', '$location', '$window', '$state', '$http', 'tokenService', 'applicationInsightsService', 'identityService', '$analytics'];\n return CallbackCtrl;\n }());\n Patersons.CallbackCtrl = CallbackCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var NavbarCtrl = (function () {\n function NavbarCtrl($scope, $rootScope, $location, $window, $stateParams, $http, sessionService, clientConfigService, userCompanyService) {\n var _this = this;\n this.scope = $scope;\n this.rootScope = $rootScope;\n this.location = $location;\n this.window = $window;\n this.stateParams = $stateParams;\n this.http = $http;\n this.sessionService = sessionService;\n this.clientConfigService = clientConfigService;\n this.userCompanyService = userCompanyService;\n this.scope.editMode = false;\n this.scope.events = this;\n this.scope.isLoggedIn = this.sessionService.isLoggedIn();\n this.scope.isNavCollapsed = true;\n this.scope.adviserList = [];\n console.log('adviserList');\n console.log(this.scope.adviserList);\n if (this.scope.isLoggedIn) {\n //console.log('loadAdviserData');\n this.scope.profile = this.sessionService.getCurrentUserProfile();\n this.loadAdviserData();\n this.loadPendingChangeRequestCount();\n this.load();\n }\n else {\n this.scope.adviserList = [];\n }\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n _this.scope.themeRGB = _this.hexToRgb(company.colorSecondary);\n });\n this.rootScope.$on('changeRequestActioned', function (event, data) {\n $scope.changeRequestCount -= 1;\n });\n console.log('Navbar load');\n }\n NavbarCtrl.prototype.hexToRgb = function (hex) {\n var result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n } : null;\n };\n NavbarCtrl.prototype.load = function () {\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n initComponent('component-autocomplete-top', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteHeader').then(function () {\n console.log('Done loading autocomplete.');\n morningstar.asterix.instanceRegistry.find('ecAutocompleteHeader').on('parameterChanged:latestSelectedSecurity', function (newVal) {\n if (newVal.secId) {\n window['openAutocompleteResult'](newVal); //declared in autocomplete config\n morningstar.asterix.instanceRegistry.get('ecAutocompleteHeader').setParameter('search', '');\n }\n });\n });\n initComponent('component-autocomplete-top-2', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteHeader2').then(function () {\n console.log('Done loading autocomplete.');\n morningstar.asterix.instanceRegistry.find('ecAutocompleteHeader2').on('parameterChanged:latestSelectedSecurity', function (newVal) {\n if (newVal.secId) {\n window['openAutocompleteResult'](newVal); //declared in autocomplete config\n morningstar.asterix.instanceRegistry.get('ecAutocompleteHeader2').setParameter('search', '');\n }\n });\n });\n initComponent('component-autocomplete-top-3', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteHeader3').then(function () {\n console.log('Done loading autocomplete.');\n morningstar.asterix.instanceRegistry.find('ecAutocompleteHeader3').on('parameterChanged:latestSelectedSecurity', function (newVal) {\n if (newVal.secId) {\n window['openAutocompleteResult'](newVal); //declared in autocomplete config\n morningstar.asterix.instanceRegistry.get('ecAutocompleteHeader3').setParameter('search', '');\n }\n });\n });\n });\n };\n NavbarCtrl.prototype.login = function () {\n this.sessionService.login();\n };\n NavbarCtrl.prototype.logout = function () {\n this.sessionService.logout();\n };\n NavbarCtrl.prototype.loadAdviserData = function () {\n var _this = this;\n console.log('loadAdviserData');\n var promise = this.clientConfigService.getAdviser();\n promise.then(function (result) {\n //this.scope.$apply(() => {\n console.log('Loaded advisers');\n console.log(result);\n _this.scope.adviserList = result;\n //});\n }, function (reason) {\n _this.clientConfigService.errorHandler = reason.data;\n });\n };\n NavbarCtrl.prototype.loadPendingChangeRequestCount = function () {\n var _this = this;\n console.log('loadPendingChangeRequestCount');\n var promise = this.clientConfigService.getChangeRequestCount();\n promise.then(function (result) {\n //this.scope.$apply(() => {\n console.log('Loaded change requests');\n console.log(result);\n _this.scope.changeRequestCount = result;\n //});\n }, function (reason) {\n _this.clientConfigService.errorHandler = reason.data;\n });\n };\n NavbarCtrl.$inject = ['$scope', '$rootScope', '$location', '$window', '$stateParams', '$http', 'sessionService', 'clientConfigService', 'userCompanyService'];\n return NavbarCtrl;\n }());\n Patersons.NavbarCtrl = NavbarCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var FooterCtrl = (function () {\n function FooterCtrl($scope, sessionService, userCompanyService, reportService) {\n var _this = this;\n this.scope = $scope;\n this.userCompanyService = userCompanyService;\n this.sessionService = sessionService;\n this.reportService = reportService;\n this.scope.events = this;\n this.scope.isLoggedIn = this.sessionService.isLoggedIn();\n if (this.scope.isLoggedIn) {\n this.scope.profile = this.sessionService.getCurrentUserProfile();\n this.checkFreezeWindow();\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n }\n FooterCtrl.prototype.checkFreezeWindow = function () {\n var _this = this;\n this.reportService.checkFreezeWindow().then(function (freezeWindow) {\n _this.scope.freezeWindow = freezeWindow;\n });\n };\n FooterCtrl.prototype.login = function () {\n this.sessionService.login();\n };\n FooterCtrl.prototype.logout = function () {\n this.sessionService.logout();\n };\n FooterCtrl.$inject = ['$scope', 'sessionService', 'userCompanyService', 'reportService'];\n return FooterCtrl;\n }());\n Patersons.FooterCtrl = FooterCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var LandingCtrl = (function () {\n function LandingCtrl($scope, $location, $window, $state, $stateParams, $http, tokenService) {\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.stateParams = $stateParams;\n this.http = $http;\n this.tokenService = tokenService;\n this.scope.editMode = false;\n this.scope.events = this;\n if (this.tokenService.tokenManager) {\n if (this.tokenService.tokenManager.expired) {\n this.tokenService.tokenManager.redirectForToken();\n }\n else {\n $state.go(\"dashboard\");\n }\n }\n else {\n $state.go(\"dashboard\");\n }\n }\n LandingCtrl.$inject = ['$scope', '$location', '$window', '$state', '$stateParams', '$http', 'tokenService'];\n return LandingCtrl;\n }());\n Patersons.LandingCtrl = LandingCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var AbstractController = (function () {\n function AbstractController($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope) {\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.rootScope = $rootScope;\n this.log = $log;\n var model = document.getElementById(\"model\").textContent.trim();\n var dictionary = JSON.parse(model);\n this.baseUrl = dictionary['hostPath'];\n var userId = dictionary['userId'];\n }\n AbstractController.prototype.redirect = function (url) {\n this.location.url(url);\n this.window.location.href = url;\n this.window.location.reload();\n };\n AbstractController.prototype.errorHandler = function (msg, Url) {\n msg = msg || \"Unexpected Error\";\n var self = this;\n return function (response) {\n if (response.data.exceptionMessage) {\n this.log.error(response.data.exceptionMessage);\n }\n this.rootScope.$emit('error', { error: msg, url: Url });\n throw (response.data.errors || response.data.message || msg);\n };\n };\n AbstractController.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope'];\n return AbstractController;\n }());\n Patersons.AbstractController = AbstractController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var IdentityBaseCtrl = (function (_super) {\n __extends(IdentityBaseCtrl, _super);\n function IdentityBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.deactivateAll();\n }\n IdentityBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return IdentityBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.IdentityBaseCtrl = IdentityBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ForgottenPanCtrl = (function (_super) {\n __extends(ForgottenPanCtrl, _super);\n function ForgottenPanCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, identityService, tokenService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.identityService = identityService;\n this.tokenService = tokenService;\n this.scope.isBusy = false;\n this.scope.events = this;\n this.scope.isTriggered = false;\n }\n ForgottenPanCtrl.prototype.save = function () {\n var _this = this;\n this.scope.isTriggered = false;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.forgottenPanForm.$invalid) {\n return;\n }\n else {\n var dto = new Patersons.ForgottenPanDetails();\n dto.email = this.scope.email;\n dto.dob = moment.utc(this.scope.dob, \"DD/MM/YYYY\").toISOString();\n this.scope.isBusy = true;\n this.identityService.triggerForgottenPan(dto)\n .then(function (result) {\n _this.scope.isTriggered = true;\n _this.returnToLoginScreenIn(30);\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n }\n };\n ForgottenPanCtrl.prototype.returnToLoginScreenIn = function (nSeconds) {\n var _this = this;\n return new Promise(function () { return setTimeout(function () { return _this.tokenService.tokenManager.redirectForToken(); }, nSeconds * 1000); });\n };\n ForgottenPanCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'identityService', 'tokenService', 'navigationService'];\n return ForgottenPanCtrl;\n }(Patersons.IdentityBaseCtrl));\n Patersons.ForgottenPanCtrl = ForgottenPanCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ForgottenPasswordCtrl = (function () {\n function ForgottenPasswordCtrl($scope, $log, $location, $window, $state, $stateParams, $http, identityService, tokenService, userCompanyService) {\n var _this = this;\n this.setResponse = function (response) {\n this.response = response;\n };\n this.setWidgetId = function (widgetId) {\n console.info('Created widget ID: %s', widgetId);\n this.scope.widgetId = widgetId;\n };\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.log = $log;\n this.identityService = identityService;\n this.tokenService = tokenService;\n this.userCompanyService = userCompanyService;\n this.scope.isBusy = false;\n this.scope.isSmsRequired = false;\n this.scope.events = this;\n this.scope.isTriggered = false;\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n ForgottenPasswordCtrl.prototype.save = function () {\n var _this = this;\n this.scope.isTriggered = false;\n this.scope.$broadcast('show-errors-check-validity');\n //if (this.response) {\n // this.verifyResponse(this.response).then((result) => {\n // Once the token has been verified we can then complete the rest of the process\n //if (result && result.data && result.data.success == \"true\") {\n if (this.scope.forgottenPasswordForm.$invalid) {\n return;\n }\n else {\n this.scope.isBusy = true;\n this.identityService.triggerForgottenPassword(this.scope.forgottenPasswordDetails)\n .then(function (result) {\n _this.state.go('confirmPassword');\n }, function (reason) {\n _this.log.warn(reason);\n if (reason.status == '403') {\n _this.scope.isSmsRequired = true;\n }\n if (reason.status == '400') {\n _this.scope.validationMessage = reason.data.Message;\n }\n }).\n finally(function () {\n _this.scope.isBusy = false;\n });\n }\n // }\n // });\n //}\n };\n ForgottenPasswordCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', 'identityService', 'tokenService', 'userCompanyService'];\n return ForgottenPasswordCtrl;\n }());\n Patersons.ForgottenPasswordCtrl = ForgottenPasswordCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var TwoFactorAuthenticationCtrl = (function () {\n function TwoFactorAuthenticationCtrl($scope, $uibModalInstance, identityService) {\n this.scope = $scope;\n this.scope.events = this;\n this.modalInstance = $uibModalInstance;\n this.identityService = identityService;\n this.scope.isError = false;\n this.scope.isSubmitted = false;\n this.scope.informationMessage = null;\n this.scope.errorMessage = null;\n this.scope.isSendingCode = false;\n this.scope.isBusy = false;\n this.sendVerificationCode();\n }\n TwoFactorAuthenticationCtrl.prototype.sendVerificationCode = function () {\n var _this = this;\n this.scope.isSendingCode = true;\n this.scope.isSubmitted = false;\n this.scope.informationMessage = \"Sending verification code...\";\n this.scope.errorMessage = null;\n this.identityService.request2FAToken()\n .then(function (result) {\n _this.scope.isError = false;\n _this.scope.informationMessage = \"A code has been sent via SMS to the mobile number registered on this profile. Please enter this code below to verify your identity.\";\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.informationMessage = null;\n _this.scope.errorMessage = \"Failed to send verification code. Please request a new code.\";\n })\n .finally(function () {\n _this.scope.isSendingCode = false;\n });\n };\n TwoFactorAuthenticationCtrl.prototype.submit = function () {\n this.scope.isSubmitted = true;\n this.modalInstance.close();\n };\n TwoFactorAuthenticationCtrl.prototype.cancel = function () {\n this.scope.isSubmitted = false;\n this.modalInstance.dismiss();\n };\n TwoFactorAuthenticationCtrl.prototype.handleErrorResponse = function (reason) {\n if (reason.status === 403) {\n this.showForbiddenMessage();\n }\n else {\n this.modalInstance.close(false);\n }\n };\n TwoFactorAuthenticationCtrl.prototype.showForbiddenMessage = function () {\n this.scope.isError = true;\n this.scope.informationMessage = null;\n this.scope.errorMessage = \"The code you have entered is incorrect. Please try again, or click “Resend Code”. \";\n };\n TwoFactorAuthenticationCtrl.$inject = ['$scope', '$uibModalInstance', 'identityService'];\n return TwoFactorAuthenticationCtrl;\n }());\n Patersons.TwoFactorAuthenticationCtrl = TwoFactorAuthenticationCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var BankDetailsChangeRequestCtrl = (function (_super) {\n __extends(BankDetailsChangeRequestCtrl, _super);\n function BankDetailsChangeRequestCtrl($scope, $uibModalInstance, identityService, portfolioService, account, bankAccountDetail, saveAll) {\n _super.call(this, $scope, $uibModalInstance, identityService);\n this.portfolioService = portfolioService;\n this.accountId = account.accountId;\n this.bankAccountDetail = bankAccountDetail;\n this.saveAll = saveAll;\n this.scope.nameOfPdf = \"Banking and Electronic Consent\";\n this.scope.linkToPdf = \"https://www.canaccordgenuity.com/494d20/globalassets/wealth-management-australia/documents/forms/banking-and-electronic-consent-form-pershing.pdf\";\n }\n BankDetailsChangeRequestCtrl.prototype.submit = function () {\n var _this = this;\n this.scope.isSubmitted = true;\n if (this.scope.twoFactorAuthForm.$invalid) {\n return;\n }\n this.scope.isBusy = true;\n this.bankAccountDetail.smsToken = this.scope.verificationCode;\n if (this.saveAll) {\n this.portfolioService.updateAllBankDetails(this.accountId, this.bankAccountDetail)\n .then(function (result) {\n _this.modalInstance.close(true);\n }, function (reason) {\n _this.handleErrorResponse(reason);\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n }\n else {\n this.portfolioService.updateBankDetails(this.accountId, this.bankAccountDetail)\n .then(function (result) {\n _this.modalInstance.close(true);\n }, function (reason) {\n _this.handleErrorResponse(reason);\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n }\n };\n BankDetailsChangeRequestCtrl.$inject = ['$scope', '$uibModalInstance', 'identityService', 'portfolioService', 'account', 'bankAccountDetail', 'saveAll'];\n return BankDetailsChangeRequestCtrl;\n }(Patersons.TwoFactorAuthenticationCtrl));\n Patersons.BankDetailsChangeRequestCtrl = BankDetailsChangeRequestCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var SensitiveEmailAddressChangeRequestCtrl = (function (_super) {\n __extends(SensitiveEmailAddressChangeRequestCtrl, _super);\n function SensitiveEmailAddressChangeRequestCtrl($scope, $uibModalInstance, identityService, portfolioService, account, emailAddresses) {\n _super.call(this, $scope, $uibModalInstance, identityService);\n this.portfolioService = portfolioService;\n this.accountId = account.accountId;\n this.emailAddresses = emailAddresses;\n this.scope.nameOfPdf = \"Change of Account Details\";\n this.scope.linkToPdf = \"https://www.canaccordgenuity.com/4a460f/globalassets/wealth-management-australia/documents/forms/change-of-address-details-form\";\n }\n SensitiveEmailAddressChangeRequestCtrl.prototype.submit = function () {\n this.scope.isSubmitted = true;\n if (this.scope.twoFactorAuthForm.$invalid) {\n return;\n }\n this.updateEmailAddress(0);\n };\n SensitiveEmailAddressChangeRequestCtrl.prototype.updateEmailAddress = function (index) {\n var _this = this;\n if (index >= this.emailAddresses.length) {\n this.modalInstance.close(true);\n return;\n }\n this.scope.isBusy = true;\n this.emailAddresses[index].smsToken = this.scope.verificationCode;\n this.portfolioService.updateSensitiveEmailAddress(this.accountId, this.emailAddresses[index])\n .then(function (result) {\n _this.updateEmailAddress(index + 1);\n }, function (reason) {\n _this.handleErrorResponse(reason);\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n SensitiveEmailAddressChangeRequestCtrl.$inject = ['$scope', '$uibModalInstance', 'identityService', 'portfolioService', 'account', 'emailAddresses'];\n return SensitiveEmailAddressChangeRequestCtrl;\n }(Patersons.TwoFactorAuthenticationCtrl));\n Patersons.SensitiveEmailAddressChangeRequestCtrl = SensitiveEmailAddressChangeRequestCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var SensitiveAddressChangeRequestCtrl = (function (_super) {\n __extends(SensitiveAddressChangeRequestCtrl, _super);\n function SensitiveAddressChangeRequestCtrl($scope, $uibModalInstance, identityService, portfolioService, account, address) {\n _super.call(this, $scope, $uibModalInstance, identityService);\n this.portfolioService = portfolioService;\n this.accountId = account.accountId;\n this.address = address;\n this.scope.nameOfPdf = \"Change of Account Details\";\n this.scope.linkToPdf = \"https://www.canaccordgenuity.com/4a460f/globalassets/wealth-management-australia/documents/forms/change-of-address-details-form\";\n }\n SensitiveAddressChangeRequestCtrl.prototype.submit = function () {\n var _this = this;\n this.scope.isSubmitted = true;\n if (this.scope.twoFactorAuthForm.$invalid) {\n return;\n }\n this.scope.isBusy = true;\n this.address.smsToken = this.scope.verificationCode;\n this.portfolioService.updateRegistrationAddressDetails(this.accountId, this.address)\n .then(function (result) {\n _this.modalInstance.close(true);\n }, function (reason) {\n _this.handleErrorResponse(reason);\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n SensitiveAddressChangeRequestCtrl.$inject = ['$scope', '$uibModalInstance', 'identityService', 'portfolioService', 'account', 'address'];\n return SensitiveAddressChangeRequestCtrl;\n }(Patersons.TwoFactorAuthenticationCtrl));\n Patersons.SensitiveAddressChangeRequestCtrl = SensitiveAddressChangeRequestCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ApproveChangeRequestCtrl = (function (_super) {\n __extends(ApproveChangeRequestCtrl, _super);\n function ApproveChangeRequestCtrl($scope, $uibModalInstance, identityService, changeRequestService, changeRequestId) {\n _super.call(this, $scope, $uibModalInstance, identityService);\n this.changeRequestService = changeRequestService;\n this.changeRequestId = changeRequestId;\n }\n ApproveChangeRequestCtrl.prototype.submit = function () {\n var _this = this;\n this.scope.isSubmitted = true;\n if (this.scope.twoFactorAuthForm.$invalid) {\n return;\n }\n this.scope.isBusy = true;\n this.changeRequestService.approveChangeRequest(this.changeRequestId, this.scope.verificationCode)\n .then(function (result) {\n _this.modalInstance.close(true);\n }, function (reason) {\n _this.handleErrorResponse(reason);\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n ApproveChangeRequestCtrl.$inject = ['$scope', '$uibModalInstance', 'identityService', 'changeRequestService', 'changeRequestId'];\n return ApproveChangeRequestCtrl;\n }(Patersons.TwoFactorAuthenticationCtrl));\n Patersons.ApproveChangeRequestCtrl = ApproveChangeRequestCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var AnalysisBaseCtrl = (function (_super) {\n __extends(AnalysisBaseCtrl, _super);\n function AnalysisBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.activateSection('analysis');\n }\n AnalysisBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return AnalysisBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.AnalysisBaseCtrl = AnalysisBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var WatchlistsCtrl = (function (_super) {\n __extends(WatchlistsCtrl, _super);\n function WatchlistsCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, analysisService, selectionService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.onDeleteWatchlist = function (value) {\n if (confirm('Are you sure you want to delete watchlist?')) {\n this.scope.deleteWatchlist(value);\n }\n };\n this.scope = $scope;\n this.scope.events = this;\n this.analysisService = analysisService;\n this.selectionService = selectionService;\n this.scope.isError = false;\n this.scope.hasData = false;\n if (this.state.params['add']) {\n this.selectionService.selectedWatchlistSecIds = this.state.params['add'];\n $location.url($location.path());\n }\n else if (this.selectionService.selectedWatchlistSecIds) {\n this.scope.secIds = this.selectionService.selectedWatchlistSecIds;\n this.selectionService.selectedWatchlistSecIds = null;\n }\n this.scope.isBusy = false;\n this.scope.isEdit = false;\n this.scope.watchlists = new Array();\n this.getWatchlists();\n }\n WatchlistsCtrl.prototype.listWatchlists = function () {\n return this.scope.watchlists.map(function (w) { return w.name.toLowerCase(); }).join(\"|\");\n };\n WatchlistsCtrl.prototype.deleteWatchlist = function (watchlistId) {\n var _this = this;\n if (confirm(\"Are you sure you wish to delete this watchlist?\")) {\n var promise = this.analysisService.deleteWatchlist(watchlistId);\n promise.then(function (result) {\n _this.getWatchlists();\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n //this.analysisService.errorHandler = reason.data;\n _this.scope.isError = true;\n _this.scope.hasData = false;\n });\n }\n };\n WatchlistsCtrl.prototype.getWatchlists = function () {\n var _this = this;\n this.scope.isLoading = true;\n var promise = this.analysisService.getWatchlists();\n promise.then(function (result) {\n _this.scope.isLoading = false;\n _this.scope.watchlists = result;\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n //this.analysisService.errorHandler = reason.data;\n _this.scope.isError = true;\n _this.scope.hasData = false;\n });\n };\n WatchlistsCtrl.prototype.prepareNewWatchlist = function () {\n this.scope.isEdit = true;\n this.scope.newWatchlist = new Patersons.Watchlist();\n };\n WatchlistsCtrl.prototype.addWatchlist = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.watchlistForm.$invalid) {\n return;\n }\n this.scope.isBusy = true;\n this.scope.isLoading = true;\n this.analysisService.postWatchlist(this.scope.newWatchlist).then(function (result) {\n _this.scope.isLoading = false;\n _this.scope.isEdit = false;\n _this.getWatchlists();\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n //this.analysisService.errorHandler = reason.data;\n _this.scope.isError = true;\n _this.scope.hasData = false;\n }).finally(function () {\n _this.scope.isBusy = false;\n });\n };\n WatchlistsCtrl.prototype.cancelAddWatchlist = function () {\n this.scope.isEdit = false;\n this.scope.watchlistForm.$setPristine();\n this.scope.watchlistForm.$setUntouched();\n };\n WatchlistsCtrl.prototype.loadWatchlist = function (watchlistId) {\n var _this = this;\n var newSecIds = [];\n if (this.scope.secIds !== undefined || this.scope.secIds != null) {\n var newItems = this.scope.secIds.split(',');\n for (var i = 0; i < newItems.length; i++) {\n newSecIds.push(newItems[i]);\n }\n var promise = this.analysisService.getAWatchlist(watchlistId);\n promise.then(function (watchlist) {\n for (var i = 0; i < newSecIds.length; i++) {\n watchlist.watchlistItems.push(newItems[i]);\n }\n var unique = watchlist.watchlistItems.filter(function (elem, index, self) {\n return index == self.indexOf(elem);\n });\n watchlist.watchlistItems = unique;\n _this.analysisService.patchWatchlist(watchlist).then(function () {\n _this.state.go(\"watchlistView\", {\n \"watchlistId\": watchlistId\n });\n });\n });\n }\n else {\n this.state.go(\"watchlistView\", {\n \"watchlistId\": watchlistId\n });\n }\n };\n WatchlistsCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'analysisService', 'selectionService', 'navigationService'];\n return WatchlistsCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.WatchlistsCtrl = WatchlistsCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var WatchlistItemCtrl = (function (_super) {\n __extends(WatchlistItemCtrl, _super);\n function WatchlistItemCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, analysisService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.analysisService = analysisService;\n this.scope.watchlistId = $stateParams['watchlistId'];\n this.load();\n }\n WatchlistItemCtrl.prototype.showAllWatchlists = function () {\n this.state.go(\"watchlist\", {}, { reload: true });\n };\n WatchlistItemCtrl.prototype.load = function () {\n var _this = this;\n var tickers = [];\n if (this.state.params['watchlistId']) {\n this.analysisService.getAWatchlist(this.state.params['watchlistId'])\n .then(function (watchlist) {\n _this.scope.relatedWatchlist = watchlist;\n _this.scope.name = watchlist.name;\n var unique = watchlist.watchlistItems.filter(function (elem, index, self) {\n return index == self.indexOf(elem);\n });\n watchlist.watchlistItems = unique;\n tickers = watchlist.watchlistItems;\n _this.initializeMorningstar(tickers);\n }).catch(function (err) {\n _this.state.go('watchlist');\n alert('Watchlist not found.');\n });\n }\n else if (this.state.params['secIds']) {\n tickers = this.state.params['secIds'].split(\"|\");\n this.initializeMorningstar(tickers);\n }\n else {\n this.state.go(\"watchlist\");\n }\n };\n WatchlistItemCtrl.prototype.updateWatchlistFromTickers = function (tickers) {\n this.scope.relatedWatchlist.watchlistItems = tickers.map(function (item) {\n return item;\n });\n var unique = this.scope.relatedWatchlist.watchlistItems.filter(function (elem, index, self) {\n return index == self.indexOf(elem);\n });\n this.scope.relatedWatchlist.watchlistItems = unique;\n return this.analysisService.patchWatchlist(this.scope.relatedWatchlist);\n };\n WatchlistItemCtrl.prototype.openAsHeatmap = function () {\n if (this.scope.watchlistId) {\n window.open(this.state.href(\"heatmap\", { watchlistId: this.scope.watchlistId }), \"_parent\");\n }\n };\n WatchlistItemCtrl.prototype.initializeMorningstar = function (tickers) {\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n initComponent('component-watchlist', 'ecWatchList-container', 'ec-watch-list', 'ecWatchList').then(function () {\n var watchlistInstance = morningstar.asterix.instanceRegistry.get('ecWatchList');\n //set default watchlist items\n watchlistInstance.setParameter('tickers', tickers);\n initComponent('component-autocomp-watchlist', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteWatchlist').then(function () {\n //connect watchlist to autocomplete search\n morningstar.asterix.instanceRegistry.find('ecAutocompleteWatchlist').on('parameterChanged:latestSelectedSecurity', function (newVal) {\n var tickersTemp = morningstar.asterix.instanceRegistry.get('ecWatchList').getParameter('tickers');\n //make sure there is no duplicate\n if (newVal.secId && !tickersTemp.includes(newVal.secId)) {\n tickersTemp.push(newVal.secId);\n morningstar.asterix.instanceRegistry.get('ecWatchList').setParameter('tickers', tickersTemp);\n self.updateWatchlistFromTickers(morningstar.asterix.instanceRegistry.get('ecWatchList').getParameter('tickers'));\n morningstar.asterix.instanceRegistry.get('ecAutocompleteWatchlist').setParameter('search', '');\n }\n });\n morningstar.asterix.instanceRegistry.get('ecWatchList.actionBar.actionRemove').on('click', function (event) {\n event.preventDefault();\n var watchlist = morningstar.asterix.instanceRegistry.find('ecWatchList');\n var toBeRemove = watchlist.getParameter('selectedItemKeys');\n var tempList = watchlist.getParameter('tickers').slice().filter(function (el) { return toBeRemove.indexOf(el) < 0; });\n watchlist.setParameter('tickers', tempList);\n self.updateWatchlistFromTickers(tempList).then(function () {\n if (tempList.length == 0) {\n self.state.reload();\n }\n });\n });\n });\n });\n });\n };\n WatchlistItemCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'analysisService', 'navigationService'];\n return WatchlistItemCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.WatchlistItemCtrl = WatchlistItemCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var MarketHeatmapCtrl = (function (_super) {\n __extends(MarketHeatmapCtrl, _super);\n function MarketHeatmapCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService, analysisService, morningStarService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.rootScope = $rootScope;\n this.analysisService = analysisService;\n this.morningStarService = morningStarService;\n this.load();\n }\n MarketHeatmapCtrl.prototype.transformWatchlistToMorningStarWatchlist = function (watchlists) {\n var _this = this;\n // due to a request to only show stock tickers that are not of type Fund (holdingtypeId = 2),\n // we need to query the M* API to determine if a particular ticker is infact a fund or not\n // and use that information to show/hide the tickers from the heatmap component.\n return new Promise(function (resolveAll) {\n var mWatchlists = [];\n Promise.all(watchlists.map(function (watchlist) {\n return new Promise(function (resolveEach) {\n var mWatchlist = {\n name: watchlist.name,\n data: [],\n id: \"m\" + watchlist.id\n };\n Promise.all(watchlist.watchlistItems.map(function (ticker) {\n return new Promise(function (resolveTicker) {\n _this.morningStarService.getMorningStarDataForSecurityId(ticker).then(function (res) {\n if (res) {\n var holdingTypeId = res.holdingTypeId;\n if (holdingTypeId != 2) {\n mWatchlist.data.push({ ticker: ticker });\n }\n }\n resolveTicker();\n });\n });\n })).then(function () {\n mWatchlists.push(mWatchlist);\n resolveEach();\n });\n });\n })).then(function () {\n resolveAll(mWatchlists);\n });\n });\n // This is kept incase we dont need to check each ticker\n // return watchlists.map(function (watchlist) {\n // return {\n // name: watchlist.name,\n // data: watchlist.watchlistItems.map(function (isin) {\n // return {\n // ticker: isin\n // }\n // }),\n // id: \"m\" + watchlist.id\n // }\n // })\n };\n MarketHeatmapCtrl.prototype.load = function () {\n var self = this;\n this.analysisService.getWatchlists().then(function (watchlists) {\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n self.transformWatchlistToMorningStarWatchlist(watchlists).then(function (mWatchlists) {\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.selectionlist.watchList = mWatchlists;\n if (self.state.params['watchlistId']) {\n try {\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.selectionlist.active = \"m\" + self.state.params['watchlistId'];\n //need to nullify the 'index' value as it takes precedent over the tickerList in the config\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.index = null;\n var tickers_1 = [];\n mWatchlists.filter(function (item) {\n return item.id == \"m\" + self.state.params['watchlistId'];\n })[0].data.forEach(function (ticker) {\n tickers_1.push(ticker.ticker);\n });\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.tickerList = tickers_1;\n }\n catch (error) {\n self.state.go('heatmap', {}, { inherit: false, reload: true });\n alert('Could not load heatmap from watchlist');\n return;\n }\n }\n else {\n // need to reset to default values due to manilupating the configuration at runtime above.\n // possibly look into a more elegant way to handle this\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.selectionlist.active = 4;\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.index = \"146.10.XJO\";\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.tickerList = null;\n }\n initComponent(\"component-heatmap\", \"heatmap-container\", \"markets-components-heatmap\", \"marketsHeatmap\");\n });\n });\n });\n };\n MarketHeatmapCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService', 'analysisService', 'morningStarService'];\n return MarketHeatmapCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.MarketHeatmapCtrl = MarketHeatmapCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var MarketChartCtrl = (function (_super) {\n __extends(MarketChartCtrl, _super);\n function MarketChartCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.load();\n }\n MarketChartCtrl.prototype.load = function () {\n this.log.info('market chartCtrl loading...');\n var tickers = [];\n var compareTickers = [];\n var mainTicker = '';\n if (this.state.params['secIds'] != undefined && this.state.params['secIds'] != null) {\n tickers = this.state.params['secIds'].split('|');\n if (tickers.length > 1) {\n compareTickers = tickers.slice(1);\n }\n this.scope.isCompare = true;\n mainTicker = tickers[0];\n }\n rootMorningstarPromise().then(function (morningstarPromise) {\n console.log('initializing component');\n if (mainTicker) {\n loaderConfig.configuration.overrides.components.advanceChart_compare.settings.mainTicker = mainTicker;\n loaderConfig.configuration.overrides.components.advanceChart_compare.settings.compareTickers = compareTickers;\n initComponent('component-container', 'chart-container', 'markets-components-svgchart', 'advanceChart_compare').then(function () {\n console.log(\"done loading advance chart\");\n });\n }\n else {\n initComponent('component-container', 'chart-container', 'markets-components-svgchart', 'advanceChart').then(function () {\n console.log(\"done loading advance chart\");\n });\n }\n });\n };\n MarketChartCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return MarketChartCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.MarketChartCtrl = MarketChartCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var StockCompareCtrl = (function (_super) {\n __extends(StockCompareCtrl, _super);\n function StockCompareCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.state = $state;\n this.load();\n }\n StockCompareCtrl.prototype.load = function () {\n var isinData = this.state.params['secIds']\n ? this.state.params['secIds']\n : \"\";\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log(\"initializing component\");\n initComponent(\"component-investcomp\", \"ecinvestment-container\", \"ec-investment-compare\", \"ecStockCompare\").then(function () {\n morningstar.asterix.instanceRegistry\n .get(\"ecStockCompare\")\n .setParameter(\"securityIds\", isinData); // pipe separated list of IDs\n });\n });\n };\n StockCompareCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return StockCompareCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.StockCompareCtrl = StockCompareCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var FundCompareCtrl = (function (_super) {\n __extends(FundCompareCtrl, _super);\n function FundCompareCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.state = $state;\n this.load();\n }\n FundCompareCtrl.prototype.load = function () {\n var isinData = this.state.params['secIds']\n ? this.state.params['secIds']\n : \"\";\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log(\"initializing component\");\n initComponent(\"component-investcomp\", \"ecinvestment-container\", \"ec-investment-compare\", \"ecFundCompare\").then(function () {\n morningstar.asterix.instanceRegistry\n .get(\"ecFundCompare\")\n .setParameter(\"securityIds\", isinData); // pipe separated list of IDs\n });\n });\n };\n FundCompareCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return FundCompareCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.FundCompareCtrl = FundCompareCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ETFCompareCtrl = (function (_super) {\n __extends(ETFCompareCtrl, _super);\n function ETFCompareCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.state = $state;\n this.load();\n }\n ETFCompareCtrl.prototype.load = function () {\n var isinData = this.state.params['secIds']\n ? this.state.params['secIds']\n : \"\";\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log(\"initializing component\");\n initComponent(\"component-investcomp\", \"ecinvestment-container\", \"ec-investment-compare\", \"ecETFCompare\").then(function () {\n morningstar.asterix.instanceRegistry\n .get(\"ecETFCompare\")\n .setParameter(\"securityIds\", isinData); // pipe separated list of IDs\n });\n });\n };\n ETFCompareCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return ETFCompareCtrl;\n }(Patersons.AnalysisBaseCtrl));\n Patersons.ETFCompareCtrl = ETFCompareCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar analysisModule = angular.module(\"app.analysisModule\", []);\nanalysisModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.analysisModule config...');\n var wholesaleClientChecker = ['sessionService', '$q', '$state', 'userCompanyService', function (sessionService, $q, $state, userCompanyService) {\n var deferred = $q.defer();\n userCompanyService.getUserCompany().then(function (company) {\n if (sessionService.getCurrentUserProfile().wholesaleclient === 'True' && !company.enableWholesaleClientsResearch) {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n });\n return deferred.promise;\n }];\n $stateProvider\n .state(\"watchlist\", {\n url: \"/watchlists?add\",\n templateUrl: \"assets/templates/Analysis/watchlists.html\",\n controller: 'watchlistsCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Watchlists\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state(\"watchlistView\", {\n url: \"/watchlists/view?watchlistId?secIds\",\n templateUrl: \"assets/templates/Analysis/watchlistItem.html\",\n controller: 'watchlistItemCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Watchlists\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state(\"heatmap\", {\n url: \"/heatmap?watchlistId\",\n templateUrl: \"assets/templates/Analysis/marketHeatmap.html\",\n controller: 'marketHeatmapCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Market Heatmap\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state(\"charts\", {\n url: \"/charts?secIds\",\n templateUrl: \"assets/templates/Analysis/marketCharts.html\",\n controller: 'marketChartCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Charting Tools\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state(\"stockCompare\", {\n url: \"/stockCompare?secIds\",\n templateUrl: \"assets/templates/Analysis/stockCompare.html\",\n controller: 'stockCompareCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Equities Comparison\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n });\n // .state(\"fundCompare\",\n // {\n // url: \"/fundCompare?secIds\",\n // templateUrl: \"assets/templates/Analysis/fundCompare.html\",\n // controller: 'fundCompareCtrl',\n // resolve: {\n // wholesaleClientCheck: wholesaleClientChecker,\n // impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n // var deferred = $q.defer();\n // if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n // $state.go('dashboard');\n // deferred.reject();\n // } else {\n // deferred.resolve();\n // }\n // return deferred.promise;\n // }]\n // }\n // })\n // .state(\"etfCompare\",\n // {\n // url: \"/etfCompare?secIds\",\n // templateUrl: \"assets/templates/Analysis/etfCompare.html\",\n // controller: 'etfCompareCtrl',\n // resolve: {\n // wholesaleClientCheck: wholesaleClientChecker,\n // impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n // var deferred = $q.defer();\n // if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n // $state.go('dashboard');\n // deferred.reject();\n // } else {\n // deferred.resolve();\n // }\n // return deferred.promise;\n // }]\n // }\n // })\n }]);\nanalysisModule.controller('analysisBaseCtrl', Patersons.AnalysisBaseCtrl);\nanalysisModule.controller('watchlistsCtrl', Patersons.WatchlistsCtrl);\nanalysisModule.controller('watchlistItemCtrl', Patersons.WatchlistItemCtrl);\nanalysisModule.controller('marketHeatmapCtrl', Patersons.MarketHeatmapCtrl);\nanalysisModule.controller('marketChartCtrl', Patersons.MarketChartCtrl);\nanalysisModule.controller('stockCompareCtrl', Patersons.StockCompareCtrl);\nanalysisModule.controller('fundCompareCtrl', Patersons.FundCompareCtrl);\nanalysisModule.controller('etfCompareCtrl', Patersons.ETFCompareCtrl);\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ClientAdviserViewCtrl = (function (_super) {\n __extends(ClientAdviserViewCtrl, _super);\n function ClientAdviserViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, tokenService, clientConfigService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.tokenService = tokenService;\n this.clientConfigService = clientConfigService;\n if (this.tokenService.tokenManager && !this.tokenService.tokenManager.expired) {\n this.getAdviserData();\n this.scope.ShowFullImage = function (url) {\n $('.imagepreview').attr('src', url);\n $('#imagemodal').modal('show');\n };\n }\n }\n ClientAdviserViewCtrl.prototype.getAdviserData = function () {\n var _this = this;\n this.scope.isLoading = true;\n var promise = this.clientConfigService.getAdviser();\n promise.then(function (result) {\n _this.scope.isLoading = false;\n _this.scope.adviserList = result;\n if (_this.scope.adviserList.length > 1) {\n _this.scope.adviserLabel = \"Meet your Advisers\";\n }\n else if (_this.scope.adviserList.length == 1) {\n _this.scope.adviserLabel = \"Meet your Adviser\";\n }\n else if (_this.scope.adviserLabel.length == 0) {\n _this.scope.adviserLabel = \"\";\n }\n if (_this.tokenService.tokenManager) {\n _this.scope.isLoggedIn = !_this.tokenService.tokenManager.expired;\n }\n }, function (reason) {\n _this.scope.isLoading = false;\n _this.clientConfigService.errorHandler = reason.data;\n });\n return null;\n };\n ClientAdviserViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'tokenService', 'clientConfigService'];\n return ClientAdviserViewCtrl;\n }(Patersons.AbstractController));\n Patersons.ClientAdviserViewCtrl = ClientAdviserViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var FAQ = (function () {\n function FAQ() {\n }\n return FAQ;\n }());\n Patersons.FAQ = FAQ;\n var HelpViewCtrl = (function (_super) {\n __extends(HelpViewCtrl, _super);\n function HelpViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, helpService, navigationService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.helpService = helpService;\n this.navigationService = navigationService;\n this.navigationService.deactivateAll();\n this.load();\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n HelpViewCtrl.prototype.load = function () {\n var _this = this;\n this.helpService.getFAQs()\n .then(function (result) {\n if (result) {\n _this.scope.faqList = result.faqs;\n }\n _this.scope.hasData = _this.scope.faqList != null && _this.scope.faqList.length > 0;\n _this.log.info(\"Loaded Help List\");\n }, function (error) {\n _this.scope.hasData = false;\n });\n };\n HelpViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'helpService', 'navigationService', 'userCompanyService'];\n return HelpViewCtrl;\n }(Patersons.AbstractController));\n Patersons.HelpViewCtrl = HelpViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var MyDetailsBaseCtrl = (function (_super) {\n __extends(MyDetailsBaseCtrl, _super);\n function MyDetailsBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.deactivateAll();\n }\n MyDetailsBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return MyDetailsBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.MyDetailsBaseCtrl = MyDetailsBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var AccoladeOptionsViewCtrl = (function (_super) {\n __extends(AccoladeOptionsViewCtrl, _super);\n function AccoladeOptionsViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, myDetailsService, portfolioService, navigationService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.myDetailsService = myDetailsService;\n this.portfolioService = portfolioService;\n this.scope.parentController = this;\n this.scope.events = this;\n this.scope.isError = false;\n this.scope.isSubmitted = false;\n this.scope.isLoading = false;\n this.scope.isBusy = false;\n this.getAccoladeOptions();\n this.scope.isError = false;\n this.scope.hasData = false;\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n AccoladeOptionsViewCtrl.prototype.onSave = function () {\n var _this = this;\n this.scope.isBusy = true;\n var promise = this.myDetailsService.updateAccoladeOptions(this.scope.accoladeOptions);\n promise.then(function (result) {\n console.info('myDetailsService.updateAccoladeOptions');\n console.info(result);\n _this.scope.isSubmitted = true;\n _this.scope.isError = false;\n _this.scope.hasData = true;\n _this.updateAccoladeOptions(result);\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.hasData = false;\n _this.scope.isSubmitted = false;\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n AccoladeOptionsViewCtrl.prototype.onCancel = function () {\n // reload ourselves if cancelled to get the original settings\n this.redirect(\"/accoladeOptions\");\n };\n AccoladeOptionsViewCtrl.prototype.getAccoladeOptions = function () {\n var _this = this;\n this.scope.isLoading = true;\n var accoladeCheckPromise = this.portfolioService.getCombinedPortfolioData();\n accoladeCheckPromise.then(function (accounts) {\n if (accounts.every(function (account) { return account.accountType == \"Standard\"; })) {\n _this.scope.hasAccoladeAccounts = false;\n _this.scope.isLoading = false;\n }\n else {\n _this.scope.hasAccoladeAccounts = true;\n var optionsPromise = _this.myDetailsService.getAccoladeOptions();\n optionsPromise.then(function (result) {\n _this.log.info(\"Accolade Opts: result = \" + JSON.stringify(result));\n _this.updateAccoladeOptions(result);\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.isSubmitted = false;\n _this.myDetailsService.errorHandler = reason.data;\n })\n .finally(function () {\n _this.scope.isLoading = false;\n });\n }\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.hasData = false;\n });\n return null;\n };\n AccoladeOptionsViewCtrl.prototype.updateAccoladeOptions = function (options) {\n console.info('updateAccoladeOptions');\n console.info(options);\n this.scope.accoladeOptions = options;\n this.scope.enableAnnualAccoladeReports = !this.scope.accoladeOptions.hasElectronicTaxReports;\n this.scope.enableQuarterlyAccoladeReports = !this.scope.accoladeOptions.hasElectronicQuarterlyReports;\n };\n AccoladeOptionsViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'myDetailsService', 'portfolioService', 'navigationService', 'userCompanyService'];\n return AccoladeOptionsViewCtrl;\n }(Patersons.MyDetailsBaseCtrl));\n Patersons.AccoladeOptionsViewCtrl = AccoladeOptionsViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ResearchSubscriptionsViewCtrl = (function (_super) {\n __extends(ResearchSubscriptionsViewCtrl, _super);\n function ResearchSubscriptionsViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, myDetailsService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.myDetailsService = myDetailsService;\n this.scope.parentController = this;\n this.scope.events = this;\n this.scope.hasChanged = false;\n this.scope.isSubmitted = false;\n this.scope.isError = false;\n this.scope.isLoading = false;\n this.getResearchSubscriptions();\n }\n ResearchSubscriptionsViewCtrl.prototype.setChanged = function () {\n this.scope.hasChanged = true;\n };\n ResearchSubscriptionsViewCtrl.prototype.onSave = function () {\n var _this = this;\n this.scope.isError = false;\n this.scope.isSubmitted = false;\n this.scope.isSaving = true;\n this.myDetailsService.updateResearchSubscriptions(this.scope.subscribedPublications)\n .then(function (result) {\n _this.scope.isSubmitted = result.status == 200;\n }, function (reason) {\n _this.scope.isError = true;\n _this.myDetailsService.errorHandler = reason.data;\n }).finally(function () {\n _this.scope.isSaving = false;\n _this.scope.hasChanged = false;\n });\n };\n ResearchSubscriptionsViewCtrl.prototype.getResearchSubscriptions = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.myDetailsService.getResearchSubscriptions()\n .then(function (result) {\n var data = result;\n _this.scope.subscribedPublications = data;\n _this.scope.isLoading = false;\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.isLoading = false;\n });\n };\n ResearchSubscriptionsViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'myDetailsService', 'navigationService'];\n return ResearchSubscriptionsViewCtrl;\n }(Patersons.MyDetailsBaseCtrl));\n Patersons.ResearchSubscriptionsViewCtrl = ResearchSubscriptionsViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var AccountBaseCtrl = (function (_super) {\n __extends(AccountBaseCtrl, _super);\n function AccountBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.deactivateAll();\n }\n AccountBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return AccountBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.AccountBaseCtrl = AccountBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var BankDetailsViewCtrl = (function (_super) {\n __extends(BankDetailsViewCtrl, _super);\n function BankDetailsViewCtrl($scope, $uibModal, $log, $location, $window, $state, $stateParams, $http, $rootScope, $document, portfolioService, tokenService, changeRequestService, navigationService, identityService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.portfolioService = portfolioService;\n this.tokenService = tokenService;\n this.changeRequestService = changeRequestService;\n this.identityService = identityService;\n this.scope.parentController = this;\n this.scope.events = this;\n this.scope.isSubmitted = false;\n this.scope.submissionFailed = false;\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.scope.submissionFailedNotAllApproversRegistered = false;\n this.scope.phoneNumberIsVerified = false;\n this.scope.allApproversRegistered = false;\n this.scope.hasApprovers = false;\n this.scope.hasAcceptedTandCs = false;\n this.scope.hasApplyAllChecked = false;\n this.scope.disableCreditUpdate = false;\n var accountId = $stateParams.accountId;\n this.modal = $uibModal;\n this.document = $document;\n this.scope.scrollDuration = 700;\n this.scope.isSensitive = true;\n this.load();\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n BankDetailsViewCtrl.prototype.setSelectedAccount = function (accountId) {\n this.scope.hasApplyAllChecked = false;\n this.scope.hasAcceptedTandCs = false;\n this.scope.disableCreditUpdate = false;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n if (this.scope.selectedAccount) {\n this.scope.disableCreditUpdate = this.isCashManagementAccount(this.scope.selectedAccount.bankingDetails.creditBankAccount) &&\n (!this.scope.selectedAccount.isChessManaged || this.scope.selectedAccount.bankingDetails.creditBankAccount.depositDividends);\n }\n this.scope.isSubmitted = false;\n this.scope.submissionFailed = false;\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.scope.submissionFailedNotAllApproversRegistered = false;\n this.checkAllApproversRegistered();\n this.checkHasApprovers();\n };\n ;\n BankDetailsViewCtrl.prototype.isCashManagementAccount = function (bankAccountDetail) {\n return bankAccountDetail.serviceType === 'MM';\n };\n BankDetailsViewCtrl.prototype.deselectDepositDividends = function () {\n if (this.scope.selectedAccount.isChessManaged) {\n this.scope.selectedAccount.bankingDetails.creditBankAccount.depositDividends = false;\n }\n };\n BankDetailsViewCtrl.prototype.checkAllApproversRegistered = function () {\n var _this = this;\n if (!this.scope.selectedAccount) {\n return;\n }\n this.changeRequestService.areAllAccountApproversRegistered(this.scope.selectedAccount.accountId)\n .then(function (result) {\n _this.scope.allApproversRegistered = result;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n });\n };\n BankDetailsViewCtrl.prototype.checkHasApprovers = function () {\n var _this = this;\n if (!this.scope.selectedAccount) {\n return;\n }\n this.changeRequestService.getAccountApproversCount(this.scope.selectedAccount.accountId)\n .then(function (result) {\n _this.scope.hasApprovers = result > 0;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n });\n };\n BankDetailsViewCtrl.prototype.load = function () {\n var _this = this;\n this.identityService.getIsPhoneNumberVerifyed().\n then(function (phone_number_verified) {\n _this.scope.phoneNumberIsVerified = phone_number_verified;\n var promise = _this.portfolioService.getCombinedPortfolioData();\n promise.then(function (result) {\n _this.scope.accounts = result;\n if (_this.scope.accounts != undefined && _this.scope.accounts.length > 0) {\n _this.setSelectedAccount(_this.scope.accounts[0].accountId);\n }\n });\n });\n /*if (this.tokenService.tokenManager.profile.phone_number_verified === 'true') {\n this.scope.phoneNumberIsVerified = true;\n }\n var promise = this.portfolioService.getCombinedPortfolioData();\n promise.then((result: Array) => {\n this.scope.accounts = result;\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\n this.setSelectedAccount(this.scope.accounts[0].accountId);\n }\n });*/\n };\n BankDetailsViewCtrl.prototype.canSubmitChangeRequest = function () {\n if (!this.scope.phoneNumberIsVerified) {\n this.scope.submissionFailedVerifyPhoneNumber = true;\n }\n if (!this.scope.allApproversRegistered) {\n this.scope.submissionFailedNotAllApproversRegistered = true;\n }\n if (this.scope.submissionFailedVerifyPhoneNumber || this.scope.submissionFailedNotAllApproversRegistered) {\n return false;\n }\n return true;\n };\n ;\n BankDetailsViewCtrl.prototype.saveDirectDebitForm = function () {\n this.scope.selectedAccount.bankingDetails.debitBankAccount.cardType = \"Debit Card\";\n return this.saveForm(this.scope.directDebitForm, this.scope.selectedAccount, this.scope.selectedAccount.bankingDetails.debitBankAccount, false);\n };\n BankDetailsViewCtrl.prototype.updatehasAcceptedTandCs = function () {\n if (!this.scope.hasApplyAllChecked) {\n this.scope.hasAcceptedTandCs = false;\n }\n };\n ;\n BankDetailsViewCtrl.prototype.saveDirectCreditForm = function () {\n if (this.scope.hasApplyAllChecked && this.scope.hasAcceptedTandCs) {\n return this.saveForm(this.scope.directCreditForm, this.scope.selectedAccount, this.scope.selectedAccount.bankingDetails.creditBankAccount, true);\n }\n this.scope.selectedAccount.bankingDetails.creditBankAccount.cardType = \"Credit Card\";\n return this.saveForm(this.scope.directCreditForm, this.scope.selectedAccount, this.scope.selectedAccount.bankingDetails.creditBankAccount, false);\n };\n BankDetailsViewCtrl.prototype.saveForm = function (form, account, bankAccountDetail, saveAll) {\n var _this = this;\n this.scope.submissionFailed = false;\n this.scope.isSensitive = true;\n if (form.$invalid || account == undefined) {\n return;\n }\n if (!this.canSubmitChangeRequest()) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\n return;\n }\n var modalPopup = this.modal.open({\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\n controller: Patersons.BankDetailsChangeRequestCtrl,\n keyboard: false,\n backdrop: 'static',\n resolve: {\n account: account,\n bankAccountDetail: bankAccountDetail,\n saveAll: saveAll\n }\n });\n modalPopup.result\n .then(function (result) {\n if (result === true) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isSubmitted = true;\n }\n else {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.submissionFailed = true;\n }\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n });\n };\n BankDetailsViewCtrl.$inject = ['$scope', '$uibModal', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$document', 'portfolioService', 'tokenService', 'changeRequestService', 'navigationService', 'identityService', 'userCompanyService'];\n return BankDetailsViewCtrl;\n }(Patersons.AccountBaseCtrl));\n Patersons.BankDetailsViewCtrl = BankDetailsViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var AccountEmail = \"AccountEmail\";\n var ContractNoteEmail = \"ContractNoteEmail\";\n var ContactInfoViewCtrl = (function (_super) {\n __extends(ContactInfoViewCtrl, _super);\n function ContactInfoViewCtrl($scope, $uibModal, $log, $location, $window, $state, $stateParams, $http, $rootScope, $document, myDetailsService, portfolioService, tokenService, changeRequestService, navigationService, identityService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.myDetailsService = myDetailsService;\n this.portfolioService = portfolioService;\n this.tokenService = tokenService;\n this.identityService = identityService;\n this.changeRequestService = changeRequestService;\n this.scope.parentController = this;\n this.scope.events = this;\n this.scope.isSubmitted = false;\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.scope.submissionFailedNotAllApproversRegistered = false;\n this.scope.phoneNumberIsVerified = false;\n this.scope.allApproversRegistered = false;\n this.scope.hasApprovers = false;\n var accountId = $stateParams.accountId;\n this.modal = $uibModal;\n this.scope.emailTags = [];\n this.scope.contractEmailTags = [];\n this.document = $document;\n this.scope.scrollDuration = 700;\n this.load();\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n ContactInfoViewCtrl.prototype.setSelectedAccount = function (accountId) {\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n if (this.setSelectedAccount == null) {\n return;\n }\n if (this.scope.selectedAccount.email) {\n this.scope.emailTags = this.scope.selectedAccount.email.split(\";\").join(\",\").split(\",\").map(function (e) { return { text: e.toLowerCase() }; });\n }\n else {\n this.scope.emailTags = [];\n }\n if (this.scope.selectedAccount.emailContractNotes) {\n this.scope.contractEmailTags = this.scope.selectedAccount.emailContractNotes.split(\";\").join(\",\").split(\",\").map(function (e) { return { text: e.toLowerCase() }; });\n }\n else {\n this.scope.contractEmailTags = [];\n }\n this.scope.sensitiveEmailAddressesDirty = false;\n this.scope.isSubmitted = false;\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.scope.submissionFailedNotAllApproversRegistered = false;\n this.checkAllApproversRegistered();\n this.checkHasApprovers();\n };\n ;\n ContactInfoViewCtrl.prototype.checkAllApproversRegistered = function () {\n var _this = this;\n if (!this.scope.selectedAccount) {\n return;\n }\n this.changeRequestService.areAllAccountApproversRegistered(this.scope.selectedAccount.accountId)\n .then(function (result) {\n _this.scope.allApproversRegistered = result;\n });\n };\n ContactInfoViewCtrl.prototype.checkHasApprovers = function () {\n var _this = this;\n if (!this.scope.selectedAccount) {\n return;\n }\n this.changeRequestService.getAccountApproversCount(this.scope.selectedAccount.accountId)\n .then(function (result) {\n _this.scope.hasApprovers = result > 0;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isLoading = false;\n });\n };\n ContactInfoViewCtrl.prototype.load = function () {\n var _this = this;\n this.identityService.getIsPhoneNumberVerifyed().\n then(function (phone_number_verified) {\n _this.scope.phoneNumberIsVerified = phone_number_verified;\n var promise = _this.portfolioService.getCombinedPortfolioData();\n promise.then(function (result) {\n _this.scope.accounts = result;\n if (_this.scope.accounts != undefined && _this.scope.accounts.length > 0) {\n _this.setSelectedAccount(_this.scope.accounts[0].accountId);\n }\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isLoading = false;\n });\n });\n /*if (this.tokenService.tokenManager.profile.phone_number_verified === 'true') {\n this.scope.phoneNumberIsVerified = true;\n }\n \n var promise = this.portfolioService.getCombinedPortfolioData();\n promise.then((result: Array) => {\n this.scope.accounts = result;\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\n \n this.setSelectedAccount(this.scope.accounts[0].accountId);\n }\n }, (reason) => {\n this.scope.errorHandler = reason.data;\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\n this.scope.isLoading = false;\n });*/\n };\n ContactInfoViewCtrl.prototype.canSubmitChangeRequest = function () {\n this.hideAllNotifications();\n if (!this.scope.phoneNumberIsVerified) {\n this.scope.submissionFailedVerifyPhoneNumber = true;\n }\n if (!this.scope.allApproversRegistered) {\n this.scope.submissionFailedNotAllApproversRegistered = true;\n }\n if (this.scope.submissionFailedVerifyPhoneNumber || this.scope.submissionFailedNotAllApproversRegistered) {\n return false;\n }\n return true;\n };\n ContactInfoViewCtrl.prototype.setAllAddressFields = function (address) {\n if (!this.scope.selectedAccount.isAuthorisedAgentAccount) {\n this.scope.selectedAccount.accountAddresses.postalAddress = Object.assign({}, address, { type: \"Postal\" });\n this.scope.selectedAccount.accountAddresses.residentialOrBusinessAddress = Object.assign({}, address, { type: \"ResidentialOrBusiness\" });\n }\n if (!(this.scope.selectedAccount.isAuthorisedAgentAccount || this.scope.selectedAccount.accountType == 'Accolade')) {\n this.scope.selectedAccount.accountAddresses.registrationAddress = Object.assign({}, address, { type: \"Registration\" });\n }\n };\n ContactInfoViewCtrl.prototype.applyToAll = function (addressForm, invalid) {\n var _this = this;\n if (!invalid) {\n if (confirm(\"This will apply your residential address to all sections of this form and submit your changes to us for processing\")) {\n this.setAllAddressFields(addressForm);\n return Promise.resolve()\n .then(function () {\n return _this.saveRegistrationAddress();\n })\n .then(function () {\n return _this.savePostalAddress();\n })\n .then(function () {\n return _this.saveResidentialAddress();\n });\n }\n }\n };\n ContactInfoViewCtrl.prototype.savePostalAddress = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (_this.scope.selectedAccount.isAuthorisedAgentAccount) {\n return resolve();\n }\n _this.scope.$broadcast('show-errors-check-validity');\n _this.scope.isSensitive = false;\n if (_this.scope.postalAddressForm.$invalid) {\n return resolve();\n }\n var promises = [];\n promises.push(_this.portfolioService.updatePostalAddressDetails(_this.scope.selectedAccount.accountId, _this.scope.selectedAccount.accountAddresses.postalAddress));\n _this.executePromises(promises).then(function () {\n return resolve();\n }, function (reason) {\n return reject();\n });\n });\n };\n ContactInfoViewCtrl.prototype.saveResidentialAddress = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (_this.scope.selectedAccount.isAuthorisedAgentAccount) {\n return resolve();\n }\n _this.scope.$broadcast('show-errors-check-validity');\n _this.scope.isSensitive = false;\n if (_this.scope.residentialAddressForm.$invalid) {\n return resolve();\n }\n var promises = [];\n promises.push(_this.portfolioService.updateResidentialAddressDetails(_this.scope.selectedAccount.accountId, _this.scope.selectedAccount.accountAddresses.residentialOrBusinessAddress));\n _this.executePromises(promises).then(function () {\n return resolve();\n }, function (reason) {\n return reject();\n });\n });\n };\n ContactInfoViewCtrl.prototype.saveRegistrationAddress = function () {\n var _this = this;\n return new Promise(function (resolve, reject) {\n if (_this.scope.selectedAccount.isAuthorisedAgentAccount || _this.scope.selectedAccount.accountType == 'Accolade') {\n return resolve();\n }\n _this.scope.$broadcast('show-errors-check-validity');\n _this.scope.isSensitive = true;\n if (_this.scope.registrationAddressForm.$invalid) {\n return resolve();\n }\n if (!_this.canSubmitChangeRequest()) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n return reject();\n }\n var modalPopup = _this.modal.open({\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\n controller: Patersons.SensitiveAddressChangeRequestCtrl,\n keyboard: false,\n backdrop: 'static',\n resolve: {\n account: _this.scope.selectedAccount,\n address: _this.scope.selectedAccount.accountAddresses.registrationAddress\n }\n });\n modalPopup.result\n .then(function (result) {\n if (result === true) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isSubmitted = true;\n return resolve();\n }\n else {\n _this.scope.errorHandler.Message = 'Error saving registration address details';\n return reject();\n }\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isLoading = false;\n return reject();\n });\n });\n };\n // non sensitive\n ContactInfoViewCtrl.prototype.saveAccountEmailAddressForm = function () {\n this.scope.$broadcast('show-errors-check-validity');\n this.scope.isSensitive = true;\n if (this.scope.accountEmailAddressForm.$invalid) {\n return;\n }\n /*if (!this.canSubmitChangeRequest()) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\n return;\n }*/\n /*var sensitiveEmailAddresses: Array = [\n new EmailAddress(0, ContractNoteEmail, this.scope.contractEmailTags.map((tag) => { return tag.text }).join(','))\n ];*/\n var nonSensitiveEmailAddresses = [\n new Patersons.EmailAddress(1, AccountEmail, this.scope.emailTags.map(function (tag) { return tag.text; }).join(','))\n ];\n // if the list of contract notes email addresses has changed or one of the email addresses has been deleted\n /*if (sensitiveEmailAddresses.length > 0 && this.scope.sensitiveEmailAddressesDirty) {\n var modalPopup = this.modal.open({\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\n controller: SensitiveEmailAddressChangeRequestCtrl,\n keyboard: false,\n backdrop: 'static',\n resolve: {\n account: this.scope.selectedAccount,\n emailAddresses: function() { return sensitiveEmailAddresses }\n }\n });\n \n modalPopup.result\n .then((result) => {\n if (result === true) {\n var promises = [];\n \n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\n }\n \n this.executePromises(promises);\n \n this.scope.isSubmitted = true;\n this.scope.sensitiveEmailAddressesDirty = false;\n }\n else {\n this.scope.errorHandler.Message = 'Error saving email address details';\n }\n });\n }\n else {*/\n var promises = [];\n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\n }\n this.executePromises(promises);\n this.scope.isSubmitted = true;\n //}\n };\n // sensitive\n ContactInfoViewCtrl.prototype.saveContractEmailAddressForm = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n this.scope.isSensitive = true;\n if (this.scope.contractEmailAddressForm.$invalid) {\n return;\n }\n if (!this.canSubmitChangeRequest()) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\n return;\n }\n var sensitiveEmailAddresses = [\n new Patersons.EmailAddress(0, ContractNoteEmail, this.scope.contractEmailTags.map(function (tag) { return tag.text; }).join(','))\n ];\n /*var nonSensitiveEmailAddresses: Array = [\n new EmailAddress(1, AccountEmail, this.scope.emailTags.map((tag) => { return tag.text }).join(','))\n ];*/\n // if the list of contract notes email addresses has changed or one of the email addresses has been deleted\n if (sensitiveEmailAddresses.length > 0 && this.scope.sensitiveEmailAddressesDirty) {\n var modalPopup = this.modal.open({\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\n controller: Patersons.SensitiveEmailAddressChangeRequestCtrl,\n keyboard: false,\n backdrop: 'static',\n resolve: {\n account: this.scope.selectedAccount,\n emailAddresses: function () { return sensitiveEmailAddresses; }\n }\n });\n modalPopup.result\n .then(function (result) {\n if (result === true) {\n /*var promises = [];\n \n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\n }\n \n this.executePromises(promises);\n */\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isSubmitted = true;\n _this.scope.sensitiveEmailAddressesDirty = false;\n }\n else {\n _this.scope.errorHandler.Message = 'Error saving email address details';\n }\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isLoading = false;\n });\n }\n /*else {\n var promises = [];\n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\n }\n this.executePromises(promises);\n this.scope.isSubmitted = true;\n }*/\n };\n ContactInfoViewCtrl.prototype.savePhoneNumberForm = function () {\n this.scope.$broadcast('show-errors-check-validity');\n this.scope.isSensitive = false;\n if (this.scope.phoneNumberForm.$invalid) {\n return;\n }\n this.scope.isLoading = true;\n var promises = [];\n promises.push(this.portfolioService.updatePhoneNumbers(this.scope.selectedAccount.accountId, this.scope.selectedAccount));\n return this.executePromises(promises);\n };\n ContactInfoViewCtrl.prototype.hideAllNotifications = function () {\n this.scope.isSubmitted = false;\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.scope.submissionFailedNotAllApproversRegistered = false;\n };\n ContactInfoViewCtrl.prototype.executePromises = function (promises) {\n var _this = this;\n var numDone = 0;\n var checkAllDone = function () {\n if (numDone === promises.length) {\n return true;\n }\n };\n return new Promise(function (resolve, reject) {\n _this.hideAllNotifications();\n for (var i = 0; i < promises.length; i++) {\n promises[i].then(function (result) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isSubmitted = true;\n _this.scope.isLoading = false;\n numDone++;\n if (checkAllDone()) {\n resolve();\n }\n return;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isLoading = false;\n numDone++;\n if (checkAllDone()) {\n resolve();\n }\n });\n }\n });\n };\n ContactInfoViewCtrl.$inject = ['$scope', '$uibModal', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$document', 'myDetailsService', 'portfolioService', 'tokenService', 'changeRequestService', 'navigationService', 'identityService', 'userCompanyService'];\n return ContactInfoViewCtrl;\n }(Patersons.AccountBaseCtrl));\n Patersons.ContactInfoViewCtrl = ContactInfoViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var TaxFileNumberViewCtrl = (function (_super) {\n __extends(TaxFileNumberViewCtrl, _super);\n function TaxFileNumberViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $document, portfolioService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.taxFileNumber = '';\n this.portfolioService = portfolioService;\n this.scope.parentController = this;\n this.scope.isSubmitted = false;\n this.scope.isBusy = false;\n this.scope.events = this;\n this.document = $document;\n this.scope.scrollDuration = 700;\n this.load();\n }\n TaxFileNumberViewCtrl.prototype.setSelectedAccount = function (accountId) {\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n };\n ;\n TaxFileNumberViewCtrl.prototype.load = function () {\n var _this = this;\n var promise = this.portfolioService.getCombinedPortfolioData();\n promise.then(function (result) {\n _this.scope.accounts = result;\n if (_this.scope.accounts != undefined && _this.scope.accounts.length > 0) {\n _this.scope.selectedAccount = _this.scope.accounts[0];\n }\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n });\n };\n TaxFileNumberViewCtrl.prototype.saveTaxFileNumber = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.taxFileNumberForm.$invalid) {\n return;\n }\n if (this.scope.selectedAccount === undefined) {\n return;\n }\n this.scope.isBusy = true;\n var promise = this.portfolioService.updateTaxFileNumber(this.scope.selectedAccount.accountId, this.scope.taxFileNumber, this.scope.taxFileNumberType);\n promise.then(function (result) {\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\n _this.document.scrollToElement(scrollPlaceholder, 0, _this.scope.scrollDuration);\n _this.scope.isSubmitted = true;\n return;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n TaxFileNumberViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$document', 'portfolioService', 'navigationService'];\n return TaxFileNumberViewCtrl;\n }(Patersons.AccountBaseCtrl));\n Patersons.TaxFileNumberViewCtrl = TaxFileNumberViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar accountDetailsModule = angular.module(\"app.accountDetailsModule\", []);\naccountDetailsModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.myDetailsModule config...');\n $stateProvider\n .state(\"contactInfo\", {\n url: \"/contactInfo\",\n templateUrl: \"assets/templates/accountDetails/contactInfo.html\",\n controller: 'contactInfoViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Account Contact Information\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"bankDetails\", {\n url: \"/bankDetails\",\n templateUrl: \"assets/templates/accountDetails/bankDetails.html\",\n controller: 'bankDetailsViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Account Banking Details\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"taxFileNumber\", {\n url: \"/taxFileNumber\",\n templateUrl: \"assets/templates/accountDetails/taxFileNumber.html\",\n controller: 'taxFileNumberViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Account Tax File Number\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n });\n }]);\naccountDetailsModule.controller('accountBaseCtrl', Patersons.AccountBaseCtrl);\naccountDetailsModule.controller('contactInfoViewCtrl', Patersons.ContactInfoViewCtrl);\naccountDetailsModule.controller('bankDetailsViewCtrl', Patersons.BankDetailsViewCtrl);\naccountDetailsModule.controller('taxFileNumberViewCtrl', Patersons.TaxFileNumberViewCtrl);\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ResearchBaseCtrl = (function (_super) {\n __extends(ResearchBaseCtrl, _super);\n function ResearchBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.activateSection('research');\n }\n ResearchBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return ResearchBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.ResearchBaseCtrl = ResearchBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var StrategyCtrl = (function (_super) {\n __extends(StrategyCtrl, _super);\n function StrategyCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.researchFeedService = researchFeedService;\n this.scope.events = this;\n this.load();\n }\n StrategyCtrl.prototype.load = function () {\n var _this = this;\n this.researchFeedService.getFeaturedStrategyAndEconomics()\n .then(function (result) {\n var feedItems = result;\n _this.scope.morningMarket = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Morning Market');\n //this.scope.weeklyMarketWrap = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Weekly Market Wrap');\n _this.scope.modelPortfolioUpdate = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Model Portfolio Update');\n _this.scope.australianInvestor = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Australian Investor');\n }, function (error) {\n console.log('Data is not availabe');\n });\n this.researchFeedService.getTop3StrategyAndEconomics()\n .then(function (result) {\n var feedItems = result;\n if (feedItems === null || feedItems === undefined) {\n return;\n }\n _this.scope.otherFeatured1 = feedItems.length >= 1 ? feedItems[0] : null;\n _this.scope.otherFeatured2 = feedItems.length >= 2 ? feedItems[1] : null;\n _this.scope.otherFeatured3 = feedItems.length >= 3 ? feedItems[2] : null;\n }, function (error) {\n console.log('Data is not availabe');\n });\n this.researchFeedService.getAllStrategyAndEconomics()\n .then(function (result) {\n _this.scope.feedList = result;\n }, function (error) {\n console.log('Data is not availabe');\n });\n };\n StrategyCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return StrategyCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.StrategyCtrl = StrategyCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PrivateWealthCtrl = (function (_super) {\n __extends(PrivateWealthCtrl, _super);\n function PrivateWealthCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.researchFeedService = researchFeedService;\n this.scope.events = this;\n this.load();\n }\n PrivateWealthCtrl.prototype.load = function () {\n var _this = this;\n this.researchFeedService.getFeaturedPrivateWealthResearch()\n .then(function (result) {\n var feedItems = result;\n _this.scope.modelPortfolioUpdate = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Model Portfolio Update');\n _this.scope.modelPortfolio = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Model Portfolio');\n _this.scope.sectorStrategy = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Sector Strategy');\n _this.scope.australianInvestor = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Australian Investor');\n _this.scope.momentumMonitor = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Momentum Monitor');\n _this.scope.qualityInvesting = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Investment Strategy');\n _this.scope.highYieldStocks = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'High Yield Stocks');\n _this.scope.fixedInterestSecurities = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Fixed Interest Securities');\n _this.scope.marketStrategy = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Market Strategy');\n }, function (error) {\n console.log('Data is not availabe');\n });\n this.researchFeedService.getTop3PrivateWealthResearch()\n .then(function (result) {\n var feedItems = result;\n if (feedItems === null || feedItems === undefined) {\n return;\n }\n _this.scope.otherFeatured1 = feedItems.length >= 1 ? feedItems[0] : null;\n _this.scope.otherFeatured2 = feedItems.length >= 2 ? feedItems[1] : null;\n _this.scope.otherFeatured3 = feedItems.length >= 3 ? feedItems[2] : null;\n }, function (error) {\n console.log('Data is not availabe');\n });\n this.researchFeedService.getAllPrivateWealthResearch()\n .then(function (result) {\n _this.scope.feedList = result;\n }, function (error) {\n console.log('Data is not availabe');\n });\n };\n PrivateWealthCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return PrivateWealthCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.PrivateWealthCtrl = PrivateWealthCtrl;\n})(Patersons || (Patersons = {}));\n\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ArticleCtrl = (function (_super) {\n __extends(ArticleCtrl, _super);\n function ArticleCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $sce, researchFeedService, navigationService, $analytics, article) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.researchFeedService = researchFeedService;\n this.sce = $sce;\n this.$analytics = $analytics;\n this.scope.events = this;\n this.scope.isError = false;\n this.load(article);\n }\n ArticleCtrl.prototype.load = function (article) {\n this.scope.section = this.stateParams['section'];\n console.log(this.scope.section);\n if (article) {\n console.log(article);\n this.scope.article = article;\n this.$analytics.eventTrack('article view', {\n category: 'Research Article',\n label: article.title + \" - \" + window.location.href\n });\n this.scope.isError = false;\n }\n else {\n this.scope.isError = true;\n }\n };\n ArticleCtrl.prototype.toTrustedHTML = function (html) {\n return this.sce.trustAsHtml(html);\n };\n ArticleCtrl.prototype.sanitizeHTMLforView = function (html) {\n var clean = DOMPurify.sanitize(html, { FORBID_TAGS: ['style', 'class'], ADD_ATTR: ['allow', 'allowfullscreen', 'frameborder', 'scrolling'], ADD_TAGS: ['iframe'] });\n return clean;\n };\n ArticleCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$sce', 'researchFeedService', 'navigationService', '$analytics', 'article'];\n return ArticleCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.ArticleCtrl = ArticleCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var QuantitativeAnalysisCtrl = (function (_super) {\n __extends(QuantitativeAnalysisCtrl, _super);\n function QuantitativeAnalysisCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.researchFeedService = researchFeedService;\n this.scope.events = this;\n this.load();\n }\n QuantitativeAnalysisCtrl.prototype.getArticleUrl = function (feedItem) {\n return this.location.absUrl() + '&articleId=' + feedItem.id;\n };\n QuantitativeAnalysisCtrl.prototype.load = function () {\n var _this = this;\n this.researchFeedService.getFeaturedQuantitativeAnalysis()\n .then(function (result) {\n console.log(result);\n var feedItems = result;\n _this.scope.momentumMonitor = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Momentum Monitor');\n _this.scope.qualityInvesting = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Quality Investing');\n _this.scope.highYieldStocks = _this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'High Yield Stocks');\n }, function (error) {\n console.log('Data is not availabe');\n });\n this.researchFeedService.getTop3QuantitativeAnalysis()\n .then(function (result) {\n console.log(result);\n var feedItems = result;\n if (feedItems === null || feedItems === undefined) {\n return;\n }\n _this.scope.otherFeatured1 = feedItems.length >= 1 ? feedItems[0] : null;\n _this.scope.otherFeatured2 = feedItems.length >= 2 ? feedItems[1] : null;\n _this.scope.otherFeatured3 = feedItems.length >= 3 ? feedItems[2] : null;\n }, function (error) {\n console.log('Data is not availabe');\n });\n this.researchFeedService.getAllQuantitativeAnalysis()\n .then(function (result) {\n _this.scope.feedList = result;\n }, function (error) {\n console.log('Data is not availabe');\n });\n };\n QuantitativeAnalysisCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return QuantitativeAnalysisCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.QuantitativeAnalysisCtrl = QuantitativeAnalysisCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var CompanyResearchCtrl = (function (_super) {\n __extends(CompanyResearchCtrl, _super);\n function CompanyResearchCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n }\n CompanyResearchCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return CompanyResearchCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.CompanyResearchCtrl = CompanyResearchCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var EquitiesResearchCtrl = (function (_super) {\n __extends(EquitiesResearchCtrl, _super);\n function EquitiesResearchCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.load();\n }\n EquitiesResearchCtrl.prototype.load = function () {\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n initComponent('component-stockScreener', 'ecScreener-container', 'ec-screener', 'ecScreener_stock').then(function () {\n console.log(\"Loaded screener\");\n });\n });\n };\n EquitiesResearchCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return EquitiesResearchCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.EquitiesResearchCtrl = EquitiesResearchCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var RecentResearchCtrl = (function (_super) {\n __extends(RecentResearchCtrl, _super);\n function RecentResearchCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService, morningStarService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.scope.reverse = true;\n this.morningStarService = morningStarService;\n this.scope.hasData = false;\n this.scope.predicate = \"dateWritten\";\n this.scope.selectedCode = \"\";\n this.scope.selectedDate = new Date();\n this.scope.selectedAnalysts = \"\";\n this.scope.selectedRecommendation = \"\";\n this.scope.currentPage = 1;\n this.scope.itemsPerPage = 15;\n this.load();\n }\n RecentResearchCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.morningStarService.getRecentResearch(true).then(function (data) {\n _this.scope.$apply(function () {\n _this.scope.hasData = true;\n _this.scope.isLoading = false;\n _this.scope.items = data;\n _this.scope.filteredItems = data;\n });\n });\n };\n RecentResearchCtrl.prototype.filterArray = function (array, filters) {\n var filterKeys = Object.keys(filters);\n return array.filter(function (item) {\n // validates all filter criteria\n return filterKeys.every(function (key) {\n // ignores non-function predicates\n if (typeof filters[key] !== 'function')\n return true;\n return filters[key](item[key]);\n });\n });\n };\n RecentResearchCtrl.prototype.filterItems = function () {\n var _this = this;\n var filters = {};\n if (this.scope.selectedCode) {\n filters.asxcode = function (selectedCode) { return selectedCode === _this.scope.selectedCode; };\n }\n if (this.scope.selectedAnalysts) {\n filters.author = function (author) { return author === _this.scope.selectedAnalysts; };\n }\n if (this.scope.selectedRecommendation) {\n filters.licenseeRecommendation = function (licenseeRecommendation) { return licenseeRecommendation === _this.scope.selectedRecommendation; };\n }\n if (this.scope.selectedDate) {\n filters.dateWritten = function (dateWritten) { return new Date(dateWritten) <= _this.scope.selectedDate; };\n }\n this.scope.filteredItems = this.filterArray(this.scope.items, filters);\n };\n RecentResearchCtrl.prototype.onFilterChange = function (property, value) {\n this.scope[property] = value;\n this.filterItems();\n };\n RecentResearchCtrl.prototype.order = function (predicate) {\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\n this.scope.predicate = predicate;\n };\n RecentResearchCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService', 'morningStarService'];\n return RecentResearchCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.RecentResearchCtrl = RecentResearchCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ASXAnnouncementsCtrl = (function (_super) {\n __extends(ASXAnnouncementsCtrl, _super);\n function ASXAnnouncementsCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService, morningStarService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.onFilterChange = function (key, value) {\n _this.scope[key] = value;\n var selectedCode = _this.scope.selectedCode;\n if (!selectedCode || selectedCode.length <= 5) {\n _this.load(selectedCode, _this.scope.selectedDate, _this.scope.currentPage);\n }\n };\n this.scope = $scope;\n this.scope.events = this;\n this.morningStarService = morningStarService;\n this.scope.hasData = false;\n this.scope.totalItems = 0;\n this.scope.selectedCode = \"\";\n this.scope.dateOptions = [\n {\n key: \"day1\",\n value: \"Today\"\n }, {\n key: \"day2\",\n value: \"Previous Day\"\n }, {\n key: \"week1\",\n value: \"Past week\"\n }, {\n key: \"month1\",\n value: \"Past Month\"\n }, {\n key: \"month3\",\n value: \"Past 3 Months\"\n }, {\n key: \"month6\",\n value: \"Past 6 Months\"\n }, {\n key: \"year1\",\n value: \"Past Year\"\n }\n ];\n this.scope.selectedDate = \"day1\";\n this.scope.itemsPerPage = 15;\n this.load(this.scope.selectedCode, this.scope.selectedDate, this.scope.currentPage);\n }\n ASXAnnouncementsCtrl.prototype.load = function (selectedCode, selectedDate, page) {\n var _this = this;\n this.scope.isLoading = true;\n this.morningStarService.getASXAnnouncements(selectedCode, selectedDate, page).then(function (data) {\n _this.scope.$apply(function () {\n _this.scope.hasData = true;\n _this.scope.isLoading = false;\n if (data.document) {\n _this.scope.items = [].concat(data.document);\n if (_this.scope.selectedDate === 'day2') {\n }\n }\n else {\n _this.scope.items = [];\n }\n _this.scope.totalItems = +data.resultstotal;\n });\n });\n };\n ASXAnnouncementsCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService', 'morningStarService'];\n return ASXAnnouncementsCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.ASXAnnouncementsCtrl = ASXAnnouncementsCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ETFResearchCtrl = (function (_super) {\n __extends(ETFResearchCtrl, _super);\n function ETFResearchCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.load();\n }\n ETFResearchCtrl.prototype.load = function () {\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n initComponent('component-etfScreener', 'ecScreener-container', 'ec-screener', 'ecScreener_etf').then(function () {\n console.log(\"Loaded screener\");\n });\n });\n };\n ETFResearchCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return ETFResearchCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.ETFResearchCtrl = ETFResearchCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var FundResearchCtrl = (function (_super) {\n __extends(FundResearchCtrl, _super);\n function FundResearchCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.load();\n }\n FundResearchCtrl.prototype.load = function () {\n var self = this;\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n initComponent('component-fundScreener', 'ecScreener-container', 'ec-screener', 'ecScreener_fund').then(function () {\n console.log(\"Loaded screener\");\n });\n });\n };\n FundResearchCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return FundResearchCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.FundResearchCtrl = FundResearchCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var QuickSearchCtrl = (function (_super) {\n __extends(QuickSearchCtrl, _super);\n function QuickSearchCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.load();\n }\n QuickSearchCtrl.prototype.load = function () {\n rootMorningstarPromise().then(function (promiseChain) {\n console.log('initializing component');\n initComponent('component-autocomplete-search', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteSearch').then(function () {\n console.log('Done loading autocomplete search.');\n morningstar.asterix.instanceRegistry.find('ecAutocompleteSearch').on('parameterChanged:latestSelectedSecurity', function (newVal) {\n window['openAutocompleteResult'](newVal); //declared in autocomplete config\n morningstar.asterix.instanceRegistry.get('ecAutocompleteSearch').setParameter('search', '');\n });\n });\n });\n };\n QuickSearchCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\n return QuickSearchCtrl;\n }(Patersons.ResearchBaseCtrl));\n Patersons.QuickSearchCtrl = QuickSearchCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar researchModule = angular.module(\"app.researchModule\", []);\nresearchModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.researchModule config...');\n var wholesaleClientChecker = ['sessionService', '$q', '$state', 'userCompanyService', function (sessionService, $q, $state, userCompanyService) {\n var deferred = $q.defer();\n userCompanyService.getUserCompany().then(function (company) {\n if (sessionService.getCurrentUserProfile().wholesaleclient === 'True' && !company.enableWholesaleClientsResearch) {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n });\n return deferred.promise;\n }];\n $stateProvider\n .state(\"privateWealth\", {\n url: \"/privateWealthResearch?articleId\",\n templateUrl: \"assets/templates/Research/privateWealth.html\",\n controller: \"privateWealthCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Private Wealth Research\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('article', {\n url: '/article/:section/:articleId',\n templateUrl: 'assets/templates/research/article.html',\n controller: \"articleCtrl\",\n resolve: {\n //resolve the title a bit differently - get the article first \n article: ['$rootScope', '$stateParams', '$q', 'researchFeedService', function ($rootScope, $stateParams, $q, researchFeedService) {\n var deferred = $q.defer();\n researchFeedService.getArticle($stateParams['articleId'])\n .then(function (article) {\n if (article.id) {\n $rootScope.meta = { title: article.title };\n deferred.resolve(article);\n }\n else {\n $rootScope.meta = { title: \"Article Not Available\" };\n deferred.resolve();\n }\n }, function (reason) {\n $rootScope.meta = { title: \"Article Not Available\" };\n deferred.resolve();\n });\n return deferred.promise;\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('companyResearch', {\n url: '/companyResearch',\n templateUrl: 'assets/templates/research/companyResearch.html',\n controller: 'companyResearchCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Company Research\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('equitiesResearch', {\n url: '/equitiesResearch',\n templateUrl: 'assets/templates/research/equitiesResearch.html',\n controller: 'equitiesResearchCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Equities Research\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('fundResearch', {\n url: '/fundResearch',\n templateUrl: 'assets/templates/research/fundResearch.html',\n controller: 'fundResearchCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Fund Research\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('etfResearch', {\n url: '/etfResearch',\n templateUrl: 'assets/templates/research/etfResearch.html',\n controller: 'etfResearchCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"ETF Research\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('recentResearch', {\n url: '/recentResearch',\n templateUrl: 'assets/templates/research/recentResearch.html',\n controller: 'recentResearchCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Recent Equities Research\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('asxAnnouncements', {\n url: '/asxAnnouncements',\n templateUrl: 'assets/templates/research/asxAnnouncements.html',\n controller: 'asxAnnouncementsCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"ASX Announcements\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n })\n .state('search', {\n url: '/search',\n templateUrl: 'assets/templates/research/quickSearch.html',\n controller: 'quickSearchCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Quick Search\" };\n }],\n wholesaleClientCheck: wholesaleClientChecker\n }\n });\n }]);\nresearchModule.controller('researchBaseCtrl', Patersons.ResearchBaseCtrl);\nresearchModule.controller('strategyCtrl', Patersons.StrategyCtrl);\nresearchModule.controller('privateWealthCtrl', Patersons.PrivateWealthCtrl);\nresearchModule.controller('quantitativeAnalysisCtrl', Patersons.QuantitativeAnalysisCtrl);\nresearchModule.controller('companyResearchCtrl', Patersons.CompanyResearchCtrl);\nresearchModule.controller('equitiesResearchCtrl', Patersons.EquitiesResearchCtrl);\nresearchModule.controller('fundResearchCtrl', Patersons.FundResearchCtrl);\nresearchModule.controller('etfResearchCtrl', Patersons.ETFResearchCtrl);\nresearchModule.controller('quickSearchCtrl', Patersons.QuickSearchCtrl);\nresearchModule.controller('recentResearchCtrl', Patersons.RecentResearchCtrl);\nresearchModule.controller('asxAnnouncementsCtrl', Patersons.ASXAnnouncementsCtrl);\nresearchModule.controller('articleCtrl', Patersons.ArticleCtrl);\n\n'use strict';\nvar myDetailsModule = angular.module(\"app.myDetailsModule\", []);\nmyDetailsModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.myDetailsModule config...');\n $stateProvider\n .state(\"accoladeOptions\", {\n url: \"/accoladeOptions\",\n templateUrl: \"assets/templates/myProfile/accoladeOptions.html\",\n controller: 'accoladeOptionsViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Accolade Mailing Options\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"researchSubscriptions\", {\n url: \"/researchSubscriptions\",\n templateUrl: \"assets/templates/myProfile/researchSubscriptions.html\",\n controller: 'researchSubscriptionsViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Manage Research Subscriptions\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state('profile', {\n url: '/profile',\n templateUrl: 'assets/templates/myProfile/profile.html',\n controller: \"profileCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Profile\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n });\n }]);\nmyDetailsModule.controller('myDetailsBaseCtrl', Patersons.MyDetailsBaseCtrl);\nmyDetailsModule.controller('accoladeOptionsViewCtrl', Patersons.AccoladeOptionsViewCtrl);\nmyDetailsModule.controller('researchSubscriptionsViewCtrl', Patersons.ResearchSubscriptionsViewCtrl);\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ChangeRequestSubmittedComponent = (function () {\n function ChangeRequestSubmittedComponent() {\n this.templateUrl = 'assets/templates/common/components/changeRequestSubmitted.component.html';\n this.bindings = {\n hasApprovers: '<',\n isSensitive: '<'\n };\n }\n return ChangeRequestSubmittedComponent;\n }());\n Patersons.ChangeRequestSubmittedComponent = ChangeRequestSubmittedComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var PhoneNotRegisteredComponent = (function () {\n function PhoneNotRegisteredComponent() {\n this.templateUrl = 'assets/templates/common/components/phoneNotRegistered.component.html';\n }\n return PhoneNotRegisteredComponent;\n }());\n Patersons.PhoneNotRegisteredComponent = PhoneNotRegisteredComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ApproversNotRegisteredComponent = (function () {\n function ApproversNotRegisteredComponent() {\n this.templateUrl = 'assets/templates/common/components/approversNotRegistered.component.html';\n this.controller = ApproversNotRegisteredController;\n }\n return ApproversNotRegisteredComponent;\n }());\n Patersons.ApproversNotRegisteredComponent = ApproversNotRegisteredComponent;\n var ApproversNotRegisteredController = (function () {\n function ApproversNotRegisteredController($location, userCompanyService) {\n var _this = this;\n this.location = $location;\n userCompanyService.getUserCompany().then(function (company) {\n _this.userCompany = company;\n });\n }\n ApproversNotRegisteredController.$inject = ['$location', 'userCompanyService'];\n return ApproversNotRegisteredController;\n }());\n Patersons.ApproversNotRegisteredController = ApproversNotRegisteredController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SectionHeaderComponent = (function () {\n function SectionHeaderComponent() {\n this.templateUrl = 'assets/templates/common/components/sectionHeader.component.html';\n this.bindings = {\n title: '@'\n };\n }\n return SectionHeaderComponent;\n }());\n Patersons.SectionHeaderComponent = SectionHeaderComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SpinnerComponent = (function () {\n function SpinnerComponent() {\n this.templateUrl = 'assets/templates/common/components/spinner.component.html';\n }\n return SpinnerComponent;\n }());\n Patersons.SpinnerComponent = SpinnerComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var AccountSelectComponent = (function () {\n function AccountSelectComponent() {\n this.templateUrl = 'assets/templates/common/components/accountSelect.component.html';\n this.controller = AccountSelectController;\n this.bindings = {\n accounts: '=',\n selectedAccount: '<',\n isDisabled: '<',\n rememberSelection: '<',\n showSelectAccount: '<',\n labelText: '@',\n onAccountChange: '&'\n };\n }\n return AccountSelectComponent;\n }());\n Patersons.AccountSelectComponent = AccountSelectComponent;\n var AccountSelectController = (function () {\n function AccountSelectController(selectionService) {\n this.selectionService = selectionService;\n if (this.rememberSelection === undefined) {\n this.useSelectionService = true;\n }\n else {\n this.useSelectionService = this.rememberSelection;\n }\n }\n Object.defineProperty(AccountSelectController.prototype, \"accounts\", {\n get: function () {\n return this._accounts;\n },\n set: function (value) {\n this._accounts = value;\n if (!this.useSelectionService) {\n return;\n }\n if (this.selectionService && this.selectionService.selectedAccountId) {\n var account = this.selectionService.getSelectedAccount(this._accounts);\n if (account != null) {\n this._selectedAccount = account;\n this.onAccountChange({ accountId: this._selectedAccount.accountId });\n }\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(AccountSelectController.prototype, \"selectedAccount\", {\n get: function () {\n return this._selectedAccount;\n },\n set: function (value) {\n this._selectedAccount = value;\n if (!this.useSelectionService) {\n return;\n }\n if (this.selectionService) {\n if (value) {\n this.selectionService.selectedAccountId = value.accountId;\n }\n }\n },\n enumerable: true,\n configurable: true\n });\n AccountSelectController.$inject = ['selectionService'];\n return AccountSelectController;\n }());\n Patersons.AccountSelectController = AccountSelectController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ActionButtonComponent = (function () {\n function ActionButtonComponent() {\n this.templateUrl = 'assets/templates/common/components/actionButton.component.html';\n this.bindings = {\n isDisabled: '<',\n isBusy: '<',\n text: '@',\n onClick: '&'\n };\n }\n return ActionButtonComponent;\n }());\n Patersons.ActionButtonComponent = ActionButtonComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var PasswordValidationComponent = (function () {\n function PasswordValidationComponent() {\n this.templateUrl = 'assets/templates/common/components/passwordValidation.component.html';\n this.bindings = {\n password: '<',\n onValidation: '<'\n };\n this.controller = PasswordValidationCtrl;\n }\n return PasswordValidationComponent;\n }());\n Patersons.PasswordValidationComponent = PasswordValidationComponent;\n var PasswordValidationCtrl = (function () {\n function PasswordValidationCtrl() {\n this.$ctrl = this;\n this.resetValidation();\n }\n PasswordValidationCtrl.prototype.resetValidation = function () {\n this.validUppercase = false;\n this.validLowercase = false;\n this.validNumber = false;\n this.validSpecial = false;\n this.valid = false;\n };\n PasswordValidationCtrl.prototype.validate = function () {\n this.resetValidation();\n if (this.password) {\n if (this.password.match(/[A-Z]/g)) {\n this.validUppercase = true;\n }\n if (this.password.match(/[a-z]/g)) {\n this.validLowercase = true;\n }\n if (this.password.match(/[0-9]/g)) {\n this.validNumber = true;\n }\n if (this.password.match(/[#$^+=!*()@%&]/g)) {\n this.validSpecial = true;\n }\n if (this.validUppercase &&\n this.validLowercase &&\n this.validNumber &&\n this.validSpecial) {\n this.valid = true;\n }\n if (this.onValidation) {\n this.onValidation(this.valid);\n }\n }\n };\n PasswordValidationCtrl.prototype.$onChanges = function (changesObj) {\n this.validate();\n };\n return PasswordValidationCtrl;\n }());\n Patersons.PasswordValidationCtrl = PasswordValidationCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var DateSelectComponent = (function () {\n function DateSelectComponent() {\n this.templateUrl = 'assets/templates/common/components/dateSelect.component.html';\n this.controller = DateSelectController;\n this.bindings = {\n isDisabled: '<',\n defaultDate: '<',\n date: '<',\n labelText: '@',\n onDateChange: '&'\n };\n }\n return DateSelectComponent;\n }());\n Patersons.DateSelectComponent = DateSelectComponent;\n var DateSelectController = (function () {\n function DateSelectController() {\n this.isOpened = false;\n this.format = \"dd/MM/yyyy\";\n this.isOpened = false;\n this.format = \"dd/MM/yyyy\";\n if (this.defaultDate) {\n this.selectedDate = this.defaultDate;\n }\n else {\n if (this.date) {\n this.selectedDate = this.date;\n }\n else {\n console.log(this.selectedDate);\n this.selectedDate = new Date();\n }\n }\n }\n DateSelectController.prototype.$onChanges = function (changesObj) {\n if (changesObj.date && changesObj.date.currentValue) {\n this.selectedDate = changesObj.date.currentValue;\n }\n };\n DateSelectController.prototype.onDateSelect = function (e, data) {\n this.isOpened = false;\n this.onDateChange(data);\n };\n DateSelectController.prototype.openCalendar = function () {\n this.isOpened = true;\n };\n return DateSelectController;\n }());\n Patersons.DateSelectController = DateSelectController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var MorningstarErrorComponent = (function () {\n function MorningstarErrorComponent() {\n this.templateUrl = 'assets/templates/common/components/morningstarError.component.html';\n }\n return MorningstarErrorComponent;\n }());\n Patersons.MorningstarErrorComponent = MorningstarErrorComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ChangePhoneComponent = (function () {\n function ChangePhoneComponent() {\n this.templateUrl = 'assets/templates/common/components/changePhone.component.html';\n this.controller = ChangePhoneCtrl;\n this.bindings = {\n showCancelButton: '<',\n };\n }\n return ChangePhoneComponent;\n }());\n Patersons.ChangePhoneComponent = ChangePhoneComponent;\n var ChangePhoneCtrl = (function () {\n function ChangePhoneCtrl($scope, $location, $window, $state, $stateParams, identityService, tokenService, navigationService, userCompanyService, sessionService) {\n var _this = this;\n this.scope = $scope;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.identityService = identityService;\n this.tokenService = tokenService;\n this.navigationService = navigationService;\n this.location = $location;\n this.sessionService = sessionService;\n this.scope.profile = this.sessionService.getCurrentUserProfile();\n this.scope.events = this;\n this.scope.showCancelButton = this.showCancelButton;\n var userId = $stateParams.userId;\n this.scope.isCodeSubmitted = false;\n this.scope.phoneDetails = {\n mobilePhoneNumber: \"\"\n };\n this.navigationService.deactivateAll();\n this.updateUiFromProfile();\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n ChangePhoneCtrl.prototype.updateUiFromProfile = function () {\n //let profile = this.tokenService.tokenManager.profile;\n var _this = this;\n //if (profile) {\n //this.scope.showInfo = (profile.phone_number_verified != \"true\");\n //this.scope.currentNumber = profile.phone_number;\n // get phone number from backend\n var promise = this.identityService.getPhoneNumber();\n promise.then(function (result) {\n _this.scope.showInfo = (result[\"phoneNumberVerified\"] != true);\n _this.scope.currentNumber = result[\"phoneNumber\"];\n _this.scope.phoneDetails = {\n mobilePhoneNumber: _this.scope.currentNumber\n };\n console.log(_this.scope.currentNumber);\n console.info('this.scope.showInfo ' + _this.scope.showInfo);\n console.info('this.scope.currentNumber ' + _this.scope.currentNumber);\n }).catch(function (reason) {\n _this.scope.showInfo = true;\n console.error(reason);\n });\n //} else {\n // this.scope.showInfo = true;\n //}\n };\n ChangePhoneCtrl.prototype.changeNumber = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.changePhoneForm.$invalid) {\n return;\n }\n this.identityService.changeMobileNumber(this.scope.phoneDetails)\n .then(function (result) {\n _this.scope.isCodeSubmitted = true;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n });\n };\n ChangePhoneCtrl.prototype.confirmCode = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.verifyPhoneForm.$invalid) {\n return;\n }\n this.scope.phoneConfirmationDetails.mobilePhoneNumber = this.scope.phoneDetails.mobilePhoneNumber;\n this.identityService.confirmMobileNumberChange(this.scope.phoneConfirmationDetails)\n .then(function (result) {\n _this.scope.showInfo = false;\n _this.scope.currentNumber = _this.scope.phoneConfirmationDetails.mobilePhoneNumber;\n setTimeout(function () {\n location.href = '/dashboard';\n }, 2000);\n // need to avoid that redirect\n //this.tokenService.tokenManager.redirectForToken();\n }, function (reason) {\n _this.updateUiFromProfile();\n _this.scope.errorHandler = reason.data;\n });\n };\n ChangePhoneCtrl.prototype.cancelRegistration = function () {\n location.href = '/dashboard';\n };\n ChangePhoneCtrl.$inject = ['$scope', '$location', '$window', '$state', '$stateParams', 'identityService', 'tokenService', 'navigationService', 'userCompanyService', 'sessionService'];\n return ChangePhoneCtrl;\n }());\n Patersons.ChangePhoneCtrl = ChangePhoneCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var FeaturedItemComponent = (function () {\n function FeaturedItemComponent() {\n this.templateUrl = 'assets/templates/research/components/featuredItem.component.html';\n this.bindings = {\n feedItem: '<',\n showImage: '<',\n defaultImage: '@',\n title: '@'\n };\n }\n return FeaturedItemComponent;\n }());\n Patersons.FeaturedItemComponent = FeaturedItemComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var feedListComponent = (function () {\n function feedListComponent() {\n this.templateUrl = 'assets/templates/research/components/feedList.component.html';\n this.controller = FeedListController;\n this.bindings = {\n feedItems: '<',\n title: '@'\n };\n }\n return feedListComponent;\n }());\n Patersons.feedListComponent = feedListComponent;\n var FeedListController = (function () {\n function FeedListController() {\n this.predicate = 'publishedDate';\n this.reverse = true;\n }\n FeedListController.prototype.order = function (predicate) {\n this.reverse = (this.predicate === predicate) ? !this.reverse : false;\n this.predicate = predicate;\n };\n return FeedListController;\n }());\n Patersons.FeedListController = FeedListController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var InvestorDocsComponent = (function () {\n function InvestorDocsComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/investorDocs.component.html';\n this.controller = InvestorDocsController;\n this.bindings = {\n report: '<',\n isDownloading: '<',\n onDownloadFiles: '&'\n };\n }\n return InvestorDocsComponent;\n }());\n Patersons.InvestorDocsComponent = InvestorDocsComponent;\n var InvestorDocsController = (function () {\n function InvestorDocsController() {\n this.extractDateFromString = function (string) {\n var months = [\"january\", \"february\", \"march\", \"april\", \"may\", \"june\", \"july\", \"august\", \"september\", \"october\", \"november\", \"december\"];\n // Match = 12 January 2019\n var regexpFullDate = new RegExp(\"\\\\d{1,2} (\" + months.join(\"|\") + \") \\\\d{4}\", \"gi\");\n var matchFullDate = string.match(regexpFullDate);\n // Match 2019'20\n var regexpYear = new RegExp(\"\\\\d{4}'\\\\d{2}\");\n var matchYear = string.match(regexpYear);\n // Match September 2019\n var regexpPartialDate = new RegExp(\"(\" + months.join(\"|\") + \") \\\\d{4}\", \"gi\");\n var matchPartialDate = string.match(regexpPartialDate);\n var date = null;\n if (matchFullDate && matchFullDate[0]) {\n date = new Date(matchFullDate[0]);\n }\n else if (matchYear && matchYear[0]) {\n var yearSplit = matchYear[0].split(\"'\");\n var year = parseInt(yearSplit[0]) + 1;\n date = new Date(year.toString());\n }\n else if (matchPartialDate && matchPartialDate[0]) {\n var dateSplit = matchPartialDate[0].split(\" \");\n date = new Date(dateSplit[1], months.indexOf(dateSplit[0].toLowerCase()), 1);\n }\n return date;\n };\n this.selectAll = function (check) {\n this.report.investorDocs.forEach(function (item, index) {\n item.isSelected = check;\n });\n };\n this.order = function (predicate) {\n this.reverse = (this.predicate === predicate) ? !this.reverse : false;\n this.predicate = predicate;\n };\n this.downloadDocs = function () {\n var selectedItems = [];\n this.report.investorDocs.forEach(function (item, index) {\n if (item.isSelected) {\n selectedItems.push(item);\n }\n });\n this.onDownloadFiles({ investorDocs: selectedItems });\n };\n this.predicate = \"date\";\n this.reverse = true;\n var self = this;\n this.report.investorDocs = this.report.investorDocs.map(function (a) {\n a.date = self.extractDateFromString(a.name);\n return a;\n });\n }\n return InvestorDocsController;\n }());\n Patersons.InvestorDocsController = InvestorDocsController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ReportTypeSelectComponent = (function () {\n function ReportTypeSelectComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/reportTypeSelect.component.html';\n this.controller = ReportTypeSelectController;\n this.bindings = {\n isDisabled: '<',\n onReportTypeChange: '&'\n };\n }\n return ReportTypeSelectComponent;\n }());\n Patersons.ReportTypeSelectComponent = ReportTypeSelectComponent;\n var ReportTypeSelectController = (function () {\n function ReportTypeSelectController($scope, $location, $state, $stateParams, userCompanyService) {\n var _this = this;\n this.$ctrl = this;\n this.scope = $scope;\n this.scope.events = this;\n this.scope.menuOpen = false;\n this.userCompanyService = userCompanyService;\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n ReportTypeSelectController.$inject = ['$scope', '$location', '$state', '$stateParams', 'userCompanyService'];\n return ReportTypeSelectController;\n }());\n Patersons.ReportTypeSelectController = ReportTypeSelectController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var HoldingsDisclaimerComponent = (function () {\n function HoldingsDisclaimerComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/holdingsDisclaimer.component.html';\n this.controller = ['userCompanyService', function (userCompanyService) {\n var _this = this;\n userCompanyService.getUserCompany().then(function (company) {\n _this.userCompany = company;\n });\n }];\n }\n return HoldingsDisclaimerComponent;\n }());\n Patersons.HoldingsDisclaimerComponent = HoldingsDisclaimerComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var ReportDisclaimerComponent = (function () {\n function ReportDisclaimerComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/reportDisclaimer.component.html';\n this.controller = ['userCompanyService', function (userCompanyService) {\n var _this = this;\n userCompanyService.getUserCompany().then(function (company) {\n _this.userCompany = company;\n });\n }];\n }\n return ReportDisclaimerComponent;\n }());\n Patersons.ReportDisclaimerComponent = ReportDisclaimerComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var AccountDateRangeFilterComponent = (function () {\n function AccountDateRangeFilterComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/accountDateRangeFilter.component.html';\n this.controller = AccountDateRangeFilterController;\n this.bindings = {\n defaultFromDate: '<',\n defaultToDate: '<',\n accounts: '=',\n isBusy: '<',\n onApplyFilter: '&'\n };\n }\n return AccountDateRangeFilterComponent;\n }());\n Patersons.AccountDateRangeFilterComponent = AccountDateRangeFilterComponent;\n var AccountDateRangeFilterController = (function () {\n function AccountDateRangeFilterController() {\n if (this.defaultFromDate) {\n this.setFromDate(this.defaultFromDate);\n }\n else {\n this.setFromDate(new Date());\n }\n if (this.defaultToDate) {\n this.setToDate(this.defaultToDate);\n }\n else {\n this.setToDate(new Date());\n }\n }\n AccountDateRangeFilterController.prototype.setSelectedAccount = function (accountId) {\n this.selectedAccount = this.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n console.info('selected account id: ' + this.selectedAccount.accountId);\n if (this.selectedAccount && this.fromDate && this.toDate) {\n this.onApplyFilter({ accountId: this.selectedAccount.accountId, fromDate: this.fromDate, toDate: this.toDate });\n }\n };\n AccountDateRangeFilterController.prototype.setFromDate = function (fromDate) {\n this.fromDate = fromDate;\n console.info('from date: ' + this.fromDate);\n if (this.selectedAccount && this.fromDate && this.toDate) {\n this.onApplyFilter({ accountId: this.selectedAccount.accountId, fromDate: this.fromDate, toDate: this.toDate });\n }\n };\n AccountDateRangeFilterController.prototype.setToDate = function (toDate) {\n this.toDate = toDate;\n console.info('to date: ' + this.toDate);\n if (this.selectedAccount && this.fromDate && this.toDate) {\n this.onApplyFilter({ accountId: this.selectedAccount.accountId, fromDate: this.fromDate, toDate: this.toDate });\n }\n };\n AccountDateRangeFilterController.prototype.$onChanges = function (changesObj) {\n console.log(\"Account Date Range Obj: \");\n console.log(changesObj);\n if (this.accounts && this.accounts[0] && !this.selectedAccount) {\n this.setSelectedAccount(this.accounts[0].accountId);\n }\n };\n return AccountDateRangeFilterController;\n }());\n Patersons.AccountDateRangeFilterController = AccountDateRangeFilterController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var PortfolioSummaryComponent = (function () {\n function PortfolioSummaryComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/portfolioSummary.component.html';\n this.controller = PortfolioSummaryController;\n this.bindings = {\n account: '<',\n isDownloadReady: '<',\n summaryText: '@',\n onDownloadPdfClicked: '&',\n onDownloadCsvClicked: '&',\n hidePdfOption: '<',\n hideCsvOption: '<'\n };\n }\n return PortfolioSummaryComponent;\n }());\n Patersons.PortfolioSummaryComponent = PortfolioSummaryComponent;\n var PortfolioSummaryController = (function () {\n function PortfolioSummaryController() {\n }\n return PortfolioSummaryController;\n }());\n Patersons.PortfolioSummaryController = PortfolioSummaryController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n // This enum must be kept consistent with the C# enum defined in Patersons.Investors.InvestorApi.Model.\n // HACK: The quirk of casting \"Value\" to before assigning it to the enum Value is necessary\n // because, when we deserialise the ReportType information from the Web API we get back a string, which\n // the transpiled Javascript happily assigns to the target property since it stores no type information.\n (function (ReportType) {\n ReportType[ReportType[\"CapitalTransactions\"] = \"CapitalTransactions\"] = \"CapitalTransactions\";\n ReportType[ReportType[\"QuarterlyReports\"] = \"QuarterlyReports\"] = \"QuarterlyReports\";\n ReportType[ReportType[\"Cash\"] = \"Cash\"] = \"Cash\";\n ReportType[ReportType[\"Income\"] = \"Income\"] = \"Income\";\n ReportType[ReportType[\"CapitalGains\"] = \"CapitalGains\"] = \"CapitalGains\";\n ReportType[ReportType[\"UnrealisedCapitalGains\"] = \"UnrealisedCapitalGains\"] = \"UnrealisedCapitalGains\";\n ReportType[ReportType[\"Performance\"] = \"Performance\"] = \"Performance\";\n ReportType[ReportType[\"TaxReports\"] = \"TaxReports\"] = \"TaxReports\";\n ReportType[ReportType[\"Valuation\"] = \"Valuation\"] = \"Valuation\";\n ReportType[ReportType[\"StandardLedger\"] = \"StandardLedger\"] = \"StandardLedger\";\n ReportType[ReportType[\"MarketValue\"] = \"MarketValue\"] = \"MarketValue\";\n })(Patersons.ReportType || (Patersons.ReportType = {}));\n var ReportType = Patersons.ReportType;\n var AbstractReport = (function () {\n function AbstractReport() {\n }\n return AbstractReport;\n }());\n Patersons.AbstractReport = AbstractReport;\n var AbstractReportController = (function () {\n function AbstractReportController() {\n this.shortPaddedDateFormat = 'dd MMM yyyy';\n this.mediumDateFormat = 'd MMMM yyyy';\n this.fullDateTimeFormat = 'd MMMM yyyy h:mm:ssa';\n }\n AbstractReportController.prototype.mapAgilityExchangeCodeToMIC = function (exchangeCode) {\n switch (exchangeCode) {\n case \"HKE\":\n case \"HKG\":\n exchangeCode = \"EX$$$$XHKG\";\n break;\n case \"SGX\":\n case \"SES\":\n exchangeCode = \"EX$$$$XSES\";\n break;\n case \"NAS\":\n exchangeCode = \"EX$$$$XNAS\";\n break;\n case \"NYS\":\n exchangeCode = \"EX$$$$XNYS\";\n break;\n case \"AME\":\n case \"ASE\":\n exchangeCode = \"EX$$$$XASE\";\n break;\n case \"LSE\":\n case \"LON\":\n exchangeCode = \"EX$$$$XLON\";\n break;\n case \"ETR\":\n case \"FRA\":\n exchangeCode = \"EX$$$$XFRA\";\n break;\n case \"PAR\":\n exchangeCode = \"EX$$$$XPAR\";\n break;\n case \"ARC\":\n case \"ARCX\":\n exchangeCode = \"EX$$$$ARCX\";\n break;\n case \"AMS\":\n exchangeCode = \"EX$$$$XAMS\";\n break;\n case \"MAD\":\n case \"MCE\":\n exchangeCode = \"EX$$$$XMCE\";\n break;\n case \"MTA\":\n case \"MIL\":\n exchangeCode = \"EX$$$$XMIL\";\n break;\n case \"AXW\":\n case \"ASX\":\n exchangeCode = \"EX$$$$XASX\";\n break;\n default:\n exchangeCode = \"UNL\";\n break;\n }\n return exchangeCode;\n };\n return AbstractReportController;\n }());\n Patersons.AbstractReportController = AbstractReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var IncomeReport = (function (_super) {\n __extends(IncomeReport, _super);\n function IncomeReport() {\n _super.apply(this, arguments);\n }\n return IncomeReport;\n }(Patersons.AbstractReport));\n Patersons.IncomeReport = IncomeReport;\n var TransactionTypeCategory = (function () {\n function TransactionTypeCategory() {\n }\n return TransactionTypeCategory;\n }());\n Patersons.TransactionTypeCategory = TransactionTypeCategory;\n var TransactionTypeSubCategory = (function () {\n function TransactionTypeSubCategory() {\n }\n return TransactionTypeSubCategory;\n }());\n Patersons.TransactionTypeSubCategory = TransactionTypeSubCategory;\n var IncomeReportLineItem = (function () {\n function IncomeReportLineItem() {\n }\n return IncomeReportLineItem;\n }());\n Patersons.IncomeReportLineItem = IncomeReportLineItem;\n var IncomeReportComponent = (function () {\n function IncomeReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/incomeReport.component.html';\n this.controller = IncomeReportController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return IncomeReportComponent;\n }());\n Patersons.IncomeReportComponent = IncomeReportComponent;\n var IncomeReportController = (function (_super) {\n __extends(IncomeReportController, _super);\n function IncomeReportController() {\n _super.apply(this, arguments);\n }\n return IncomeReportController;\n }(Patersons.AbstractReportController));\n Patersons.IncomeReportController = IncomeReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var CashReport = (function (_super) {\n __extends(CashReport, _super);\n function CashReport() {\n _super.apply(this, arguments);\n }\n return CashReport;\n }(Patersons.AbstractReport));\n Patersons.CashReport = CashReport;\n var CashReportTransactionGroup = (function () {\n function CashReportTransactionGroup() {\n }\n return CashReportTransactionGroup;\n }());\n Patersons.CashReportTransactionGroup = CashReportTransactionGroup;\n var CashReportLineItem = (function () {\n function CashReportLineItem() {\n }\n return CashReportLineItem;\n }());\n Patersons.CashReportLineItem = CashReportLineItem;\n var CashReportComponent = (function () {\n function CashReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/cashReport.component.html';\n this.controller = CashReportController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return CashReportComponent;\n }());\n Patersons.CashReportComponent = CashReportComponent;\n var CashReportController = (function (_super) {\n __extends(CashReportController, _super);\n function CashReportController() {\n _super.apply(this, arguments);\n }\n return CashReportController;\n }(Patersons.AbstractReportController));\n Patersons.CashReportController = CashReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var CapitalTransactionStatement = (function (_super) {\n __extends(CapitalTransactionStatement, _super);\n function CapitalTransactionStatement() {\n _super.apply(this, arguments);\n }\n return CapitalTransactionStatement;\n }(Patersons.AbstractReport));\n Patersons.CapitalTransactionStatement = CapitalTransactionStatement;\n var TradeCategory = (function () {\n function TradeCategory() {\n }\n return TradeCategory;\n }());\n Patersons.TradeCategory = TradeCategory;\n var CapitalTransaction = (function () {\n function CapitalTransaction() {\n }\n return CapitalTransaction;\n }());\n Patersons.CapitalTransaction = CapitalTransaction;\n var CapitalTransactionStatementComponent = (function () {\n function CapitalTransactionStatementComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/capitalTransactionStatement.component.html';\n this.controller = CapitalTransactionStatementController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return CapitalTransactionStatementComponent;\n }());\n Patersons.CapitalTransactionStatementComponent = CapitalTransactionStatementComponent;\n var CapitalTransactionStatementController = (function (_super) {\n __extends(CapitalTransactionStatementController, _super);\n function CapitalTransactionStatementController() {\n _super.apply(this, arguments);\n }\n return CapitalTransactionStatementController;\n }(Patersons.AbstractReportController));\n Patersons.CapitalTransactionStatementController = CapitalTransactionStatementController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var StandardLedgerReport = (function (_super) {\n __extends(StandardLedgerReport, _super);\n function StandardLedgerReport() {\n _super.apply(this, arguments);\n }\n return StandardLedgerReport;\n }(Patersons.AbstractReport));\n Patersons.StandardLedgerReport = StandardLedgerReport;\n var LedgerEntry = (function () {\n function LedgerEntry() {\n }\n return LedgerEntry;\n }());\n Patersons.LedgerEntry = LedgerEntry;\n var StandardLedgerReportComponent = (function () {\n function StandardLedgerReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/standardLedgerReport.component.html';\n this.controller = StandardLedgerReportController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return StandardLedgerReportComponent;\n }());\n Patersons.StandardLedgerReportComponent = StandardLedgerReportComponent;\n var StandardLedgerReportController = (function (_super) {\n __extends(StandardLedgerReportController, _super);\n function StandardLedgerReportController() {\n _super.apply(this, arguments);\n }\n return StandardLedgerReportController;\n }(Patersons.AbstractReportController));\n Patersons.StandardLedgerReportController = StandardLedgerReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var QuarterlyReportsListReport = (function (_super) {\n __extends(QuarterlyReportsListReport, _super);\n function QuarterlyReportsListReport() {\n _super.apply(this, arguments);\n }\n return QuarterlyReportsListReport;\n }(Patersons.AbstractReport));\n Patersons.QuarterlyReportsListReport = QuarterlyReportsListReport;\n var QuarterlyReportsListEntry = (function () {\n function QuarterlyReportsListEntry() {\n }\n return QuarterlyReportsListEntry;\n }());\n Patersons.QuarterlyReportsListEntry = QuarterlyReportsListEntry;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var TaxReportsListReport = (function (_super) {\n __extends(TaxReportsListReport, _super);\n function TaxReportsListReport() {\n _super.apply(this, arguments);\n }\n return TaxReportsListReport;\n }(Patersons.AbstractReport));\n Patersons.TaxReportsListReport = TaxReportsListReport;\n var TaxReportsListEntry = (function () {\n function TaxReportsListEntry() {\n }\n return TaxReportsListEntry;\n }());\n Patersons.TaxReportsListEntry = TaxReportsListEntry;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PerformanceReport = (function (_super) {\n __extends(PerformanceReport, _super);\n function PerformanceReport() {\n _super.apply(this, arguments);\n }\n return PerformanceReport;\n }(Patersons.AbstractReport));\n Patersons.PerformanceReport = PerformanceReport;\n var PerformanceReportComponent = (function () {\n function PerformanceReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/performanceReport.component.html';\n this.controller = PerformanceReportController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return PerformanceReportComponent;\n }());\n Patersons.PerformanceReportComponent = PerformanceReportComponent;\n var PerformanceReportController = (function (_super) {\n __extends(PerformanceReportController, _super);\n function PerformanceReportController() {\n _super.apply(this, arguments);\n }\n return PerformanceReportController;\n }(Patersons.AbstractReportController));\n Patersons.PerformanceReportController = PerformanceReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var PortfolioGraphComponent = (function () {\n function PortfolioGraphComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/portfolioGraph.component.html';\n this.controller = PortfolioGraphController;\n this.bindings = {\n account: '<',\n };\n }\n return PortfolioGraphComponent;\n }());\n Patersons.PortfolioGraphComponent = PortfolioGraphComponent;\n var PortfolioGraphController = (function () {\n function PortfolioGraphController($scope, portfolioService) {\n this.sectorOptions = {\n showLabel: false,\n donut: true,\n donutWidth: 45\n };\n this.assetClassOptions = {\n showLabel: false,\n donut: true,\n donutWidth: 45\n };\n this.portfolioService = portfolioService;\n this.activeToggle = \"sector\";\n this.getTopSectors();\n }\n PortfolioGraphController.prototype.toggleActive = function (toggle) {\n this.activeToggle = toggle;\n this.getTopSectors();\n };\n PortfolioGraphController.prototype.extractSeriesData = function (results) {\n if (results.length == 0) {\n var emptyData = [100];\n var emptyLabels = new Array();\n emptyLabels.push({ name: \"Unknown\", value: 100 });\n emptyLabels.push({ name: \"--\", value: 0 });\n emptyLabels.push({ name: \"--\", value: 0 });\n emptyLabels.push({ name: \"--\", value: 0 });\n emptyLabels.push({ name: \"--\", value: 0 });\n return {\n data: emptyData,\n labels: emptyLabels\n };\n }\n else {\n var total = 0;\n for (var i = 0; i < results.length; i++) {\n total = total + results[i].count;\n }\n var seriesData = new Array();\n var labelData = [];\n for (var i = 0; i < results.length; i++) {\n var percentage = (results[i].count / total) * 100;\n var roundedPercentage = Math.round(percentage * 100000) / 100000;\n seriesData.push(roundedPercentage);\n var label = {};\n label.name = results[i].sectorName;\n label.value = roundedPercentage.toFixed(2);\n labelData.push(label);\n }\n console.log;\n return {\n data: seriesData,\n labels: labelData\n };\n }\n };\n PortfolioGraphController.prototype.getSectorDataPromise = function () {\n if (this.account.accountType === 'Standard') {\n switch (this.activeToggle) {\n case \"assetClass\":\n return this.portfolioService.getTopAssetClass(this.account.accountId);\n case \"sector\":\n return this.portfolioService.getTopSectors(this.account.accountId);\n }\n }\n else {\n switch (this.activeToggle) {\n case \"assetClass\":\n return this.portfolioService.getAccoladeTopAssetClass(this.account.accountId);\n case \"sector\":\n return this.portfolioService.getAccoladeTopSectors(this.account.accountId);\n }\n }\n };\n PortfolioGraphController.prototype.getTopSectors = function () {\n var _this = this;\n if (this.activeToggle === \"assetClass\" && this.assetClassData !== undefined ||\n this.activeToggle === \"sector\" && this.sectorData !== undefined) {\n return;\n }\n this.summaryLoaded = false;\n this.summaryError = false;\n var promise = this.getSectorDataPromise();\n promise.then(function (results) {\n var data = _this.extractSeriesData(results);\n switch (_this.activeToggle) {\n case \"assetClass\":\n _this.assetClassData = {\n series: data.data\n };\n _this.assetClassLabels = data.labels;\n _this.assetClassError = false;\n break;\n case \"sector\":\n _this.sectorData = {\n series: data.data\n };\n _this.sectorLabels = data.labels;\n _this.sectorsError = false;\n break;\n }\n _this.summaryError = false;\n _this.summaryLoaded = true;\n }, function (reason) {\n _this.sectorsError = true;\n _this.summaryError = true;\n _this.summaryLoaded = true;\n });\n };\n PortfolioGraphController.$inject = ['$scope', 'portfolioService'];\n return PortfolioGraphController;\n }());\n Patersons.PortfolioGraphController = PortfolioGraphController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var RealisedCapitalGainsReport = (function (_super) {\n __extends(RealisedCapitalGainsReport, _super);\n function RealisedCapitalGainsReport() {\n _super.apply(this, arguments);\n }\n return RealisedCapitalGainsReport;\n }(Patersons.AbstractReport));\n Patersons.RealisedCapitalGainsReport = RealisedCapitalGainsReport;\n var RealisedCapitalGainsAssetClass = (function () {\n function RealisedCapitalGainsAssetClass() {\n }\n return RealisedCapitalGainsAssetClass;\n }());\n Patersons.RealisedCapitalGainsAssetClass = RealisedCapitalGainsAssetClass;\n var RealisedCapitalGainsAsset = (function () {\n function RealisedCapitalGainsAsset() {\n }\n return RealisedCapitalGainsAsset;\n }());\n Patersons.RealisedCapitalGainsAsset = RealisedCapitalGainsAsset;\n var RealisedCapitalGain = (function () {\n function RealisedCapitalGain() {\n }\n return RealisedCapitalGain;\n }());\n Patersons.RealisedCapitalGain = RealisedCapitalGain;\n var RealisedCapitalGainsReportComponent = (function () {\n function RealisedCapitalGainsReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/realisedCapitalGainsReport.component.html';\n this.controller = RealisedCapitalGainsReportController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return RealisedCapitalGainsReportComponent;\n }());\n Patersons.RealisedCapitalGainsReportComponent = RealisedCapitalGainsReportComponent;\n var RealisedCapitalGainsReportController = (function (_super) {\n __extends(RealisedCapitalGainsReportController, _super);\n function RealisedCapitalGainsReportController() {\n _super.apply(this, arguments);\n }\n return RealisedCapitalGainsReportController;\n }(Patersons.AbstractReportController));\n Patersons.RealisedCapitalGainsReportController = RealisedCapitalGainsReportController;\n})(Patersons || (Patersons = {}));\n\n\"use strict\";\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var MarketValue = (function () {\n function MarketValue() {\n }\n return MarketValue;\n }());\n Patersons.MarketValue = MarketValue;\n var MarketValueReport = (function (_super) {\n __extends(MarketValueReport, _super);\n function MarketValueReport() {\n _super.apply(this, arguments);\n }\n return MarketValueReport;\n }(Patersons.AbstractReport));\n Patersons.MarketValueReport = MarketValueReport;\n var MarketValueReportComponent = (function () {\n function MarketValueReportComponent() {\n this.templateUrl = \"assets/templates/portfolioSummary/components/marketValueReport.component.html\";\n this.controller = MarketValueReportController;\n this.bindings = {\n account: \"<\",\n displayTitle: \"@\",\n asAt: \"<\"\n };\n }\n return MarketValueReportComponent;\n }());\n Patersons.MarketValueReportComponent = MarketValueReportComponent;\n var MarketValueReportController = (function (_super) {\n __extends(MarketValueReportController, _super);\n function MarketValueReportController($scope, $rootScope, userCompanyService, reportService) {\n var _this = this;\n _super.call(this);\n this.getMarketValueReport = function () {\n var _this = this;\n this.scope.isMarketValueError = false;\n this.scope.hasMarketValueData = false;\n if (this.account == undefined) {\n return;\n }\n this.scope.isMarketValueLoading = true;\n this.reportService\n .getReport(Patersons.ReportType.MarketValue, this.account.accountId, this.scope.fromDate, this.scope.toDate)\n .then(function (result) {\n _this.scope.marketValueReport = result;\n _this.buildChartData();\n _this.scope.hasMarketValueData = true;\n _this.scope.isMarketValueError = false;\n _this.scope.loadedOnce = true;\n }, function (error) {\n // error handling\n _this.scope.marketValueReport = null;\n _this.scope.isMarketValueError = true;\n _this.scope.hasMarketValueData = false;\n })\n .finally(function () {\n _this.scope.isMarketValueLoading = false;\n });\n };\n this.scope = $scope;\n this.$rootScope = $rootScope;\n this.scope.events = this;\n this.userCompanyService = userCompanyService;\n this.reportService = reportService;\n this.scope.fromDate = moment(this.asAt).add(-1, \"Y\").toDate();\n this.scope.toDate = moment(this.asAt).toDate();\n this.scope.selectedPeriod = \"1Y\";\n this.scope.periodFilter = [\n {\n id: \"ALL\",\n text: \"All\",\n fromDate: moment(this.asAt).add(-100, \"Y\").toDate(),\n toDate: moment(this.asAt).toDate(),\n unit: undefined\n },\n {\n id: \"5Y\",\n text: \"5Y\",\n fromDate: moment(this.asAt).add(-5, \"Y\").toDate(),\n toDate: moment(this.asAt).toDate(),\n unit: \"year\"\n },\n {\n id: \"1Y\",\n text: \"1Y\",\n fromDate: moment(this.asAt).add(-1, \"Y\").toDate(),\n toDate: moment(this.asAt).toDate(),\n unit: \"month\"\n },\n {\n id: \"6M\",\n text: \"6M\",\n fromDate: moment(this.asAt).add(-6, \"M\").toDate(),\n toDate: moment(this.asAt).toDate(),\n unit: \"month\"\n },\n {\n id: \"1M\",\n text: \"1M\",\n fromDate: moment(this.asAt).add(-1, \"M\").toDate(),\n toDate: moment(this.asAt).toDate(),\n unit: \"day\"\n },\n ];\n this.scope.chartOptions = {\n maintainAspectRatio: false,\n tooltips: {\n mode: \"index\",\n intersect: false,\n backgroundColor: '#FFF',\n titleFontSize: 16,\n titleFontColor: '#000',\n bodyFontColor: '#000',\n xPadding: 10,\n yPadding: 10,\n caretSize: 0,\n caretPadding: 10,\n titleSpacing: 4,\n cornerRadius: 0,\n bodyFontSize: 14,\n displayColors: false,\n callbacks: {\n label: function (tooltipItem, data) {\n return tooltipItem.yLabel.toLocaleString(\"en-AU\", {\n style: \"currency\",\n currency: \"AUD\",\n });\n },\n },\n },\n elements: {\n point: {\n radius: 0,\n },\n line: {\n tension: 0,\n fill: false,\n },\n },\n scales: {\n yAxes: [\n {\n ticks: {\n maxTicksLimit: 6,\n callback: function (value, index, values) {\n return value.toLocaleString(\"en-AU\", {\n style: \"currency\",\n currency: \"AUD\",\n });\n },\n },\n },\n ],\n xAxes: [\n {\n type: \"time\",\n time: {\n unit: \"month\",\n minUnit: \"day\",\n tooltipFormat: \"DD MMMM YYYY\",\n displayFormats: {\n quarter: \"MMM YYYY\",\n },\n },\n },\n ],\n },\n };\n this.scope.datasetOverride = [\n {\n type: \"LineWithLine\",\n },\n ];\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n if (company.enableFeature) {\n _this.load();\n }\n });\n }\n MarketValueReportController.prototype.load = function () {\n this.getMarketValueReport();\n };\n MarketValueReportController.prototype.setFromDate = function (selectedDate) {\n this.scope.fromDate = selectedDate;\n this.scope.selectedPeriod = null;\n this.getMarketValueReport();\n };\n MarketValueReportController.prototype.setToDate = function (selectedDate) {\n this.scope.toDate = selectedDate;\n this.scope.selectedPeriod = null;\n this.getMarketValueReport();\n };\n MarketValueReportController.prototype.setSelectedPeriod = function (selectedPeriod) {\n this.scope.toDate = selectedPeriod.toDate;\n this.scope.fromDate = selectedPeriod.fromDate;\n this.scope.selectedPeriod = selectedPeriod.id;\n this.scope.chartOptions.scales.xAxes[0].time.unit = selectedPeriod.unit;\n this.getMarketValueReport();\n };\n MarketValueReportController.prototype.buildChartData = function () {\n this.scope.chartSeries = [\"Market Value for \" + this.account.accountId];\n var seriesData = this.scope.marketValueReport.marketValuation.map(function (element) {\n return {\n x: moment(element.date).toDate(),\n y: element.value,\n };\n });\n if (this.scope.selectedPeriod === \"ALL\") {\n if (seriesData.length > 365) {\n this.scope.chartOptions.scales.xAxes[0].time.unit = \"year\";\n }\n else {\n this.scope.chartOptions.scales.xAxes[0].time.unit = \"month\";\n }\n }\n this.scope.chartData = [seriesData];\n };\n MarketValueReportController.$inject = [\n \"$scope\",\n \"$rootScope\",\n \"userCompanyService\",\n \"reportService\",\n ];\n return MarketValueReportController;\n }(Patersons.AbstractReportController));\n Patersons.MarketValueReportController = MarketValueReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var UnrealisedCapitalGainsReport = (function (_super) {\n __extends(UnrealisedCapitalGainsReport, _super);\n function UnrealisedCapitalGainsReport() {\n _super.apply(this, arguments);\n }\n return UnrealisedCapitalGainsReport;\n }(Patersons.AbstractReport));\n Patersons.UnrealisedCapitalGainsReport = UnrealisedCapitalGainsReport;\n var UnrealisedCapitalGainsAssetClass = (function () {\n function UnrealisedCapitalGainsAssetClass() {\n }\n return UnrealisedCapitalGainsAssetClass;\n }());\n Patersons.UnrealisedCapitalGainsAssetClass = UnrealisedCapitalGainsAssetClass;\n var UnrealisedCapitalGainsAsset = (function () {\n function UnrealisedCapitalGainsAsset() {\n }\n return UnrealisedCapitalGainsAsset;\n }());\n Patersons.UnrealisedCapitalGainsAsset = UnrealisedCapitalGainsAsset;\n var UnrealisedCapitalGain = (function () {\n function UnrealisedCapitalGain() {\n }\n return UnrealisedCapitalGain;\n }());\n Patersons.UnrealisedCapitalGain = UnrealisedCapitalGain;\n var UnrealisedCapitalGainsReportComponent = (function () {\n function UnrealisedCapitalGainsReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/unrealisedCapitalGainsReport.component.html';\n this.controller = UnrealisedCapitalGainsReportController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return UnrealisedCapitalGainsReportComponent;\n }());\n Patersons.UnrealisedCapitalGainsReportComponent = UnrealisedCapitalGainsReportComponent;\n var UnrealisedCapitalGainsReportController = (function (_super) {\n __extends(UnrealisedCapitalGainsReportController, _super);\n function UnrealisedCapitalGainsReportController() {\n _super.apply(this, arguments);\n }\n return UnrealisedCapitalGainsReportController;\n }(Patersons.AbstractReportController));\n Patersons.UnrealisedCapitalGainsReportController = UnrealisedCapitalGainsReportController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var TermDepositsHoldingsReport = (function () {\n function TermDepositsHoldingsReport() {\n }\n return TermDepositsHoldingsReport;\n }());\n Patersons.TermDepositsHoldingsReport = TermDepositsHoldingsReport;\n var TermDepositsHoldingsReportComponent = (function () {\n function TermDepositsHoldingsReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/termDepositsReport.component.html';\n this.bindings = {\n report: '<',\n predicate: '<',\n sortOrder: '<',\n searchText: '<',\n onOrderChanged: '&'\n };\n }\n return TermDepositsHoldingsReportComponent;\n }());\n Patersons.TermDepositsHoldingsReportComponent = TermDepositsHoldingsReportComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var CashHoldingsReport = (function () {\n function CashHoldingsReport() {\n }\n return CashHoldingsReport;\n }());\n Patersons.CashHoldingsReport = CashHoldingsReport;\n var CashHolding = (function () {\n function CashHolding() {\n }\n CashHolding.prototype.hasData = function () {\n return ((typeof this.instituteCode != 'undefined' && this.instituteCode) ||\n (typeof this.accountName != 'undefined' && this.accountName) ||\n (typeof this.type != 'undefined' && this.type) ||\n (typeof this.balance != 'undefined' && this.balance));\n };\n return CashHolding;\n }());\n Patersons.CashHolding = CashHolding;\n var CashHoldingsReportComponent = (function () {\n function CashHoldingsReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/cashHoldingsReport.component.html';\n this.bindings = {\n title: '@',\n report: '<',\n predicate: '<',\n sortOrder: '<',\n searchText: '<',\n onOrderChanged: '&'\n };\n }\n return CashHoldingsReportComponent;\n }());\n Patersons.CashHoldingsReportComponent = CashHoldingsReportComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var CashHighInterestHoldingsReportComponent = (function () {\n function CashHighInterestHoldingsReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/cashHighInterestHoldingsReport.component.html';\n this.bindings = {\n title: '@',\n report: '<',\n predicate: '<',\n sortOrder: '<',\n searchText: '<',\n onOrderChanged: '&'\n };\n }\n return CashHighInterestHoldingsReportComponent;\n }());\n Patersons.CashHighInterestHoldingsReportComponent = CashHighInterestHoldingsReportComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var EquityHoldingsReport = (function () {\n function EquityHoldingsReport() {\n }\n return EquityHoldingsReport;\n }());\n Patersons.EquityHoldingsReport = EquityHoldingsReport;\n var EquityHolding = (function () {\n function EquityHolding() {\n }\n EquityHolding.prototype.hasData = function () {\n return ((typeof this.securityCode != 'undefined' && this.securityCode) ||\n (typeof this.companyName != 'undefined' && this.companyName) ||\n (typeof this.quantity != 'undefined' && this.quantity) ||\n (typeof this.averageCost != 'undefined' && this.averageCost) ||\n (typeof this.lastPrice != 'undefined' && this.lastPrice) ||\n (typeof this.averageCost != 'undefined' && this.averageCost) ||\n (typeof this.totalCost != 'undefined' && this.totalCost) ||\n (typeof this.marketValue != 'undefined' && this.marketValue) ||\n (typeof this.profitOrLoss != 'undefined' && this.profitOrLoss) ||\n (typeof this.dividendPerShare != 'undefined' && this.dividendPerShare) ||\n (typeof this.frankedAmount != 'undefined' && this.frankedAmount) ||\n (typeof this.income != 'undefined' && this.income) ||\n (typeof this.yield != 'undefined' && this.yield) ||\n (typeof this.priceToEarnings != 'undefined' && this.priceToEarnings));\n };\n return EquityHolding;\n }());\n Patersons.EquityHolding = EquityHolding;\n var EquityHoldingsReportComponent = (function () {\n function EquityHoldingsReportComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/equityHoldingsReport.component.html';\n this.controller = EquityHoldingsReportComponentController;\n this.bindings = {\n title: '@',\n report: '<',\n isInternational: '<',\n predicate: '<',\n sortOrder: '<',\n searchText: '<',\n onOrderChanged: '&'\n };\n }\n return EquityHoldingsReportComponent;\n }());\n Patersons.EquityHoldingsReportComponent = EquityHoldingsReportComponent;\n var EquityHoldingsReportComponentController = (function (_super) {\n __extends(EquityHoldingsReportComponentController, _super);\n function EquityHoldingsReportComponentController($scope, $rootScope, morningStarService, userCompanyService) {\n var _this = this;\n _super.call(this);\n this.scope = $scope;\n this.$rootScope = $rootScope;\n this.scope.events = this;\n this.morningStarService = morningStarService;\n this.userCompanyService = userCompanyService;\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n if (company.enableFeature) {\n _this.load();\n }\n });\n }\n EquityHoldingsReportComponentController.prototype.load = function () {\n var _this = this;\n var codes = [];\n this.report.holdings.forEach(function (report) {\n _this.morningStarService.getMorningStarDataForSecurityCode(report.exchange, report.securityCode).then(function (res) {\n if (res) {\n var elem = $('td:first-child:not(:has(a))').filter(function () {\n return $(this).text().trim() === report.securityCode;\n }).first();\n var openURL = '';\n var secId = res.FundShareClassId;\n openURL = mapHoldingTypeIdToReportURL(res.holdingTypeId);\n if (openURL) {\n openURL += '#/' + secId;\n elem.html('' + report.securityCode + '');\n elem.next().html('' + elem.next().text() + '');\n }\n }\n });\n });\n };\n EquityHoldingsReportComponentController.$inject = ['$scope', '$rootScope', 'morningStarService', 'userCompanyService'];\n return EquityHoldingsReportComponentController;\n }(Patersons.AbstractReportController));\n Patersons.EquityHoldingsReportComponentController = EquityHoldingsReportComponentController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var TotalMarketValueComponent = (function () {\n function TotalMarketValueComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/totalMarketValue.component.html';\n this.bindings = {\n marketValue: '@'\n };\n }\n return TotalMarketValueComponent;\n }());\n Patersons.TotalMarketValueComponent = TotalMarketValueComponent;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ValuationStatement = (function (_super) {\n __extends(ValuationStatement, _super);\n function ValuationStatement() {\n _super.apply(this, arguments);\n }\n return ValuationStatement;\n }(Patersons.AbstractReport));\n Patersons.ValuationStatement = ValuationStatement;\n var AssetCategory = (function () {\n function AssetCategory() {\n }\n return AssetCategory;\n }());\n Patersons.AssetCategory = AssetCategory;\n var ValuationStatementAsset = (function () {\n function ValuationStatementAsset() {\n }\n return ValuationStatementAsset;\n }());\n Patersons.ValuationStatementAsset = ValuationStatementAsset;\n var UnsettledDividends = (function () {\n function UnsettledDividends() {\n }\n return UnsettledDividends;\n }());\n Patersons.UnsettledDividends = UnsettledDividends;\n var UnsettledDividend = (function () {\n function UnsettledDividend() {\n }\n return UnsettledDividend;\n }());\n Patersons.UnsettledDividend = UnsettledDividend;\n var ValuationStatementComponent = (function () {\n function ValuationStatementComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/valuationStatement.component.html';\n this.controller = ValuationStatementController;\n this.bindings = {\n report: '<',\n title: '@'\n };\n }\n return ValuationStatementComponent;\n }());\n Patersons.ValuationStatementComponent = ValuationStatementComponent;\n var sortFunds = function (a, b) { return a.code && a.code.localeCompare(b.code, undefined, { numeric: true }); };\n var extractManagedFunds = function (items) {\n var managedFunds = items.filter(function (element) {\n return element.exchangeCode === \"FND\";\n }).sort(sortFunds);\n var unlisted = items.filter(function (element) {\n return element.exchangeCode === \"UNL\";\n }).sort(sortFunds);\n var everythingElse = items.filter(function (element) {\n return [\"FND\", \"UNL\"].indexOf(element.exchangeCode) === -1;\n }).sort(sortFunds);\n return everythingElse.concat(managedFunds, unlisted);\n };\n var ValuationStatementController = (function (_super) {\n __extends(ValuationStatementController, _super);\n function ValuationStatementController($scope, $rootScope, morningStarService, userCompanyService) {\n var _this = this;\n _super.call(this);\n this.toggleManagedAccount = function (key, managedAccountIndex) {\n _this.report.managedAccounts[key].items[managedAccountIndex].expanded = !_this.report.managedAccounts[key].items[managedAccountIndex].expanded;\n };\n this.scope = $scope;\n this.$rootScope = $rootScope;\n this.scope.events = this;\n this.morningStarService = morningStarService;\n this.userCompanyService = userCompanyService;\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n if (company.enableFeature) {\n _this.load();\n }\n });\n }\n ValuationStatementController.prototype.load = function () {\n var _this = this;\n var codes = [];\n this.report.nonLoaSecurities.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n code: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n category.items = extractManagedFunds(category.items);\n });\n Object.keys(this.report.managedAccounts).forEach(function (key) {\n var sortedItem = _this.report.managedAccounts[key].items.sort(function (a, b) { return a.categoryName.localeCompare(b.categoryName); });\n var first = \"CG Large Cap Australian Equity Portfolio\";\n sortedItem.forEach(function (item, i) {\n if (item.categoryName === first) {\n sortedItem.splice(i, 1);\n sortedItem.unshift(item);\n }\n });\n _this.report.managedAccounts[key].items = sortedItem;\n _this.report.managedAccounts[key].items.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n code: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n category.items = extractManagedFunds(category.items);\n });\n });\n this.report.loaSecurities.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n code: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n category.items = extractManagedFunds(category.items);\n });\n this.report.nonLoaUnsettledDividends.items.forEach(function (unsettledDividend) {\n codes.push({\n code: unsettledDividend.code,\n exchangeCode: unsettledDividend.exchangeCode\n });\n _this.report.nonLoaUnsettledDividends.items = extractManagedFunds(_this.report.nonLoaUnsettledDividends.items);\n });\n this.report.loaUnsettledDividends.items.forEach(function (unsettledDividend) {\n codes.push({\n code: unsettledDividend.code,\n exchangeCode: unsettledDividend.exchangeCode\n });\n _this.report.loaUnsettledDividends.items = extractManagedFunds(_this.report.loaUnsettledDividends.items);\n });\n codes = codes.filter(function (value, index, self) { return self.indexOf(value) === index; });\n codes.forEach(function (code) {\n _this.morningStarService.getMorningStarDataForSecurityCode(code.exchangeCode, code.code).then(function (res) {\n if (res) {\n var elem = $('td:first-child:not(:has(a))').filter(function () {\n return $(this).text().trim() === code.code;\n }).first();\n var openURL = '';\n var secId = res.FundShareClassId;\n openURL = mapHoldingTypeIdToReportURL(res.holdingTypeId);\n if (openURL) {\n openURL += '#/' + secId;\n elem.html('' + code.code + '');\n elem.siblings('.has-data-link').each(function () {\n var child = $(this);\n child.html('' + child.text() + '');\n });\n }\n }\n });\n });\n };\n ValuationStatementController.$inject = ['$scope', '$rootScope', 'morningStarService', 'userCompanyService'];\n return ValuationStatementController;\n }(Patersons.AbstractReportController));\n Patersons.ValuationStatementController = ValuationStatementController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var PortfolioNavigationComponent = (function () {\n function PortfolioNavigationComponent() {\n this.templateUrl = 'assets/templates/portfolioSummary/components/portfolioNavigation.component.html';\n this.controller = PortfolioNavigationController;\n this.bindings = {\n key: '@'\n };\n }\n return PortfolioNavigationComponent;\n }());\n Patersons.PortfolioNavigationComponent = PortfolioNavigationComponent;\n var PortfolioNavigationController = (function () {\n function PortfolioNavigationController($scope, $location, $state, $stateParams, userCompanyService) {\n var _this = this;\n this.$ctrl = this;\n this.scope = $scope;\n this.scope.events = this;\n this.scope.menuOpen = false;\n this.userCompanyService = userCompanyService;\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n _this.initOptions();\n });\n }\n PortfolioNavigationController.prototype.initOptions = function () {\n var items = [];\n items.push({\n key: \"holdings\",\n title: \"Holdings\",\n });\n if (this.scope.userCompany.isDefault) {\n items.push({\n key: \"portfolioSnapshot\",\n title: \"Snapshot\",\n });\n items.push({\n key: \"portfolioHeatmap\",\n title: \"Heatmap\",\n });\n items.push({\n key: \"marketOrders\",\n title: \"Orders\",\n });\n }\n items.push({\n key: \"ledger\",\n title: \"Ledger\",\n });\n items.push({\n key: \"confirmationNotes\",\n title: \"Contract Notes\",\n });\n items.push({\n key: \"report\",\n title: \"Accolade Portfolio Service\",\n });\n this.scope.items = items;\n };\n PortfolioNavigationController.prototype.toggleMenu = function () {\n this.scope.menuOpen = !this.scope.menuOpen;\n };\n PortfolioNavigationController.$inject = ['$scope', '$location', '$state', '$stateParams', 'userCompanyService'];\n return PortfolioNavigationController;\n }());\n Patersons.PortfolioNavigationController = PortfolioNavigationController;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PortfolioBaseCtrl = (function (_super) {\n __extends(PortfolioBaseCtrl, _super);\n function PortfolioBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.deactivateAll();\n this.navigationService.activateSection('portfolio');\n if ($location.$$path.indexOf('marketDepth') !== -1)\n this.navigationService.activateSection('analysis');\n if ($location.$$path.indexOf('stockReport') !== -1)\n this.navigationService.activateSection('research');\n }\n PortfolioBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return PortfolioBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.PortfolioBaseCtrl = PortfolioBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PlaceOrderRequestViewCtrl = (function (_super) {\n __extends(PlaceOrderRequestViewCtrl, _super);\n function PlaceOrderRequestViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, placeOrderRequestService, portfolioService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.portfolioService = portfolioService;\n this.scope.parentController = this;\n this.scope.events = this;\n this.scope.isSubmitted = false;\n var accountId = $stateParams.accountId;\n this.clearOrderRequestForm();\n }\n PlaceOrderRequestViewCtrl.prototype.placeOrderRequest = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.orderRequestForm.$invalid) {\n return;\n }\n var promise = this.portfolioService.placeOrderRequest(this.scope.order);\n promise.then(function (result) {\n _this.scope.isSubmitted = true;\n return;\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n });\n };\n PlaceOrderRequestViewCtrl.prototype.viewOrderRequests = function () {\n this.location.path('/viewOrderRequests');\n };\n PlaceOrderRequestViewCtrl.prototype.clearOrderRequestForm = function () {\n this.scope.order = new Patersons.OrderRequest();\n };\n PlaceOrderRequestViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService'];\n return PlaceOrderRequestViewCtrl;\n }(Patersons.AbstractController));\n Patersons.PlaceOrderRequestViewCtrl = PlaceOrderRequestViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ViewOrderRequestsViewCtrl = (function (_super) {\n __extends(ViewOrderRequestsViewCtrl, _super);\n function ViewOrderRequestsViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.order = function (predicate) {\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\n this.scope.predicate = predicate;\n };\n this.cancelOrder = function (orderToCancel) {\n this.createCancelOrder(orderToCancel);\n };\n this.scope = $scope;\n this.portfolioService = portfolioService;\n this.scope.parentController = this;\n this.scope.events = this;\n this.scope.isError = false;\n this.scope.isSubmitted = false;\n this.getOrderRequests();\n }\n ViewOrderRequestsViewCtrl.prototype.getOrderRequests = function () {\n var _this = this;\n var promise = this.portfolioService.getOrderRequests();\n promise.then(function (result) {\n _this.scope.investorOrders = result.data.value;\n }, function (reason) {\n _this.portfolioService.errorHandler = reason.data;\n });\n };\n ViewOrderRequestsViewCtrl.prototype.createCancelOrder = function (order) {\n var _this = this;\n var cancelOrder = new Patersons.OrderRequest();\n cancelOrder.orderAction = \"Cancel\";\n cancelOrder.portfolioId = order.portfolioId;\n cancelOrder.price = order.price;\n cancelOrder.securityCode = order.securityCode;\n cancelOrder.volume = order.volume;\n cancelOrder.requestDateTime = new Date();\n cancelOrder.buyAtMarketRate = true;\n cancelOrder.orderNumber = order.id;\n var promise = this.portfolioService.createCancelOrder(cancelOrder);\n promise.then(function (result) {\n _this.scope.isSubmitted = result.status == 200;\n _this.scope.isError = false;\n _this.getOrderRequests();\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.isSubmitted = false;\n });\n };\n ViewOrderRequestsViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService'];\n return ViewOrderRequestsViewCtrl;\n }(Patersons.AbstractController));\n Patersons.ViewOrderRequestsViewCtrl = ViewOrderRequestsViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PortfolioDashboardCtrl = (function (_super) {\n __extends(PortfolioDashboardCtrl, _super);\n function PortfolioDashboardCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, bannerService, selectionService, navigationService, reportService, newsService, researchFeedService, sessionService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.portfolioService = portfolioService;\n this.selectionService = selectionService;\n this.navigationService = navigationService;\n this.reportService = reportService;\n this.researchFeedService = researchFeedService;\n this.scope.isLoading = false;\n this.bannerService = bannerService;\n this.newsService = newsService;\n this.filter = $filter;\n this.sessionService = sessionService;\n this.scope.events = this;\n this.scope.headerError = false;\n this.scope.hasNotifications = false;\n this.scope.isLoggedIn = this.sessionService.isLoggedIn();\n // this.getBanner();\n this.getNews();\n // this.getLatestMorningMarket();\n this.getPortfolioData();\n this.getAccoladeNotifications();\n this.navigationService.deactivateAll();\n this.navigationService.activateSection('dashboard');\n if (this.scope.isLoggedIn) {\n //console.log('loadAdviserData');\n this.scope.profile = this.sessionService.getCurrentUserProfile();\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n }\n }\n PortfolioDashboardCtrl.prototype.getAccoladeNotifications = function () {\n var _this = this;\n var promise = this.reportService.getAllAccoladeNotifications();\n promise.then(function (result) {\n console.log(result);\n if (result.length == 1) {\n _this.scope.notificationText = \"A new \" + result[0].type + \" is available. \";\n _this.scope.hasNotifications = true;\n _this.scope.notificationLink = result[0].link;\n _this.scope.notificationStateLink = null;\n }\n else if (result.length > 0) {\n var firstReportType_1 = result[0].type;\n var allSame = result.every(function (item) {\n return item.type == firstReportType_1;\n });\n if (allSame) {\n _this.scope.notificationText = result.length + \" new \" + firstReportType_1 + \"s are available.\";\n }\n else {\n _this.scope.notificationText = result.length + \" new Accolade Reports are available.\";\n }\n switch (firstReportType_1) {\n case \"Accolade Tax Report\":\n _this.scope.notificationStateLink = \"report.tax\";\n break;\n case \"Accolade Quarterly Report\":\n _this.scope.notificationStateLink = \"report.quarterly\";\n break;\n case \"Accolade Invoice\":\n _this.scope.notificationStateLink = \"report.invoices\";\n break;\n default:\n _this.scope.notificationStateLink = \"report\";\n break;\n }\n _this.scope.hasNotifications = true;\n _this.scope.notificationLink = null;\n }\n }, function (error) {\n console.log(\"processAccoladeNotifications error\");\n console.log(error);\n });\n };\n //https://gist.github.com/bronthulke/cac00b8857c886108069\n PortfolioDashboardCtrl.prototype.getFinancialYear = function (yearsBack) {\n var financialYearStart, financialYearEnd;\n if (moment().quarter() > 2) {\n financialYearStart = moment().month('July').startOf('month'); // this year's July\n financialYearEnd = moment().add(1, 'years').month('June').endOf('month'); // next year's June\n }\n else {\n financialYearStart = moment().subtract(1, \"years\").month('July').startOf('month'); // last year's July\n financialYearEnd = moment().month('June').endOf('month'); // this year's June\n }\n ;\n if (yearsBack != undefined) {\n financialYearStart = financialYearStart.subtract(yearsBack, \"years\");\n financialYearEnd = financialYearEnd.subtract(yearsBack, \"years\");\n }\n return { \"start\": financialYearStart.startOf('day'), \"end\": financialYearEnd.startOf('day') };\n };\n PortfolioDashboardCtrl.prototype.acknowledgeNotification = function () {\n var _this = this;\n var promise = this.reportService.acknowledgeAccoladeNotifications();\n promise.then(function (result) {\n if (_this.scope.notificationLink) {\n _this.window.location.href = _this.scope.notificationLink;\n }\n else {\n if (_this.scope.notificationStateLink) {\n _this.state.go(_this.scope.notificationStateLink);\n }\n }\n }, function (error) {\n alert(\"Error acknowledging notifications. Please try again\");\n console.log(\"acknowledgeNotification error\");\n console.log(error);\n });\n };\n PortfolioDashboardCtrl.prototype.getNews = function () {\n var _this = this;\n this.scope.isNewsLoading = true;\n var newsCampaignParams = {\n utm_source: 'client_portal',\n utm_medium: 'dashboard_news'\n };\n var max_news = 4;\n var promise = this.newsService.getNews();\n promise.then(function (result) {\n if (result) {\n var newsConfig = result['news'];\n newsConfig = newsConfig.slice(0, max_news);\n newsConfig = newsConfig.map(function (element, index) {\n if (element.link && element.link.indexOf('http://') !== 0 && element.link.indexOf('https://') !== 0) {\n element.link = 'http://' + element.link;\n }\n var utmQuery = '';\n Object.keys(newsCampaignParams).forEach(function (key, index, all) {\n utmQuery = utmQuery + key + \"=\" + newsCampaignParams[key] + (index !== all.length - 1 ? \"&\" : '');\n });\n utmQuery = utmQuery + \"&utm_campaign=\" + element.title;\n if (element.link.indexOf('?') === -1) {\n element.link = element.link + \"?\" + utmQuery;\n }\n else {\n var lastChar = element.link.substr(element.link.length - 1);\n if (lastChar == \"&\") {\n element.link = element.link + utmQuery;\n }\n {\n element.link = element.link + \"&\" + utmQuery;\n }\n }\n return element;\n });\n _this.scope.newsConfig = newsConfig;\n setTimeout(function () {\n $('.clampThis').each(function (index, element) {\n $clamp(element, { clamp: 4, useNativeClamp: true });\n });\n }, 500);\n }\n }, function (error) {\n })\n .finally(function () {\n _this.scope.isNewsLoading = false;\n });\n };\n PortfolioDashboardCtrl.prototype.getLatestMorningMarket = function () {\n var _this = this;\n this.scope.isMorningMarketLoading = true;\n var promise = this.researchFeedService.getLatestMorningMarket();\n promise.then(function (result) {\n if (result) {\n _this.scope.latestMorningMarket = result;\n }\n }, function (error) {\n _this.scope.latestMorningMarket = null;\n })\n .finally(function () {\n _this.scope.isMorningMarketLoading = false;\n });\n };\n PortfolioDashboardCtrl.prototype.getBanner = function () {\n var _this = this;\n this.scope.isBannerLoading = true;\n var promise = this.bannerService.getCurrent();\n promise.then(function (result) {\n if (result && result[0]) {\n var bannerConfig = result[0];\n var buttonUrl = bannerConfig.buttonUrl.toLowerCase();\n if (buttonUrl.indexOf('http://') !== 0 && buttonUrl.indexOf('https://') !== 0) {\n bannerConfig.buttonUrl = 'http://' + bannerConfig.buttonUrl;\n }\n _this.scope.bannerConfig = bannerConfig;\n }\n else {\n _this.scope.bannerConfig = new Patersons.Banner();\n _this.scope.bannerConfig.isHidden = true;\n }\n }, function (error) {\n _this.scope.bannerConfig = new Patersons.Banner();\n _this.scope.bannerConfig.isHidden = true;\n })\n .finally(function () {\n _this.scope.isBannerLoading = false;\n });\n };\n PortfolioDashboardCtrl.prototype.goToEOFYStatement = function (accountId) {\n var previousFY = this.getFinancialYear(1);\n this.state.go(\"holdings\", {\n accountId: accountId,\n autoDownloadPDF: true,\n asAt: previousFY.end.toDate()\n });\n };\n PortfolioDashboardCtrl.prototype.getPortfolioData = function () {\n var _this = this;\n this.scope.isLoading = true;\n console.log(this.scope.isLoading);\n var promise = this.portfolioService.getCombinedPortfolioData();\n promise.then(function (result) {\n _this.scope.investorPortfolios = result;\n for (var i = 0; i < _this.scope.investorPortfolios.length; i++) {\n _this.getPortfolioValue(_this.scope.investorPortfolios[i]); // error handling: --\n }\n _this.scope.isLoading = false;\n console.log(_this.scope.isLoading);\n }, function (reason) {\n _this.scope.isLoading = false;\n _this.portfolioService.errorHandler = reason.data;\n });\n };\n PortfolioDashboardCtrl.prototype.getPortfolioValue = function (account) {\n var promise = this.portfolioService.getPortfolioValue(account);\n promise.then(function (result) {\n if (result) {\n account.totalMovementToday = result.currentMovementValue;\n account.totalMovementPercentage = result.currentMovementPercent;\n account.totalHoldingsValue = result.currentValue;\n account.headerLoaded = true;\n }\n }, function (error) {\n account.totalMovementToday = undefined;\n account.totalMovementPercentage = undefined;\n account.totalHoldingsValue = undefined;\n //this.scope.headerError = true;\n account.headerLoaded = true;\n });\n };\n PortfolioDashboardCtrl.prototype.goToPorfolioOverview = function (accountId) {\n this.selectionService.selectedAccountId = accountId;\n this.state.go(\"viewPortfolio\");\n };\n PortfolioDashboardCtrl.prototype.goToHoldings = function (accountId) {\n this.selectionService.selectedAccountId = accountId;\n this.state.go(\"holdings\");\n };\n PortfolioDashboardCtrl.prototype.getAccount = function (accountId) {\n var accounts = this.scope.investorPortfolios.filter(function (x) { return x.accountId == accountId; });\n if (accounts) {\n return accounts[0];\n }\n return null;\n };\n PortfolioDashboardCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'bannerService', 'selectionService', 'navigationService', 'reportService', 'newsService', 'researchFeedService', 'sessionService', 'userCompanyService'];\n return PortfolioDashboardCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.PortfolioDashboardCtrl = PortfolioDashboardCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PortfolioSnapshotCtrl = (function (_super) {\n __extends(PortfolioSnapshotCtrl, _super);\n function PortfolioSnapshotCtrl($scope, $q, $log, $location, $window, $state, $stateParams, $http, $rootScope, reportService, reportDownloadService, portfolioService, navigationService, morningStarService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.getPortfolioSnapshot = function () {\n // if(this.scope.isLoading){\n // return;\n // }\n this.scope.isError = false;\n this.scope.hasData = false;\n this.scope.isLoading = true;\n this.loadPortfolioSnapshot();\n };\n this.scope = $scope;\n this.q = $q;\n this.scope.events = this;\n this.portfolioService = portfolioService;\n this.reportService = reportService;\n this.scope.accounts = new Array();\n this.morningStarService = morningStarService;\n this.scope.cachedAccounts = [];\n this.load();\n }\n PortfolioSnapshotCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.$apply(function () {\n _this.scope.accounts = result;\n if (result[0]) {\n console.log(_this.scope.selectedAccount);\n _this.setSelectedAccount(result[0].accountId);\n setTimeout(function () {\n _this.getPortfolioSnapshot();\n }, 500);\n }\n });\n })\n .catch(function (reason) {\n _this.scope.$apply(function () {\n _this.scope.isLoading = false;\n });\n });\n };\n PortfolioSnapshotCtrl.prototype.setSelectedAccount = function (accountId) {\n console.info('Selected Account Id: ' + accountId);\n this.scope.hasData = false;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n };\n PortfolioSnapshotCtrl.prototype.extractCodesFromReport = function (report) {\n var codes = [];\n if (report) {\n report.forEach(function (item) {\n codes.push({\n securityCode: item.securityCode,\n exchangeCode: item.exchange\n });\n });\n }\n return codes;\n };\n PortfolioSnapshotCtrl.prototype.loadPortfolioSnapshot = function () {\n var _this = this;\n if (this.scope.selectedAccount.accountType == \"Standard\") {\n var codes_1 = [];\n var cashAccountsPromise = this.portfolioService.getCashAccounts(this.scope.selectedAccount.accountId);\n cashAccountsPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var highInterestCashPromise = this.portfolioService.getHighInterestCashAccounts(this.scope.selectedAccount.accountId);\n highInterestCashPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var termDepositPromise = this.portfolioService.getTermDeposits(this.scope.selectedAccount.accountId);\n termDepositPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var internationalSharesPromise = this.portfolioService.getInternationalSharesForHoldings(this.scope.selectedAccount);\n internationalSharesPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var sharesPromise = this.portfolioService.getShares(this.scope.selectedAccount.accountId);\n sharesPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var allPromises = this.q.all([\n cashAccountsPromise,\n highInterestCashPromise,\n termDepositPromise,\n internationalSharesPromise,\n sharesPromise]);\n allPromises.then(function () {\n _this.loadMorningStarSnapshot(_this.scope.selectedAccount.accountId, codes_1);\n });\n }\n else {\n this.reportService.getReport(Patersons.ReportType.Valuation, this.scope.selectedAccount.accountId, new Date(), new Date())\n .then(function (report) {\n var codes = [];\n report.nonLoaSecurities.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n securityCode: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n });\n report.loaSecurities.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n securityCode: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n });\n report.nonLoaUnsettledDividends.items.forEach(function (unsettledDividend) {\n codes.push({\n securityCode: unsettledDividend.code,\n exchangeCode: unsettledDividend.exchangeCode\n });\n });\n report.loaUnsettledDividends.items.forEach(function (unsettledDividend) {\n codes.push({\n securityCode: unsettledDividend.code,\n exchangeCode: unsettledDividend.exchangeCode\n });\n });\n _this.loadMorningStarSnapshot(_this.scope.selectedAccount.accountId, codes);\n }, function (error) {\n // error handling\n _this.scope.isError = true;\n _this.scope.hasData = false;\n });\n }\n };\n PortfolioSnapshotCtrl.prototype.loadMorningStarSnapshot = function (accountId, data) {\n var _this = this;\n var tickers = [];\n //need to filter out funds (holdingTypeId = 2)\n Promise.all(data.map(function (code) {\n return new Promise(function (resolveTicker) {\n _this.morningStarService.getMorningStarDataForSecurityCode(code.exchangeCode, code.securityCode).then(function (res) {\n if (res) {\n if (res.holdingTypeId != 2) {\n tickers.push(res.FundShareClassId);\n }\n }\n resolveTicker();\n });\n });\n })).then(function () {\n //load data here\n rootMorningstarPromise().then(function (promiseChain) {\n initComponent('component-portfolio-snapshot-container', 'ecWatchList-container', 'ec-watch-list', 'ecWatchList').then(function () {\n var watchlistInstance = morningstar.asterix.instanceRegistry.get('ecWatchList');\n watchlistInstance.setParameter('showActionBar', false);\n watchlistInstance.setParameter('tickers', tickers);\n _this.scope.$apply(function () {\n _this.scope.isLoading = false;\n });\n });\n });\n //the watchlist component takes a few seconds to load the data.\n //if there is an event to hook into this will be much better however at present there are no events to hook into that the component exposes. \n setTimeout(function () {\n }, 4000);\n });\n };\n PortfolioSnapshotCtrl.$inject = ['$scope', '$q', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'reportService', 'reportDownloadService', 'portfolioService', 'navigationService', 'morningStarService'];\n return PortfolioSnapshotCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.PortfolioSnapshotCtrl = PortfolioSnapshotCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PortfolioHeatmapCtrl = (function (_super) {\n __extends(PortfolioHeatmapCtrl, _super);\n function PortfolioHeatmapCtrl($scope, $q, $log, $location, $window, $state, $stateParams, $http, $rootScope, reportService, reportDownloadService, portfolioService, navigationService, morningStarService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.getPortfolioHeatmap = function () {\n // if(this.scope.isLoading){\n // return;\n // }\n this.scope.isError = false;\n this.scope.hasData = false;\n this.loadPortfolioHeatmap();\n };\n this.scope = $scope;\n this.q = $q;\n this.scope.events = this;\n this.portfolioService = portfolioService;\n this.reportService = reportService;\n this.scope.accounts = new Array();\n this.morningStarService = morningStarService;\n this.scope.cachedAccounts = [];\n this.load();\n }\n PortfolioHeatmapCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.$apply(function () {\n _this.scope.accounts = result;\n _this.scope.isLoading = false;\n if (result[0]) {\n _this.setSelectedAccount(result[0].accountId);\n setTimeout(function () {\n _this.getPortfolioHeatmap();\n }, 500);\n }\n });\n })\n .catch(function (reason) {\n _this.scope.$apply(function () {\n _this.scope.isLoading = false;\n });\n });\n };\n PortfolioHeatmapCtrl.prototype.extractCodesFromReport = function (report) {\n var codes = [];\n if (report) {\n report.forEach(function (item) {\n codes.push({\n securityCode: item.securityCode,\n exchangeCode: item.exchange\n });\n });\n }\n return codes;\n };\n PortfolioHeatmapCtrl.prototype.setSelectedAccount = function (accountId) {\n console.info('Selected Account Id: ' + accountId);\n this.scope.hasData = false;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n };\n PortfolioHeatmapCtrl.prototype.loadPortfolioHeatmap = function () {\n var _this = this;\n if (this.scope.selectedAccount.accountType == \"Standard\") {\n this.scope.isLoading = true;\n var codes_1 = [];\n var cashAccountsPromise = this.portfolioService.getCashAccounts(this.scope.selectedAccount.accountId);\n cashAccountsPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var highInterestCashPromise = this.portfolioService.getHighInterestCashAccounts(this.scope.selectedAccount.accountId);\n highInterestCashPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var termDepositPromise = this.portfolioService.getTermDeposits(this.scope.selectedAccount.accountId);\n termDepositPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var internationalSharesPromise = this.portfolioService.getInternationalSharesForHoldings(this.scope.selectedAccount);\n internationalSharesPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var sharesPromise = this.portfolioService.getShares(this.scope.selectedAccount.accountId);\n sharesPromise.then(function (result) {\n codes_1 = codes_1.concat(_this.extractCodesFromReport(result));\n }, function (error) {\n });\n var allPromises = this.q.all([\n cashAccountsPromise,\n highInterestCashPromise,\n termDepositPromise,\n internationalSharesPromise,\n sharesPromise]);\n allPromises.then(function () {\n _this.loadMorningStarHeatmap(_this.scope.selectedAccount.accountId, codes_1);\n });\n }\n else {\n this.scope.isLoading = true;\n this.reportService.getReport(Patersons.ReportType.Valuation, this.scope.selectedAccount.accountId, new Date(), new Date())\n .then(function (report) {\n var codes = [];\n report.nonLoaSecurities.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n securityCode: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n });\n report.loaSecurities.forEach(function (category) {\n category.items.forEach(function (item) {\n codes.push({\n securityCode: item.code,\n exchangeCode: item.exchangeCode\n });\n });\n });\n report.nonLoaUnsettledDividends.items.forEach(function (unsettledDividend) {\n codes.push({\n securityCode: unsettledDividend.code,\n exchangeCode: unsettledDividend.exchangeCode\n });\n });\n report.loaUnsettledDividends.items.forEach(function (unsettledDividend) {\n codes.push({\n securityCode: unsettledDividend.code,\n exchangeCode: unsettledDividend.exchangeCode\n });\n });\n _this.loadMorningStarHeatmap(_this.scope.selectedAccount.accountId, codes);\n }, function (error) {\n // error handling\n _this.scope.isError = true;\n _this.scope.hasData = false;\n });\n }\n };\n PortfolioHeatmapCtrl.prototype.loadMorningStarHeatmap = function (accountId, data) {\n var _this = this;\n var tickers = [];\n //need to filter out funds (holdingTypeId = 2)\n Promise.all(data.map(function (code) {\n return new Promise(function (resolveTicker) {\n _this.morningStarService.getMorningStarDataForSecurityCode(code.exchangeCode, code.securityCode).then(function (res) {\n if (res) {\n if (res.holdingTypeId != 2) {\n tickers.push(res.FundShareClassId);\n }\n }\n resolveTicker();\n });\n });\n })).then(function () {\n //load data here\n rootMorningstarPromise().then(function (promiseChain) {\n // $('#component-portfolio-heatmap-container').append('
');\n try {\n morningstar.components[\"markets-components-core\"].TickersCache.tickers = {};\n }\n catch (error) {\n }\n loaderConfig.configuration.overrides.components.portfolioHeatmap.settings.tickerList = tickers;\n initComponent('component-portfolio-heatmap-container', \"heatmap-container\", \"markets-components-heatmap\", \"portfolioHeatmap\").then(function () {\n _this.scope.$apply(function () {\n _this.scope.isLoading = false;\n });\n });\n });\n });\n };\n PortfolioHeatmapCtrl.$inject = ['$scope', '$q', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'reportService', 'reportDownloadService', 'portfolioService', 'navigationService', 'morningStarService'];\n return PortfolioHeatmapCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.PortfolioHeatmapCtrl = PortfolioHeatmapCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n //export class PortfolioViewCtrl extends AbstractController {\n var PortfolioViewCtrl = (function (_super) {\n __extends(PortfolioViewCtrl, _super);\n function PortfolioViewCtrl($scope, $log, $q, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.q = $q;\n this.filter = $filter;\n this.portfolioService = portfolioService;\n this.scope.events = this;\n this.load();\n }\n PortfolioViewCtrl.prototype.setSelectedAccount = function (accountId) {\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n this.checkCompareMethod();\n };\n PortfolioViewCtrl.prototype.setAccountToCompare = function (accountId) {\n this.scope.accountToCompare = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n this.checkCompareMethod();\n };\n PortfolioViewCtrl.prototype.load = function () {\n var _this = this;\n var promise = this.portfolioService.getCombinedPortfolioData();\n promise.then(function (result) {\n _this.scope.accounts = result;\n if (_this.scope.accounts != undefined && _this.scope.accounts.length > 0) {\n _this.scope.selectedAccount = _this.scope.accounts[0];\n _this.loadXray();\n }\n });\n };\n PortfolioViewCtrl.prototype.loadXray = function () {\n var _this = this;\n if (this.scope.selectedAccount == undefined) {\n return;\n }\n this.loadShares([this.scope.selectedAccount])\n .then(function () {\n _this.mapAccountToPortfolio(_this.scope.selectedAccount).then(function (result) {\n console.log(JSON.stringify(result['holdings']));\n var xrayComponent = morningstar.asterix.instanceRegistry.get('ecXray');\n xrayComponent.setParameter('portfolio', result);\n });\n });\n };\n PortfolioViewCtrl.prototype.loadCompare = function () {\n var _this = this;\n this.loadShares([this.scope.selectedAccount, this.scope.accountToCompare])\n .then(function () {\n _this.log.info(\"compare \" + _this.scope.selectedAccount.accountId + ' with ' + _this.scope.accountToCompare.accountId);\n _this.mapAccountToPortfolio(_this.scope.selectedAccount).then(function (myPortfolio1) {\n _this.mapAccountToPortfolio(_this.scope.accountToCompare).then(function (myPortfolio2) {\n morningstar.asterix.instanceRegistry.get('ecPortfolioCompare.xrayCurrent').setParameter('portfolio', myPortfolio1);\n morningstar.asterix.instanceRegistry.get('ecPortfolioCompare.xrayProposed').setParameter('portfolio', myPortfolio2);\n });\n });\n });\n };\n PortfolioViewCtrl.prototype.loadShares = function (accounts) {\n var q = this.q;\n var portfolioService = this.portfolioService;\n var getShares = [];\n angular.forEach(accounts, function (account) {\n if (account !== undefined && account.holdings === undefined) {\n var promise = null;\n if (account.accountType === 'Standard') {\n promise = portfolioService.getCombinedShares(account.accountId);\n }\n else {\n promise = portfolioService.getAccoladeHoldings(account.accountId);\n }\n getShares.push(promise\n .then(function (result) {\n console.info('Getting shares for account ' + account.accountId);\n console.log(result);\n account.holdings = result;\n })\n .catch(function (response) {\n console.error('Error getting shares for account ' + account.accountId, response.status, response.data);\n }));\n }\n });\n var deferred = q.defer();\n return q.all(getShares)\n .then(function () {\n deferred.resolve();\n return deferred.promise;\n })\n .catch(function (response) {\n console.error('Error loading shares', response.status, response.data);\n deferred.reject(response);\n return deferred.promise;\n });\n };\n PortfolioViewCtrl.prototype.checkCompareMethod = function () {\n if (this.scope.accountToCompare != null) {\n this.loadCompare();\n }\n else {\n this.loadXray();\n }\n };\n PortfolioViewCtrl.prototype.createHoldingForAssetAllocation = function (item) {\n var holdings = [];\n if (item.assetAllocationDomesticCash != 0) {\n holdings.push(this.createCustomHoldingsForCashAccolade(item.assetAllocationDomesticCash, item.companyName));\n }\n if (item.assetAllocationDomesticEquity != 0) {\n holdings.push(this.createCustomHoldingsForAustralianEquity(item.assetAllocationDomesticEquity, item.companyName));\n }\n if (item.assetAllocationDomesticFixedInterest != 0) {\n holdings.push(this.createCustomHoldingsForAUFixedIncome(item.assetAllocationDomesticFixedInterest, item.companyName));\n }\n if (item.assetAllocationDomesticProperty != 0) {\n // Add addition checks here for the Exchange Code\n if (item.exchange.toLowerCase() === \"nsx\" || item.exchange.toLowerCase() === \"chi-x\") {\n holdings.push(this.createCustomHoldingsForProperty(item.marketValue, item.companyName));\n }\n else {\n if (item.exchange.toLowerCase() === \"axw\") {\n holdings.push(this.createCustomHoldingsForOther(item.assetAllocationOther, item.companyName));\n }\n else {\n holdings.push(this.createCustomHoldingsForUnlistedProperty(item.marketValue, item.companyName));\n }\n }\n }\n if (item.assetAllocationInternationalCash != 0) {\n holdings.push(this.createCustomHoldingsForCashAccolade(item.assetAllocationInternationalCash, item.companyName));\n }\n if (item.assetAllocationInternationalEquity != 0) {\n holdings.push(this.createCustomHoldingsForInternationalEquity(item.assetAllocationInternationalEquity, item.companyName));\n }\n if (item.assetAllocationInternationalFixedInterest != 0) {\n holdings.push(this.createCustomHoldingsForIntlFixedIncome(item.assetAllocationInternationalFixedInterest, item.companyName));\n }\n if (item.assetAllocationInternationalProperty != 0) {\n holdings.push(this.createCustomHoldingsForInternationalProperty(item.assetAllocationInternationalProperty, item.companyName));\n }\n if (item.assetAllocationOther != 0) {\n holdings.push(this.createCustomHoldingsForOther(item.assetAllocationOther, item.companyName));\n }\n return holdings;\n };\n ;\n PortfolioViewCtrl.prototype.createCustomHoldingsForCashAccolade = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 100,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 100,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForAustralianEquity = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 100,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 100,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForInternationalEquity = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 100,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 100,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForProperty = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 100,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 100,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForUnlistedProperty = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 100,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 100,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForInternationalProperty = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 100,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 100,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForAUFixedIncome = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 100,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 100,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForIntlFixedIncome = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 100,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 100,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForCash = function (balance, securityName) {\n return {\n \"identifier\": \"Cash\",\n \"identifierType\": \"ISIN\",\n \"Name\": \"Cash\",\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 100,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 100,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.createCustomHoldingsForOther = function (balance, securityName) {\n return {\n \"identifier\": securityName,\n \"identifierType\": \"ISIN\",\n \"Name\": securityName,\n \"weight\": balance,\n \"Proxy\": 1,\n \"breakdowns\": {\n \"assetAllocation\": [\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"N\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 100\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"L\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 100\n }\n },\n {\n \"type\": \"MorningstarAUS10\",\n \"salePosition\": \"S\",\n \"values\": {\n \"1\": 0,\n \"2\": 0,\n \"3\": 0,\n \"4\": 0,\n \"5\": 0,\n \"6\": 0,\n \"7\": 0,\n \"8\": 0,\n \"9\": 0,\n \"10\": 0\n }\n }\n ]\n }\n };\n };\n PortfolioViewCtrl.prototype.mapAccountToPortfolio = function (account) {\n var _this = this;\n return new Promise(function (resolve, reject) {\n console.info('mapAccountToPortfolio:');\n console.info(account);\n var allHoldings = [];\n var totalAccountValue = 0;\n for (var _i = 0, _a = account.holdings; _i < _a.length; _i++) {\n var holdingItem = _a[_i];\n totalAccountValue = totalAccountValue + holdingItem.marketValue;\n }\n if (account.accountType === \"Standard\") {\n console.log(\"standard account map account to portfolio\");\n var totalCashHoldingsValue = 0;\n for (var i = 0; i < account.holdings.length; i++) {\n if (account.holdings[i].isin === \"unknown\") {\n allHoldings.push(_this.createCustomHoldingsForOther(account.holdings[i].marketValue, account.holdings[i].companyName));\n }\n else {\n var holding = {\n identifier: account.holdings[i].isin,\n identifierType: 'ISIN',\n weight: account.holdings[i].marketValue\n };\n allHoldings.push(holding);\n }\n }\n // Standard Account Type\n // Get Cash Accounts\n _this.portfolioService.getCashAccounts(account.accountId)\n .then(function (result) {\n console.info('Getting cash account for: ' + account.accountId);\n console.log(\"Cash: \" + JSON.stringify(result));\n if (result && result.length > 0) {\n result.forEach(function (cashItem) {\n totalAccountValue += cashItem.balance;\n totalCashHoldingsValue += cashItem.balance;\n });\n }\n }).then(function () {\n // Get High Interest Cash Accounts\n _this.portfolioService.getHighInterestCashAccounts(account.accountId)\n .then(function (result) {\n console.info('Getting High Interest Cash account for: ' + account.accountId);\n console.log(\"High Interest Cash: \" + JSON.stringify(result));\n /*if (result.length > 0) {\n totalAccountValue = totalAccountValue + result[0].balance;\n totalCashHoldingsValue = totalCashHoldingsValue + result[0].balance;\n }*/\n if (result && result.length > 0) {\n result.forEach(function (cashItem) {\n totalAccountValue += cashItem.balance;\n totalCashHoldingsValue += cashItem.balance;\n });\n }\n }).then(function () {\n // Get Term Deposits\n _this.portfolioService.getTermDeposits(account.accountId)\n .then(function (result) {\n console.info('Getting Term Deposit account for: ' + account.accountId);\n console.log(\"Term Deposit: \" + JSON.stringify(result));\n if (result != null && result.length > 0) {\n result.forEach(function (item) {\n allHoldings.push(_this.createCustomHoldingsForAUFixedIncome(item.balance, item.provider));\n });\n }\n ;\n }).then(function () {\n if (totalCashHoldingsValue > 0) {\n allHoldings.push(_this.createCustomHoldingsForCash(totalCashHoldingsValue, \"Cash\"));\n }\n var portfolio = {\n name: _this.filter(\"accountName\")(account.designation ? account.designation.slice(1, -1) : account.accountName),\n totalValue: totalAccountValue,\n currencyId: 'AUD',\n holdings: allHoldings,\n benchmark: {\n holdings: [{\n identifier: 'XXXXXXXXXX',\n identifierType: 'MSID',\n weight: 100\n }]\n }\n };\n resolve(portfolio);\n });\n });\n });\n }\n else {\n console.log(account.holdings);\n account.holdings.forEach(function (item) {\n if (item.isin === \"unknown\") {\n //when no isin is present, assign the holdings to categories based on the asset allocation percentage\n var assetAllocations = _this.createHoldingForAssetAllocation(item);\n assetAllocations.forEach(function (allocation) {\n allHoldings.push(allocation);\n });\n }\n else {\n var holding = {\n identifier: item.isin,\n identifierType: 'ISIN',\n weight: item.marketValue\n };\n allHoldings.push(holding);\n }\n });\n console.log(JSON.stringify(allHoldings));\n var portfolio = {\n name: _this.filter(\"accountName\")(account.designation ? account.designation.slice(1, -1) : account.accountName),\n totalValue: totalAccountValue,\n currencyId: 'AUD',\n holdings: allHoldings,\n benchmark: {\n holdings: [{\n identifier: 'XXXXXXXXXX',\n identifierType: 'MSID',\n weight: 100\n }]\n }\n };\n resolve(portfolio);\n }\n });\n };\n ;\n PortfolioViewCtrl.$inject = ['$scope', '$log', '$q', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'navigationService'];\n return PortfolioViewCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.PortfolioViewCtrl = PortfolioViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var PortfolioCompareCtrl = (function (_super) {\n __extends(PortfolioCompareCtrl, _super);\n function PortfolioCompareCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.scope.date = new Date();\n this.scope.parentController = this;\n //this.scope.portfolio = this.portfolioService.getPortfolioData();\n //this.setSelectedAccount(this.scope.accounts[1].AccountId);\n //if (this.location.search().a != null) {\n // this.scope.selectedAccountId = this.location.search().a;\n //}\n //if (this.location.search().c != null) {\n // // the compare account id parameter\n // this.scope.compareAccountId = this.location.search().c;\n // this.log.info(\"CompareAccountId = \" + this.scope.compareAccountId);\n // this.getPortfolioData(this.baseUrl, this.scope.compareAccountId, this.scope.xRayComparePortfolios);\n //}\n //else {\n // this.log.info(\"AccountId = \" + this.scope.selectedAccountId);\n // this.getPortfolioData(this.baseUrl, this.scope.selectedAccountId, this.scope.xRayPortfolios);\n //}\n //this.scope.ChangeAccount = function () {\n // var accId = this.scope.selectedAccountId;\n // this.scope.xRayPortfolios = this.scope.parentController.getPortfolioData(this.scope.parentController.baseUrl, accId);\n // this.scope.parentController.setSelectedAccount(accId);\n //}\n //this.scope.CompareAccount = function () {\n // var accId = this.scope.selectedAccount.AccountId;\n // var caccId = this.scope.compareaccount.AccountId;\n // var url = \"/comparePortfolios?a=\" + accId + \"&c=\" + caccId;\n // this.location.url(url);\n //}\n }\n PortfolioCompareCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService'];\n return PortfolioCompareCtrl;\n }(Patersons.AbstractController));\n Patersons.PortfolioCompareCtrl = PortfolioCompareCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var StockReportCtrl = (function (_super) {\n __extends(StockReportCtrl, _super);\n function StockReportCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.salReportScope = [];\n this.scope = $scope;\n this.scope.parentController = this;\n this.scope.date = new Date();\n this.scope.securityId = $stateParams.secId;\n this.timeout = $timeout;\n this.load();\n }\n StockReportCtrl.prototype.salStockReportTransform = function () {\n morningstar.asterix.ng.transforms.register('fromAuClientResearch', function (input) {\n if (!input) {\n return input;\n }\n return {\n title: input.title,\n url: input.url,\n date: new Date(input.dateWritten),\n author: input.author,\n recommendation: input.licenseeRecommendation,\n recommendationChange: input.recommendationChange\n };\n });\n morningstar.asterix.ng.transforms.register('fromAuDocumentList', function (input) {\n if (!input || !input.arcDocumentList || !input.arcDocumentList.length) {\n return input;\n }\n return {\n title: input.arcDocumentList[0].byLine ? input.arcDocumentList[0].byLine : input.arcDocumentList[0].title,\n url: input.arcDocumentList[0].url,\n date: new Date(input.arcDocumentList[0].date)\n };\n });\n };\n StockReportCtrl.prototype.load = function () {\n this.log.info(\"SAL report Ctrl loading...\");\n var self = this;\n var isinData = this.state.params['secId']\n ? this.state.params['secId']\n : \"\";\n if (isinData) {\n $('#SalContainer').data('$injector', '');\n $.ajax(SALauthUrl).then(function (authData) {\n loaderConfigSalStock.configuration.overrides.settings.shareClassId = isinData;\n loaderConfigSalStock.apiTokens.apiGatewayToken = authData.body;\n morningstar.loader.load(loaderConfigSalStock).then(function (manifest) {\n //setup sal stock report transform\n self.salStockReportTransform();\n $('#main-spinner').remove();\n }).catch(function (error) {\n console.log(error);\n });\n });\n }\n else {\n this.state.go('dashboard');\n }\n };\n StockReportCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout', 'navigationService'];\n return StockReportCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.StockReportCtrl = StockReportCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var FundReportCtrl = (function (_super) {\n __extends(FundReportCtrl, _super);\n function FundReportCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.salReportScope = [];\n this.scope = $scope;\n this.timeout = $timeout;\n this.load();\n }\n FundReportCtrl.prototype.load = function () {\n this.log.info(\"SAL fund Ctrl loading...\");\n $('#SalContainer').data('$injector', '');\n var isinData = this.state.params['secId']\n ? this.state.params['secId']\n : \"\";\n if (isinData) {\n $.ajax(SALauthUrl).then(function (authData) {\n loaderConfigSalFund.configuration.overrides.settings.shareClassId = isinData;\n loaderConfigSalFund.apiTokens.apiGatewayToken = authData.body;\n morningstar.loader.load(loaderConfigSalFund).then(function () {\n $('#main-spinner').remove();\n }).catch(function (error) {\n console.log(error);\n });\n });\n }\n else {\n this.state.go('dashboard');\n }\n };\n FundReportCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\n return FundReportCtrl;\n }(Patersons.AbstractController));\n Patersons.FundReportCtrl = FundReportCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var EtfReportCtrl = (function (_super) {\n __extends(EtfReportCtrl, _super);\n function EtfReportCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.scope.securityId = $stateParams.secId;\n this.timeout = $timeout;\n this.load();\n }\n EtfReportCtrl.prototype.load = function () {\n this.log.info(\"SAL report Ctrl loading...\");\n console.log($('#sal-report'));\n //\n var isinData = this.state.params['secId']\n ? this.state.params['secId']\n : \"\";\n if (isinData) {\n $.ajax(SALauthUrl).then(function (authData) {\n loaderConfigSalETF.configuration.overrides.settings.shareClassId = isinData;\n loaderConfigSalETF.apiTokens.apiGatewayToken = authData.body;\n $('#SalContainer').data('$injector', '');\n morningstar.loader.load(loaderConfigSalETF).then(function () {\n $('#main-spinner').remove();\n }).catch(function (error) {\n console.log(error);\n });\n });\n }\n else {\n this.state.go('dashboard');\n }\n };\n EtfReportCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\n return EtfReportCtrl;\n }(Patersons.AbstractController));\n Patersons.EtfReportCtrl = EtfReportCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n //export class HoldingsCtrl extends AbstractController {\n var HoldingsCtrl = (function (_super) {\n __extends(HoldingsCtrl, _super);\n function HoldingsCtrl($scope, $q, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, reportService, reportDownloadService, navigationService, selectionService, pdfBuilderService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.getBackdatedHolding = function () {\n // if(this.scope.isLoading){\n // return;\n // }\n this.scope.isError = false;\n this.scope.hasData = false;\n var now = moment();\n var selectedDate = moment(this.scope.asAt);\n this.scope.generatedDate = new Date();\n if (selectedDate.isBefore(now, 'day')) {\n this.loadBackdatedHoldings();\n }\n else {\n this.buildReports();\n }\n };\n this.getSummaryText = function () {\n var text = \"Report generated at \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\n \" AEST on \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".
\" +\n \"Australian equity prices are delayed by 20 minutes. International equity prices are from the previous day's close.\";\n return text;\n };\n this.order = function (predicate) {\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\n this.scope.predicate = predicate;\n };\n this.orderInternational = function (predicate) {\n this.scope.intReverse = (this.scope.intPredicate === predicate) ? !this.scope.intReverse : false;\n this.scope.intPredicate = predicate;\n };\n this.orderHiCash = function (predicate) {\n this.scope.hiReverse = (this.scope.hiPredicate === predicate) ? !this.scope.hiReverse : false;\n this.scope.hiPredicate = predicate;\n };\n this.orderCash = function (predicate) {\n this.scope.cashTableSortOrder = (this.scope.cashTablePredicate === predicate) ? !this.scope.cashTableSortOrder : false;\n this.scope.cashTablePredicate = predicate;\n };\n this.orderTermDeposits = function (predicate) {\n this.scope.termDepositsSortOrder = (this.scope.termDepositsPredicate === predicate) ? !this.scope.termDepositsSortOrder : false;\n this.scope.termDepositsPredicate = predicate;\n };\n this.scope = $scope;\n this.scope.events = this;\n this.q = $q;\n this.stateParams = $stateParams;\n this.portfolioService = portfolioService;\n this.reportService = reportService;\n this.reportDownloadService = reportDownloadService;\n this.selectionService = selectionService;\n this.scope.accounts = new Array();\n this.scope.reverse = false;\n this.scope.predicate = \"securityCode\";\n this.scope.intPredicate = \"securityCode\";\n this.scope.intReverse = false;\n this.scope.filter = $filter;\n this.scope.asAt = moment().toDate();\n this.pdfBuilderService = pdfBuilderService;\n this.userCompanyService = userCompanyService;\n this.scope.cashTableSortOrder = false;\n this.scope.cashTablePredicate = \"instituteCode\";\n this.scope.hiPredicate = \"instituteCode\";\n this.scope.hiReverse = false;\n this.scope.termDepositsSortOrder = false;\n this.scope.termDepositsPredicate = \"provider\";\n this.scope.hasData = false;\n this.scope.isError = false;\n this.scope.generatedDate = new Date();\n this.userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n if (this.stateParams.accountId) {\n this.selectionService.selectedAccountId = $stateParams.accountId;\n }\n if (this.stateParams.asAt) {\n this.scope.asAt = moment(this.stateParams.asAt).toDate();\n }\n if (this.stateParams.autoDownloadPDF) {\n this.scope.autoDownloadPDF = this.stateParams.autoDownloadPDF;\n }\n this.load();\n }\n HoldingsCtrl.prototype.checkAutoDownloadPDF = function () {\n if (this.stateParams && this.stateParams.autoDownloadPDF && !this.scope.autoDownloaded) {\n this.downloadPdf();\n this.scope.autoDownloaded = true;\n }\n };\n HoldingsCtrl.prototype.setAsAtDate = function (selectedDate) {\n console.info('Selected As At Date: ' + selectedDate);\n this.scope.asAt = selectedDate;\n };\n HoldingsCtrl.prototype.setSelectedAccount = function (accountId) {\n console.info('Selected Account Id: ' + accountId);\n this.scope.hasData = false;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n };\n HoldingsCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.$apply(function () {\n _this.scope.accounts = result;\n _this.scope.isLoading = false;\n if ((!_this.selectionService || !_this.selectionService.selectedAccountId) && result[0]) {\n _this.setSelectedAccount(result[0].accountId);\n _this.getBackdatedHolding();\n }\n });\n })\n .catch(function (reason) {\n _this.scope.$apply(function () {\n _this.scope.isLoading = false;\n });\n });\n };\n HoldingsCtrl.prototype.loadBackdatedHoldings = function () {\n var _this = this;\n if (this.scope.selectedAccount.accountType == \"Standard\") {\n this.scope.isLoading = true;\n this.portfolioService.getBackdatedPortfolioData(this.scope.selectedAccount.accountId, this.scope.asAt)\n .then(function (result) {\n _this.scope.cashHoldingsReport = new Patersons.CashHoldingsReport();\n _this.scope.highInterestCashHoldingsReport = new Patersons.CashHoldingsReport();\n _this.scope.termDepositsReport = new Patersons.TermDepositsHoldingsReport();\n var domesticHoldings = result.filter(function (h) { return !h.isInternational; });\n _this.scope.equityHoldingsReport = _this.buildEquityHoldingsReport(domesticHoldings);\n var internationalHoldings = result.filter(function (h) { return h.isInternational; });\n _this.scope.internationalHoldingsReport = _this.buildInternationalEquityHoldingsReport(internationalHoldings);\n _this.scope.totalMarketValue = _this.scope.equityHoldingsReport.total.marketValue + _this.scope.internationalHoldingsReport.total.marketValue;\n _this.scope.hasData = true;\n _this.scope.isError = false;\n _this.checkAutoDownloadPDF();\n }, function (error) {\n _this.scope.isError = true;\n _this.scope.hasData = false;\n }).finally(function () {\n _this.scope.isLoading = false;\n });\n }\n else {\n this.loadAccoladeAccount();\n }\n };\n HoldingsCtrl.prototype.downloadPdf = function () {\n console.info('Download PDF');\n var asAtDate = this.scope.asAt;\n var account = this.scope.selectedAccount;\n var fileName = this.getFileName(account.accountId, asAtDate);\n if (this.scope.selectedAccount.accountType == \"Standard\") {\n this.makeAgilityPdf(account, asAtDate, fileName);\n }\n else {\n this.makeAccoladePdf(account, fileName, asAtDate);\n }\n };\n HoldingsCtrl.prototype.downloadCsv = function () {\n console.info('Download CSV');\n var asAtDate = this.scope.asAt;\n var account = this.scope.selectedAccount;\n var fileName = this.getFileName(account.accountId, asAtDate);\n if (this.scope.selectedAccount.accountType == \"Standard\") {\n this.makeCsv(account, fileName, asAtDate);\n }\n else {\n this.reportDownloadService.downloadCsvFile(this.scope.valuationReport, account);\n }\n };\n HoldingsCtrl.prototype.makeCsv = function (account, filename, endDate) {\n filename = filename + \".csv\";\n var topLine = Patersons.ReportDownloadService.getCsvTopLine(account, new Date(), endDate, endDate, undefined);\n var csvBuilder = new Patersons.CsvBuilder();\n var cashHoldings = this.scope.cashHoldingsReport;\n var highInterestCashHoldings = this.scope.highInterestCashHoldingsReport;\n var termDeposits = this.scope.termDepositsReport;\n var equityHoldings = this.scope.equityHoldingsReport;\n var internationalHoldings = this.scope.internationalHoldingsReport;\n var pricesQuotedAt = this.scope.selectedAccount.pricesQuotedAt;\n var totalMarketValue = this.scope.totalMarketValue;\n var formattedTermDeposits = this.getFormattedTermDeposits(termDeposits);\n var formattedCashHoldings = this.getFormattedCashHoldings(cashHoldings);\n var formattedHighInterestCashHoldings = this.getFormattedCashHoldings(highInterestCashHoldings);\n var formattedEquityHoldings = this.getFormattedHoldings(equityHoldings);\n var formattedInternationalHoldings = this.getFormattedHoldingsInternational(internationalHoldings);\n var allCSVData = [];\n // Term Deposits.\n if (formattedTermDeposits && formattedTermDeposits.length > 0) {\n allCSVData.push(this.getRowHeading(\"Term Deposits\"));\n allCSVData.push([\n \"MATURITY DATE\",\n \"INSTITUTION\",\n \"BALANCE\",\n \"RATE\",\n ]);\n formattedTermDeposits.forEach(function (x) {\n var data = [\n (x.maturityDate) ? x.maturityDate : \"\",\n (x.provider) ? x.provider : \"\",\n (x.balance) ? x.balance : \"\",\n (x.rate) ? x.rate : \"\",\n ];\n allCSVData.push(data);\n });\n }\n // Cash Accounts.\n if (formattedCashHoldings && formattedCashHoldings.length > 0) {\n allCSVData.push(this.getRowHeading(\"Cash Accounts\"));\n allCSVData.push([\n \"INSTITUTION\",\n \"ACCOUNT NAME\",\n \"BALANCE\",\n \"TYPE\",\n ]);\n formattedCashHoldings.forEach(function (x) {\n var data = [\n (x.instituteCode) ? x.instituteCode : \"\",\n (x.accountName) ? x.accountName : \"\",\n (x.balance) ? x.balance : \"\",\n (x.type) ? x.type : \"\",\n ];\n allCSVData.push(data);\n });\n }\n // High Interest Cash Holdings\n if (formattedHighInterestCashHoldings && formattedHighInterestCashHoldings.length > 0) {\n allCSVData.push(this.getRowHeading(\"High Interest Cash Accounts\"));\n allCSVData.push([\n \"INSTITUTION\",\n \"ACCOUNT NAME\",\n \"BALANCE\",\n \"RATE\",\n ]);\n formattedHighInterestCashHoldings.forEach(function (x) {\n var data = [\n (x.instituteCode) ? x.instituteCode : \"\",\n (x.accountName) ? x.accountName : \"\",\n (x.balance) ? x.balance : \"\",\n (x.interestRate) ? x.interestRate : \"\",\n ];\n allCSVData.push(data);\n });\n }\n // Australian Equities.\n if (formattedEquityHoldings && formattedEquityHoldings.length > 0) {\n allCSVData.push(this.getRowHeading(\"Australian Equities\"));\n allCSVData.push([\n \"CODE\",\n \"NAME\",\n \"QUANTITY\",\n \"AVERAGE COST\",\n \"MARKET PRICE\",\n \"TOTAL COST\",\n \"MARKET VALUE\",\n \"PROFIT (LOSS)\",\n \"Historic DPS **\",\n \"Historic Fr. Credits\",\n \"Historic Est. Income\",\n \"Historic YIELD\",\n ]);\n formattedEquityHoldings.forEach(function (x) {\n var data = [\n (x.securityCode) ? x.securityCode : \"\",\n (x.companyName) ? x.companyName : \"\",\n (x.quantity) ? x.quantity : \"\",\n (x.averageCost) ? x.averageCost : \"\",\n (x.lastPrice) ? x.lastPrice : \"\",\n (x.totalCost) ? x.totalCost : \"\",\n (x.marketValue) ? x.marketValue : \"\",\n (x.profitOrLoss) ? x.profitOrLoss : \"\",\n (x.dividendPerShare) ? x.dividendPerShare : \"\",\n (x.frankedAmount) ? x.frankedAmount : \"\",\n (x.income) ? x.income : \"\",\n (x.yield) ? x.yield : \"\",\n ];\n allCSVData.push(data);\n });\n }\n var internationalFields = this.getFieldsInternational();\n // International Holdings.\n if (formattedInternationalHoldings && formattedInternationalHoldings.length > 0) {\n allCSVData.push(this.getRowHeading(\"International Equities\"));\n allCSVData.push([\n \"CODE\",\n \"CURRENCY\",\n \"NAME\",\n \"QUANTITY\",\n \"NATIVE COST PRICE\",\n \"NATIVE TOTAL COST\",\n \"NATIVE MARKET PRICE\",\n \"NATIVE MARKET VALUE\",\n \"NATIVE PROFIT (LOSS)\",\n \"AUD MARKET VALUE\",\n ]);\n formattedInternationalHoldings.forEach(function (x) {\n var data = [\n (x.securityCode) ? x.securityCode : \"\",\n (x.currency) ? x.currency : \"\",\n (x.companyName) ? x.companyName : \"\",\n (x.quantity) ? x.quantity : \"\",\n (x.nativeCostPrice) ? x.nativeCostPrice : \"\",\n (x.nativeTotalCost) ? x.nativeTotalCost : \"\",\n (x.nativeMarketPrice) ? x.nativeMarketPrice : \"\",\n (x.nativeMarketValue) ? x.nativeMarketValue : \"\",\n (x.nativeProfitLoss) ? x.nativeProfitLoss : \"\",\n (x.marketValue) ? x.marketValue : \"\",\n ];\n allCSVData.push(data);\n });\n }\n // Grand Total\n allCSVData.push([\n \"Grand Total\",\n \"\",\n \"\",\n \"\",\n \"\",\n totalMarketValue,\n ]);\n csvBuilder.setFilename(filename)\n .setTopLine(topLine)\n .setHeaders(this.getHeadings())\n .setData(allCSVData)\n .build();\n };\n HoldingsCtrl.prototype.getRowHeading = function (title) {\n return [title];\n };\n HoldingsCtrl.prototype.getHeadings = function () {\n return [];\n };\n HoldingsCtrl.prototype.getAccoladeHeadings = function () {\n return [];\n };\n HoldingsCtrl.prototype.getFileName = function (accountId, asAtDate) {\n var asAtDateStr = moment(asAtDate).format(\"YYYY-MM-DD\");\n return accountId + \"-Holdings-\" + asAtDateStr;\n };\n HoldingsCtrl.prototype.makeAccoladePdf = function (account, filename, asAtDate) {\n var _this = this;\n var reportData = this.scope.valuationReport;\n var asAt = moment(asAtDate).format(\"D MMM YYYY\");\n var generatedAt = moment.tz(reportData.creationDateUtc, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY');\n var pricesQuotedAt = moment.tz(this.scope.selectedAccount.pricesQuotedAt, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY');\n this.reportDownloadService.report = reportData;\n // Build a valuation statement (aka Accolade Holdings) PDF document definition using an empty content object.\n // We'll inject this document definition into our PDF builder in the next step.\n var docDefinition = this.reportDownloadService.getValuationStatement({ content: [] });\n this.pdfBuilderService.newPdfBuilderInstance().then(function (pdfBuilder) {\n pdfBuilder\n .setTitle(reportData.title)\n .setSubTitle(_this.scope.filter(\"accountName\")(account.designation ? account.accountName + ' ' + account.designation : account.accountName))\n .addHeaderTableRow('Adviser:', account.adviserName, '', '')\n .addHeaderTableRow('Account:', account.accountId, '', '')\n .addHeaderTableRow('Report Generated At:', generatedAt, 'As at:', asAt)\n .addHeading(_this.getStandardDisclaimer())\n .setFilename(filename)\n .build(docDefinition.content);\n });\n };\n HoldingsCtrl.prototype.makeAgilityPdf = function (account, asAtDate, filename) {\n var _this = this;\n var nowDate = moment(new Date());\n var asAtDateStr = moment(asAtDate).format(\"D MMM YYYY\");\n var cashHoldings = this.scope.cashHoldingsReport;\n var highInterestCashHoldings = this.scope.highInterestCashHoldingsReport;\n var termDeposits = this.scope.termDepositsReport;\n var equityHoldings = this.scope.equityHoldingsReport;\n var internationalHoldings = this.scope.internationalHoldingsReport;\n var pricesQuotedAt = this.scope.selectedAccount.pricesQuotedAt;\n var totalMarketValue = this.scope.totalMarketValue;\n var formattedTermDeposits = this.getFormattedTermDeposits(termDeposits);\n var formattedCashHoldings = this.getFormattedCashHoldings(cashHoldings);\n var formattedHighInterestCashHoldings = this.getFormattedCashHoldings(highInterestCashHoldings);\n var formattedEquityHoldings = this.getFormattedHoldings(equityHoldings);\n var formattedInternationalHoldings = this.getFormattedHoldingsInternational(internationalHoldings);\n var lastRowIsTotal = true;\n this.pdfBuilderService.newPdfBuilderInstance().then(function (pdfBuilder) {\n pdfBuilder\n .setTitle('Holdings')\n .setSubTitle(_this.scope.filter(\"accountName\")(account.designation ? account.accountName + ' ' + account.designation : account.accountName))\n .addHeaderTableRow('Adviser:', account.adviserName, '', '')\n .addHeaderTableRow('Account:', account.accountId, '', '')\n .addHeaderTableRow('Report Generated At:', moment.tz(nowDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), 'As at:', asAtDateStr)\n .addHeading(_this.getStandardDisclaimer())\n .addTableAligned('Australian Equities', formattedEquityHoldings, _this.getHoldingsFields(), _this.getHoldingsHeadingsAligned(), _this.getHoldingsFormatHints(), lastRowIsTotal)\n .addTableAligned('International Equities', formattedInternationalHoldings, _this.getInternationalHoldingsFields(), _this.getInternationalHoldingsHeadingsAligned(), _this.getInternationalHoldingsFormatHints(), lastRowIsTotal)\n .addTable('Cash Accounts', formattedCashHoldings, _this.getCashHoldingsFields(), _this.getCashHoldingsHeadings(), _this.getCashHoldingsFormatHints(), lastRowIsTotal)\n .addTable('High Interest Cash Accounts', formattedHighInterestCashHoldings, _this.getCashHoldingsFields(), _this.getCashHoldingsHeadings(), _this.getCashHoldingsFormatHints(), lastRowIsTotal)\n .addTable('Term Deposits', formattedTermDeposits, _this.getTermDepositsFields(), _this.getTermDepositsHeadings(), _this.getTermDepositsFormatHints(), lastRowIsTotal)\n .addTable('Grand Total', [{ total: totalMarketValue }], ['total'], null, //['Total Market Value'],\n [Patersons.PdfFormatHint.Currency], false)\n .setFilename(filename)\n .build();\n });\n };\n HoldingsCtrl.prototype.getFormattedTermDeposits = function (data) {\n if (!data || !data.holdings) {\n return null;\n }\n var formattedData = angular.copy(data.holdings);\n if (data.total && data.total.hasData()) {\n formattedData.push(angular.copy(data.total));\n }\n formattedData = formattedData.map(function (record) {\n return {\n maturityDate: moment(record.maturityDate).format(\"DD/MM/YYYY\"),\n provider: record.provider,\n balance: record.balance,\n rate: record.rate\n };\n });\n return formattedData;\n };\n HoldingsCtrl.prototype.getFormattedCashHoldings = function (data) {\n if (!data || !data.holdings) {\n return null;\n }\n var formattedData = angular.copy(data.holdings);\n if (data.total && data.total.hasData()) {\n formattedData.push(angular.copy(data.total));\n }\n formattedData = formattedData.map(function (record) {\n return {\n instituteCode: record.instituteCode,\n accountName: record.accountName,\n balance: record.balance,\n type: record.type\n };\n });\n return formattedData;\n };\n HoldingsCtrl.prototype.getFieldsInternational = function () {\n return [\n \"securityCode\",\n \"currency\",\n \"companyName\",\n \"quantity\",\n \"nativeCostPrice\",\n \"nativeTotalCost\",\n \"nativeMarketPrice\",\n \"nativeMarketValue\",\n \"nativeProfitLoss\",\n \"totalCost\",\n \"marketValue\",\n \"profitOrLoss\",\n ];\n };\n HoldingsCtrl.prototype.getFields = function () {\n return [\n \"securityCode\",\n \"companyName\",\n \"quantity\",\n \"averageCost\",\n \"lastPrice\",\n \"totalCost\",\n \"marketValue\",\n \"profitOrLoss\",\n \"dividendPerShare\",\n \"frankedAmount\",\n \"income\",\n \"yield\" //,\n ];\n };\n HoldingsCtrl.prototype.getAccoladeFields = function () {\n var result = [];\n if (this.scope.userCompany.enableFeature) {\n var result_1 = [\n \"code\",\n \"securityName\",\n \"quantity\",\n \"costPrice\",\n \"reducedCostBase\",\n \"marketPrice\",\n \"marketValue\",\n \"profitOrLoss\",\n \"pctAssets\",\n \"estIncome\",\n \"estFrankingCredits\",\n \"estGrossYield\"\n ];\n return result_1;\n }\n else {\n var result_2 = [\n \"code\",\n \"securityName\",\n \"quantity\",\n \"costPrice\",\n \"reducedCostBase\",\n \"marketPrice\",\n \"marketValue\",\n \"profitOrLoss\",\n \"pctAssets\",\n ];\n return result_2;\n }\n };\n HoldingsCtrl.prototype.getFormattedHoldingsInternational = function (data) {\n if (!data || !data.holdings) {\n return null;\n }\n var formattedData = angular.copy(data.holdings);\n if (data.total && data.total.hasData()) {\n formattedData.push(angular.copy(data.total));\n }\n formattedData = formattedData.map(function (record) {\n return {\n securityCode: record.securityCode,\n currency: record.currency,\n companyName: record.companyName,\n quantity: record.quantity,\n nativeCostPrice: record.nativeCostPrice,\n nativeTotalCost: record.nativeTotalCost,\n nativeMarketPrice: record.nativeMarketPrice,\n nativeMarketValue: record.nativeMarketValue,\n nativeProfitLoss: record.nativeProfitLoss,\n totalCost: record.totalCost,\n marketValue: record.marketValue,\n profitOrLoss: record.profitOrLoss,\n };\n });\n return formattedData;\n };\n HoldingsCtrl.prototype.getFormattedHoldings = function (data) {\n if (!data || !data.holdings) {\n return null;\n }\n var formattedData = angular.copy(data.holdings);\n if (data.total && data.total.hasData()) {\n formattedData.push(angular.copy(data.total));\n }\n formattedData = formattedData.map(function (record) {\n return {\n securityCode: record.securityCode,\n companyName: record.companyName,\n quantity: record.quantity,\n averageCost: record.averageCost,\n lastPrice: record.lastPrice,\n totalCost: record.totalCost,\n marketValue: record.marketValue,\n profitOrLoss: record.profitOrLoss,\n dividendPerShare: record.dividendPerShare,\n frankedAmount: record.frankedAmount,\n income: record.income,\n \"yield\": record.yield,\n };\n });\n return formattedData;\n };\n HoldingsCtrl.prototype.getTermDepositsFields = function () {\n return [\"maturityDate\", \"provider\", \"balance\", \"rate\"];\n };\n HoldingsCtrl.prototype.getCashHoldingsFields = function () {\n return [\"instituteCode\", \"accountName\", \"balance\", \"type\"];\n };\n HoldingsCtrl.prototype.getInternationalHoldingsFields = function () {\n return [\n \"securityCode\",\n \"currency\",\n \"companyName\",\n \"quantity\",\n \"nativeCostPrice\",\n \"nativeTotalCost\",\n \"nativeMarketPrice\",\n \"nativeMarketValue\",\n \"nativeProfitLoss\",\n \"marketValue\",\n ];\n };\n HoldingsCtrl.prototype.getHoldingsFields = function () {\n return [\"securityCode\",\n \"companyName\",\n \"quantity\",\n \"averageCost\",\n \"lastPrice\",\n \"totalCost\",\n \"marketValue\",\n \"profitOrLoss\",\n \"dividendPerShare\",\n \"frankedAmount\",\n \"income\",\n \"yield\",\n ];\n };\n HoldingsCtrl.prototype.getTermDepositsFormatHints = function () {\n return [\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.None\n ];\n };\n HoldingsCtrl.prototype.getCashHoldingsFormatHints = function () {\n return [\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.None\n ];\n };\n HoldingsCtrl.prototype.getInternationalHoldingsFormatHints = function () {\n return [\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.Currency4decPts,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency4decPts,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n ];\n };\n HoldingsCtrl.prototype.getHoldingsFormatHints = function () {\n return [\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.Currency4decPts,\n Patersons.PdfFormatHint.Currency4decPts,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency,\n Patersons.PdfFormatHint.Currency\n ];\n };\n HoldingsCtrl.prototype.getTermDepositsHeadings = function () {\n return [\"Maturity Date\", \"Institution\", \"Balance\", \"Rate\"];\n };\n HoldingsCtrl.prototype.getCashHoldingsHeadings = function () {\n return [\"Institution\", \"Account Name\", \"Balance\", \"Type\"];\n };\n HoldingsCtrl.prototype.getHoldingsHeadings = function () {\n return [\"Code\", \"Name\", \"Quantity\", \"Average Cost\",\n \"Market Price\", \"Total Cost\", \"Market Value\",\n \"Profit (Loss)\", \"Historic DPS**\", \"Historic Fr. Credits\", \"Historic Est. Income\",\n \"Yield\",];\n };\n HoldingsCtrl.prototype.getInternationalHoldingsHeadingsAligned = function () {\n return [\n { text: \"Code\", type: \"string\" },\n { text: \"Currency\", type: \"string\" },\n { text: \"Name\", type: \"string\" },\n { text: \"Quantity\", type: \"number\" },\n { text: \"Native Cost Price\", type: \"number\" },\n { text: \"Native Total Cost\", type: \"number\" },\n { text: \"Native Market Price\", type: \"number\" },\n { text: \"Native Market Value\", type: \"number\" },\n { text: \"Native Profit (Loss)\", type: \"number\" },\n { text: \"AUD Market Value\", type: \"number\" },\n ];\n };\n HoldingsCtrl.prototype.getHoldingsHeadingsAligned = function () {\n return [\n { text: \"Code\", type: \"string\" },\n { text: \"Name\", type: \"string\" },\n { text: \"Quantity\", type: \"number\" },\n { text: \"Average Cost\", type: \"number\" },\n { text: \"Market Price\", type: \"number\" },\n { text: \"Total Cost\", type: \"number\" },\n { text: \"Market Value\", type: \"number\" },\n { text: \"Profit (Loss)\", type: \"number\" },\n { text: \"Historic DPS**\", type: \"number\" },\n { text: \"Historic Fr. Credits\", type: \"number\" },\n { text: \"Historic Est. Income\", type: \"number\" },\n { text: \"Historic Yield\", type: \"number\" },\n ];\n };\n HoldingsCtrl.prototype.getStandardDisclaimer = function () {\n return '* Australian Equity prices are delayed by 20 mins. International equity prices are the previous day\\'s closing price.';\n };\n HoldingsCtrl.prototype.buildReports = function () {\n if (this.scope.selectedAccount == undefined) {\n return;\n }\n this.scope.isLoading = true;\n if (this.scope.selectedAccount.accountType == \"Standard\") {\n this.loadStandardAccount();\n }\n else {\n this.loadAccoladeAccount();\n }\n };\n HoldingsCtrl.prototype.loadStandardAccount = function () {\n var _this = this;\n var cashAccountsPromise = this.portfolioService.getCashAccounts(this.scope.selectedAccount.accountId);\n cashAccountsPromise.then(function (result) {\n _this.scope.selectedAccount.cashDeposits = result;\n _this.scope.cashHoldingsReport = _this.buildCashHoldingReport(result);\n }, function (error) {\n _this.scope.selectedAccount.cashDeposits = null;\n _this.scope.cashHoldingsReport = null;\n });\n var highInterestCashPromise = this.portfolioService.getHighInterestCashAccounts(this.scope.selectedAccount.accountId);\n highInterestCashPromise.then(function (result) {\n _this.scope.highInterestCashHoldingsReport = _this.buildCashHoldingReport(result);\n }, function (error) {\n _this.scope.highInterestCashHoldingsReport = null;\n });\n var termDepositPromise = this.portfolioService.getTermDeposits(this.scope.selectedAccount.accountId);\n termDepositPromise.then(function (result) {\n _this.scope.selectedAccount.termDeposits = result;\n _this.scope.termDepositsReport = _this.buildTermDepositsReport(_this.scope.selectedAccount);\n }, function (error) {\n _this.scope.selectedAccount.termDeposits = null;\n _this.scope.termDepositsReport = null;\n });\n var internationalSharesPromise = this.portfolioService.getInternationalSharesForHoldings(this.scope.selectedAccount);\n internationalSharesPromise.then(function (result) {\n _this.scope.internationalHoldingsReport = _this.buildInternationalEquityHoldingsReport(result);\n }, function (error) {\n _this.scope.internationalHoldingsReport = null;\n });\n var sharesPromise = this.portfolioService.getShares(this.scope.selectedAccount.accountId);\n sharesPromise.then(function (result) {\n _this.scope.selectedAccount.holdings = result;\n _this.scope.equityHoldingsReport = _this.buildEquityHoldingsReport(_this.scope.selectedAccount.holdings);\n if (_this.scope.selectedAccount.holdings[0]) {\n _this.scope.selectedAccount.pricesQuotedAt = _this.scope.selectedAccount.holdings[0].asOf;\n }\n }, function (error) {\n _this.scope.selectedAccount.holdings = null;\n _this.scope.equityHoldingsReport = null;\n });\n var allPromises = this.q.all([\n cashAccountsPromise,\n highInterestCashPromise,\n termDepositPromise,\n internationalSharesPromise,\n sharesPromise]);\n allPromises.then(function () {\n _this.scope.totalMarketValue = _this.scope.equityHoldingsReport.total.marketValue + _this.scope.internationalHoldingsReport.total.marketValue + _this.scope.cashHoldingsReport.total.balance + _this.scope.termDepositsReport.total.balance;\n }, function (error) {\n _this.scope.totalMarketValue = null;\n });\n allPromises.finally(function () {\n _this.scope.isLoading = false;\n _this.scope.hasData = true;\n _this.checkAutoDownloadPDF();\n });\n };\n HoldingsCtrl.prototype.loadAccoladeAccount = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.reportService.getReport(Patersons.ReportType.Valuation, this.scope.selectedAccount.accountId, this.scope.asAt, this.scope.asAt)\n .then(function (result) {\n _this.scope.selectedAccount.pricesQuotedAt = _this.scope.asAt;\n _this.scope.valuationReport = result;\n _this.scope.hasData = true;\n _this.scope.isError = false;\n _this.checkAutoDownloadPDF();\n }, function (error) {\n // error handling\n _this.scope.selectedAccount.pricesQuotedAt = _this.scope.asAt;\n _this.scope.valuationReport = null;\n _this.scope.isError = true;\n _this.scope.hasData = false;\n }).finally(function () {\n _this.scope.isLoading = false;\n });\n };\n HoldingsCtrl.prototype.buildCashHoldingReport = function (cashDeposits) {\n var report = new Patersons.CashHoldingsReport();\n var holdings = new Array();\n var total = new Patersons.CashHolding();\n total.balance = 0;\n for (var i = 0; i < cashDeposits.length; i++) {\n var cashDeposit = cashDeposits[i];\n var rec = new Patersons.CashHolding();\n rec.instituteCode = cashDeposit.instituteCode;\n rec.accountName = cashDeposit.accountName;\n rec.balance = cashDeposit.balance;\n rec.type = cashDeposit.type;\n rec.interestRate = cashDeposit.interestRate;\n holdings.push(rec);\n total.balance += cashDeposit.balance;\n }\n report.holdings = holdings;\n report.total = total;\n return report;\n };\n HoldingsCtrl.prototype.buildEquityHoldingsReport = function (inputHoldings) {\n var report = new Patersons.EquityHoldingsReport();\n var holdings = new Array();\n var total = new Patersons.EquityHolding();\n total.totalCost = 0;\n total.marketValue = 0;\n total.profitOrLoss = 0;\n total.income = 0;\n for (var i = 0; i < inputHoldings.length; i++) {\n var holding = inputHoldings[i];\n if (!holding.isInternational) {\n var rec = new Patersons.EquityHolding();\n rec.exchange = holding.exchange;\n rec.securityCode = holding.securityCode;\n rec.companyName = holding.companyName;\n rec.quantity = holding.quantity;\n rec.averageCost = holding.averageCost;\n rec.lastPrice = holding.lastPrice;\n rec.totalCost = holding.totalCost;\n rec.marketValue = holding.marketValue;\n rec.profitOrLoss = holding.profitOrLoss;\n rec.dividendPerShare = holding.dividendPerShare;\n rec.frankedAmount = holding.frankedAmount;\n rec.income = holding.income;\n rec.yield = holding.yield;\n //rec.priceToEarnings = holding.priceToEarnings;\n holdings.push(rec);\n total.totalCost += holding.totalCost;\n total.marketValue += holding.marketValue;\n total.profitOrLoss += holding.profitOrLoss;\n total.income += holding.income;\n }\n }\n report.holdings = holdings;\n report.total = total;\n return report;\n };\n HoldingsCtrl.prototype.buildInternationalEquityHoldingsReport = function (intHoldings) {\n var report = new Patersons.EquityHoldingsReport();\n var holdings = new Array();\n var total = new Patersons.EquityHolding();\n total.totalCost = 0;\n total.marketValue = 0;\n total.profitOrLoss = 0;\n total.income = 0;\n total.nativeTotalCost = 0;\n total.nativeMarketValue = 0;\n total.nativeProfitLoss = 0;\n for (var i = 0; i < intHoldings.length; i++) {\n var holding = intHoldings[i];\n var rec = new Patersons.EquityHolding();\n rec.exchange = holding.exchange;\n rec.securityCode = holding.securityCode;\n rec.companyName = holding.companyName;\n rec.quantity = holding.quantity;\n rec.averageCost = holding.averageCost;\n rec.lastPrice = holding.lastPrice;\n rec.totalCost = holding.totalCost;\n rec.marketValue = holding.marketValue;\n rec.profitOrLoss = holding.profitOrLoss;\n rec.dividendPerShare = holding.dividendPerShare;\n rec.frankedAmount = holding.frankedAmount;\n rec.income = holding.income;\n rec.yield = holding.yield;\n rec.currency = holding.currency;\n rec.nativeCostPrice = holding.nativeCostPrice;\n rec.nativeTotalCost = holding.nativeTotalCost;\n rec.nativeMarketPrice = holding.nativeMarketPrice;\n rec.nativeMarketValue = holding.nativeMarketValue;\n rec.nativeProfitLoss = holding.nativeProfitLoss;\n //rec.priceToEarnings = holding.priceToEarnings;\n holdings.push(rec);\n total.totalCost += holding.totalCost;\n total.nativeTotalCost += holding.nativeTotalCost;\n total.nativeMarketValue += holding.nativeMarketValue;\n total.nativeProfitLoss += holding.nativeProfitLoss;\n total.marketValue += holding.marketValue;\n total.profitOrLoss += holding.profitOrLoss;\n total.income += holding.income;\n }\n report.holdings = holdings;\n report.total = total;\n return report;\n };\n HoldingsCtrl.prototype.buildTermDepositsReport = function (account) {\n var report = new Patersons.TermDepositsHoldingsReport();\n var holdings = new Array();\n var total = new Patersons.TermDeposit();\n total.balance = 0;\n for (var i = 0; i < account.termDeposits.length; i++) {\n var termDeposit = account.termDeposits[i];\n var rec = new Patersons.TermDeposit();\n rec.accountCode = termDeposit.accountCode;\n rec.balance = termDeposit.balance;\n rec.maturityDate = termDeposit.maturityDate;\n rec.provider = termDeposit.provider;\n rec.rate = termDeposit.rate;\n holdings.push(rec);\n total.balance += termDeposit.balance;\n }\n report.holdings = holdings;\n report.total = total;\n return report;\n };\n HoldingsCtrl.$inject = ['$scope', '$q', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'reportService', 'reportDownloadService', 'navigationService', 'selectionService', 'pdfBuilderService', 'userCompanyService'];\n return HoldingsCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.HoldingsCtrl = HoldingsCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n //export class ConfirmationNotesCtrl extends AbstractController {\n var ConfirmationNotesCtrl = (function (_super) {\n __extends(ConfirmationNotesCtrl, _super);\n function ConfirmationNotesCtrl($q, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, bulkDownloadService, navigationService, pdfBuilderService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.order = function (predicate) {\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\n this.scope.predicate = predicate;\n };\n this.getSummaryText = function () {\n var text = \"Report generated at \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\n \" AEST on \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".\";\n return text;\n };\n this.q = $q;\n this.state = $state;\n this.http = $http;\n this.scope = $scope;\n this.scope.events = this;\n this.scope.filter = $filter;\n this.portfolioService = portfolioService;\n this.bulkDownloadService = bulkDownloadService;\n this.pdfBuilderService = pdfBuilderService;\n this.scope.accounts = new Array();\n this.scope.reverse = true;\n this.scope.predicate = \"conDate\";\n this.scope.isSelectAll = false;\n this.scope.endDate = moment().toDate();\n this.scope.startDate = moment().subtract(30, 'days').toDate();\n this.scope.generatedDate = new Date();\n this.scope.hasData = false;\n this.scope.isError = false;\n this.load();\n }\n ConfirmationNotesCtrl.prototype.hasNotesInRange = function () {\n var start = moment(this.scope.startDate);\n var end = moment(this.scope.endDate);\n return this.scope.selectedAccount &&\n this.scope.selectedAccount.confirmationNotes &&\n this.scope.selectedAccount.confirmationNotes.some(function (m) { return moment(m.conDate).isBetween(start, end, 'days', '[]'); });\n };\n ConfirmationNotesCtrl.prototype.selectAll = function (e) {\n e.stopPropagation();\n this.scope.isSelectAll = !this.scope.isSelectAll;\n var selectAll = this.scope.isSelectAll;\n console.log(\"Selected : \" + selectAll);\n var log = [];\n var selectableContractNotes = this.scope.selectedAccount.confirmationNotes.filter(function (x) { return x.uri !== null; });\n angular.forEach(selectableContractNotes, function (cn, key) {\n cn.isSelected = selectAll;\n console.log(\"Set : \" + cn.isSelected);\n });\n if (selectAll === true) {\n this.scope.checkedItems = selectableContractNotes;\n }\n else {\n this.scope.checkedItems = [];\n }\n };\n ;\n ConfirmationNotesCtrl.prototype.isDownloadButtonDisabled = function () {\n return this.scope.checkedItems == undefined || this.scope.checkedItems.length <= 0;\n };\n ConfirmationNotesCtrl.prototype.toggleSelection = function (item, e) {\n e.stopPropagation();\n if (this.scope.checkedItems == undefined) {\n this.scope.checkedItems = [];\n }\n var idx = this.scope.checkedItems.indexOf(item);\n if (idx > -1) {\n this.scope.checkedItems.splice(idx, 1);\n }\n else {\n this.scope.checkedItems.push(item);\n }\n };\n ;\n ConfirmationNotesCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.$apply(function () {\n _this.scope.accounts = result;\n _this.scope.isLoading = false;\n });\n });\n };\n ConfirmationNotesCtrl.prototype.loadConfirmationNotes = function (accountId, startDate, endDate) {\n var _this = this;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n this.scope.startDate = startDate;\n this.scope.endDate = endDate;\n this.scope.generatedDate = new Date();\n this.scope.isLoading = true;\n this.scope.isDownloadReady = false;\n this.scope.hasData = false;\n this.scope.isError = false;\n this.portfolioService.getContractNotes(this.scope.selectedAccount.accountId, startDate, endDate)\n .then(function (result) {\n _this.scope.selectedAccount.confirmationNotes = result;\n _this.scope.isDownloadReady = true;\n _this.scope.hasData = true;\n _this.scope.isError = false;\n }, function (reason) {\n _this.scope.reportError = reason.data.message;\n _this.scope.hasData = false;\n _this.scope.isError = true;\n })\n .finally(function () {\n _this.scope.isLoading = false;\n });\n };\n ConfirmationNotesCtrl.prototype.downloadPdf = function () {\n console.info('Download PDF');\n var account = this.scope.selectedAccount;\n var startDate = this.scope.startDate;\n var endDate = this.scope.endDate;\n var fileName = this.getFileName(account.accountId, startDate, endDate);\n var filteredData = account.confirmationNotes;\n var sortedData = this.orderBy(filteredData, this.scope.predicate, this.scope.reverse);\n this.makePdf(sortedData, account, startDate, endDate, fileName + \".pdf\");\n };\n ConfirmationNotesCtrl.prototype.downloadCsv = function () {\n console.info('Download CSV');\n var account = this.scope.selectedAccount;\n var startDate = this.scope.startDate;\n var endDate = this.scope.endDate;\n var fileName = this.getFileName(account.accountId, startDate, endDate);\n var filteredData = account.confirmationNotes;\n var sortedData = this.orderBy(filteredData, this.scope.predicate, this.scope.reverse);\n this.makeCsv(sortedData, account, startDate, endDate, fileName);\n };\n ConfirmationNotesCtrl.prototype.downloadContractNote = function (item, e) {\n var _this = this;\n this.http.get(item.uri, { headers: { 'Accept': 'application/pdf' }, responseType: 'arraybuffer' })\n .then(function (response) {\n var blob = new Blob([response.data], { type: 'application/pdf' });\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\n // Open BLOB in IE and Edge\n window.navigator.msSaveOrOpenBlob(blob, item.prettyFileName);\n }\n else {\n // Open BLOB in Chrome, Firefox etc.\n var downloadLink = document.createElement('a');\n downloadLink.href = window.URL.createObjectURL(blob);\n downloadLink.target = '_blank';\n downloadLink.setAttribute('download', item.prettyFileName);\n document.body.appendChild(downloadLink);\n downloadLink.click();\n downloadLink.remove();\n }\n }, function (reason) {\n if (reason.status === 403) {\n _this.state.go('forbidden');\n }\n throw reason;\n });\n };\n ConfirmationNotesCtrl.prototype.download = function () {\n var _this = this;\n if (this.scope.checkedItems == undefined || this.scope.checkedItems.length <= 0) {\n return null;\n }\n this.scope.isDownloading = true;\n var filename = this.scope.selectedAccount.accountId + \"-\" + moment(new Date()).format(\"YYYY-MM-DD\") + \".zip\";\n this.bulkDownloadService.downloadItems(this.scope.checkedItems, filename)\n .finally(function () {\n _this.scope.isDownloading = false;\n });\n };\n ConfirmationNotesCtrl.prototype.orderBy = function (notes, predicate, reverse) {\n return this.scope.filter('orderBy')(notes, predicate, reverse);\n };\n ConfirmationNotesCtrl.prototype.makePdf = function (notes, account, startDate, endDate, filename) {\n var _this = this;\n filename = filename + \".pdf\";\n var nowDate = moment(new Date());\n var formattedData = this.getFormattedData(notes);\n var startDateStr = moment(startDate).format(\"D MMM YYYY\");\n var endDateStr = moment(endDate).format(\"D MMM YYYY\");\n var generatedAt = moment.tz(nowDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY');\n this.pdfBuilderService.newPdfBuilderInstance().then(function (pdfBuilder) {\n pdfBuilder.setTitle('Contract Notes')\n .setSubTitle(_this.scope.filter(\"accountName\")(account.designation ? account.accountName + ' ' + account.designation : account.accountName))\n .addHeaderTableRow('Adviser:', account.adviserName, '', '')\n .addHeaderTableRow('Account:', account.accountId, '', '')\n .addHeaderTableRow('From:', startDateStr, '', '')\n .addHeaderTableRow('To:', endDateStr, '', '')\n .addHeaderTableRow('Report Generated At:', generatedAt, '', '')\n .addTable('Contract Notes', formattedData, _this.getFields(), _this.getHeadings(), _this.getFormatHints())\n .setFilename(filename)\n .build();\n });\n };\n ConfirmationNotesCtrl.prototype.makeCsv = function (notes, account, startDate, endDate, filename) {\n filename = filename + \".csv\";\n var formattedData = this.getFormattedDataCsv(notes);\n var topLine = Patersons.ReportDownloadService.getCsvTopLine(account, new Date(), startDate, endDate, undefined);\n var csvBuilder = new Patersons.CsvBuilder();\n csvBuilder.setFilename(filename)\n .setTopLine(topLine)\n .setHeaders(this.getHeadings())\n .setData(formattedData)\n .build();\n };\n ConfirmationNotesCtrl.prototype.getFormattedDataCsv = function (data) {\n var _this = this;\n var formattedData = angular.copy(data);\n formattedData = formattedData.map(function (note) {\n var fields = _this.getFields();\n var data = {\n conNumber: note.conNumber,\n conDate: moment(note.conDate).format(\"DD/MM/YYYY\"),\n securityCode: note.securityCode,\n securityDescription: note.securityDescription,\n type: note.type,\n units: note.units,\n currencyCode: note.currencyCode,\n nett: note.nett\n };\n return fields.map(function (field) { return data[field]; });\n });\n return formattedData;\n };\n ConfirmationNotesCtrl.prototype.getFormattedData = function (data) {\n var formattedData = angular.copy(data);\n formattedData = formattedData.map(function (note) {\n return {\n conNumber: note.conNumber,\n conDate: moment(note.conDate).format(\"DD/MM/YYYY\"),\n securityCode: note.securityCode,\n securityDescription: note.securityDescription,\n type: note.type,\n units: note.units,\n currencyCode: note.currencyCode,\n nett: note.nett\n };\n });\n return formattedData;\n };\n ConfirmationNotesCtrl.prototype.getFileName = function (accountId, startDate, endDate) {\n var startDateStr = moment(startDate).format(\"YYYY-MM-DD\");\n var endDateStr = moment(endDate).format(\"YYYY-MM-DD\");\n return accountId + \"-ContractNotes-\" + startDateStr + \"_\" + endDateStr;\n };\n ConfirmationNotesCtrl.prototype.getFields = function () {\n return [\"conDate\", \"conNumber\", \"type\", \"units\", \"securityCode\", \"securityDescription\", \"currencyCode\", \"nett\"];\n };\n ConfirmationNotesCtrl.prototype.getFormatHints = function () {\n return [\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.None,\n Patersons.PdfFormatHint.Currency\n ];\n };\n ConfirmationNotesCtrl.prototype.getHeadings = function () {\n return [\"Date\", \"Number\", \"Type\", \"Units\", \"Security Code\", \"Description\", \"Currency\", \"Nett\"];\n };\n ConfirmationNotesCtrl.$inject = ['$q', '$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'bulkDownloadService', 'navigationService', 'pdfBuilderService'];\n return ConfirmationNotesCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.ConfirmationNotesCtrl = ConfirmationNotesCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n //export class MarketOrdersCtrl extends AbstractController {\n var MarketOrdersCtrl = (function (_super) {\n __extends(MarketOrdersCtrl, _super);\n function MarketOrdersCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, navigationService, pdfBuilderService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.getSummaryText = function () {\n var text = \"Report generated at \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\n \" AEST on \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".\";\n return text;\n };\n this.scope = $scope;\n this.scope.filter = $filter;\n this.scope.events = this;\n this.portfolioService = portfolioService;\n this.scope.accounts = new Array();\n this.scope.reverse = true;\n this.scope.predicate = \"orderDate\";\n this.pdfBuilderService = pdfBuilderService;\n this.scope.endDate = moment().toDate();\n this.scope.startDate = moment().subtract(30, 'days').toDate();\n this.scope.isError = false;\n this.scope.hasData = false;\n this.scope.csvData = [];\n this.load();\n }\n MarketOrdersCtrl.prototype.order = function (predicate) {\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\n this.scope.predicate = predicate;\n };\n MarketOrdersCtrl.prototype.hasOrdersInRange = function () {\n var start = moment(this.scope.startDate);\n var end = moment(this.scope.endDate);\n return this.scope.selectedAccount &&\n this.scope.selectedAccount.marketOrders &&\n this.scope.selectedAccount.marketOrders.some(function (m) { return moment(m.orderDate).isBetween(start, end, 'days', '[]'); });\n };\n MarketOrdersCtrl.prototype.buildTableBody = function (data, columns, headers) {\n var body = [];\n body.push(headers);\n data.forEach(function (row) {\n var dataRow = [];\n columns.forEach(function (column) {\n dataRow.push(row[column].toString());\n });\n body.push(dataRow);\n });\n return body;\n };\n MarketOrdersCtrl.prototype.table = function (data, columns, headers) {\n return {\n table: {\n headerRows: 1,\n body: this.buildTableBody(data, columns, headers)\n }\n };\n };\n MarketOrdersCtrl.prototype.downloadCsv = function () {\n console.info('Download CSV');\n var account = this.scope.selectedAccount;\n var startDate = this.scope.startDate;\n var endDate = this.scope.endDate;\n var fileName = this.getFileName();\n this.makeCsv(fileName);\n };\n MarketOrdersCtrl.prototype.makeCsv = function (filename) {\n var account = this.scope.selectedAccount;\n var startDate = this.scope.startDate;\n var endDate = this.scope.endDate;\n var topLine = Patersons.ReportDownloadService.getCsvTopLine(account, new Date(), startDate, endDate, undefined);\n var csvBuilder = new Patersons.CsvBuilder();\n csvBuilder.setFilename(filename)\n .setTopLine(topLine)\n .setHeaders(this.getHeadings())\n .setData(this.getFormattedData())\n .build();\n };\n MarketOrdersCtrl.prototype.getFields = function () {\n return [\"orderDate\", \"orderNumber\", \"orderStatus\", \"type\", \"quantity\", \"securityCode\", \"securityDescription\", \"limit\", \"quantityMatched\", \"quantityAllocated\", \"unfilled\"];\n };\n MarketOrdersCtrl.prototype.getHeadings = function () {\n return [\"Date\", \"Order Number\", \"Status\", \"Type\", \"Units\", \"Security Code\", \"Description\", \"Limit\", \"Matched\", \"Allocated\", \"Unbooked\"];\n };\n MarketOrdersCtrl.prototype.makeOrdersPdf = function (account, filename) {\n var _this = this;\n var rawData = this.scope.selectedAccount.marketOrders;\n var data = this.getFormattedDataPdf(rawData);\n var asAtDateStr = moment(new Date()).format(\"D MMM YYYY\");\n var startDate = moment(this.scope.startDate).format(\"D MMM YYYY\");\n var endDate = moment(this.scope.endDate).format(\"D MMM YYYY\");\n var timestamp = moment.tz(this.scope.generatedDate, 'Australia/Sydney').format(\"h:mm AEST a [on] D MMM YYYY\");\n this.pdfBuilderService.newPdfBuilderInstance().then(function (pdfBuilder) {\n pdfBuilder\n .setTitle('Market Orders')\n .addHeaderTableRow('Adviser:', account.adviserName, '', '')\n .addHeaderTableRow('Account:', account.accountId, '', '')\n .addHeaderTableRow('From Date:', moment.tz(startDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), '', '')\n .addHeaderTableRow('To Date:', moment.tz(endDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), '', '')\n .addHeaderTableRow('Report Generated at:', moment.tz(new Date(), 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), '', '')\n .addTable('Market Orders', data, _this.getRawHeader(), _this.getPdfHeader(), null, false)\n .setFilename(filename)\n .build();\n });\n };\n MarketOrdersCtrl.prototype.downloadPdf = function () {\n console.info('Download PDF');\n var fileName = this.getFileName();\n this.makeOrdersPdf(this.scope.selectedAccount, fileName);\n };\n MarketOrdersCtrl.prototype.getRawHeader = function () {\n return [\"orderDate\", \"orderNumber\", \"orderStatus\", \"type\", \"quantity\", \"securityCode\", \"securityDescription\", \"limit\", \"quantityMatched\", \"quantityAllocated\", \"unfilled\"]; //, \"accountNumber\", \"adviserCode\", \"reportTitle\", \"dateRangeSelected\"];\n };\n MarketOrdersCtrl.prototype.getPdfHeader = function () {\n /*return [\n { text: \"Date\", style: \"tableHeader\" },\n { text: \"Order Number\", style: \"tableHeader\" },\n { text: \"Status\", style: \"tableHeader\" },\n { text: \"Type\", style: \"tableHeader\" },\n { text: \"Units\", style: \"tableHeader\" },\n { text: \"Security Code\", style: \"tableHeader\" },\n { text: \"Description\", style: \"tableHeader\" },\n { text: \"Limit\", style: \"tableHeader\" },\n { text: \"Matched\", style: \"tableHeader\" },\n { text: \"Allocated\", style: \"tableHeader\" },\n { text: \"Unbooked\", style: \"tableHeader\" }\n ];*/\n return [\n \"Date\",\n \"Order Number\",\n \"Status\",\n \"Type\",\n \"Units\",\n \"Security Code\",\n \"Description\",\n \"Limit\",\n \"Matched\",\n \"Allocated\",\n \"Unbooked\"\n ];\n };\n MarketOrdersCtrl.prototype.getFileName = function () {\n var accountId = this.scope.selectedAccount.accountId;\n var startDate = moment(this.scope.startDate).format(\"YYYY-MM-DD\");\n var endDate = moment(this.scope.endDate).format(\"YYYY-MM-DD\");\n return accountId + \"-MarketOrders-\" + startDate + \"_\" + endDate;\n };\n MarketOrdersCtrl.prototype.getFormattedDataPdf = function (data) {\n var startDate = this.scope.startDate;\n var endDate = this.scope.endDate;\n var filtered = this.scope.filter('dateFilter')(data, 'orderDate', startDate, endDate);\n var pdfData = angular.copy(filtered);\n pdfData.map(function (order) {\n delete order.id;\n delete order.investorPortfolioId;\n order.orderDate = moment(order.orderDate).format(\"DD-MM-YYYY\");\n });\n return pdfData;\n };\n MarketOrdersCtrl.prototype.getFormattedData = function () {\n var data = this.scope.selectedAccount.marketOrders;\n var accountId = this.scope.selectedAccount.accountId;\n var accountName = this.scope.filter(\"accountName\")(this.scope.selectedAccount.designation ? this.scope.selectedAccount.accountName + ' ' + this.scope.selectedAccount.designation : this.scope.selectedAccount.accountName);\n var adviserCode = this.scope.selectedAccount.adviserCode;\n var startDate = this.scope.startDate;\n var endDate = this.scope.endDate;\n this.scope.filename = this.getFileName();\n var filtered = this.scope.filter('dateFilter')(data, 'orderDate', startDate, endDate);\n var csvData = angular.copy(filtered);\n var fields = this.getFields();\n csvData.map(function (order) {\n delete order.id;\n delete order.investorPortfolioId;\n order.orderDate = moment(order.orderDate).format(\"YYYY-MM-DD\");\n order.accountNumber = accountId;\n order.adviserCode = adviserCode;\n order.reportTitle = \"Market Orders for \" + accountName;\n order.dateRangeSelected = startDate + \" to \" + endDate;\n return fields.map(function (field) { return order[field]; });\n });\n return csvData;\n };\n MarketOrdersCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.$apply(function () {\n _this.scope.accounts = result;\n _this.scope.isLoading = false;\n });\n });\n };\n MarketOrdersCtrl.prototype.loadMarketOrders = function (accountId, startDate, endDate) {\n var _this = this;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n this.scope.startDate = startDate;\n this.scope.endDate = endDate;\n this.scope.generatedDate = new Date();\n this.scope.isError = false;\n this.scope.hasData = false;\n // Ensure the date range is inclusive\n this.scope.startDate.setHours(0, 0, 0, 0);\n this.scope.endDate.setHours(23, 59, 59, 0);\n this.scope.isLoading = true;\n this.scope.isDownloadReady = false;\n this.portfolioService.getMarketOrders(this.scope.selectedAccount.accountId)\n .then(function (result) {\n _this.scope.selectedAccount.marketOrders = result;\n _this.scope.isDownloadReady = true;\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n //this.scope.reportError = reason.data.message;\n _this.scope.selectedAccount.marketOrders = null;\n _this.scope.isDownloadReady = true;\n _this.scope.isError = true;\n _this.scope.hasData = false;\n })\n .finally(function () {\n _this.scope.isLoading = false;\n });\n };\n MarketOrdersCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'navigationService', 'pdfBuilderService'];\n return MarketOrdersCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.MarketOrdersCtrl = MarketOrdersCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var MarketDepthCtrl = (function (_super) {\n __extends(MarketDepthCtrl, _super);\n function MarketDepthCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.scope.events = this;\n this.portfolioService = portfolioService;\n }\n MarketDepthCtrl.prototype.load = function () {\n var _this = this;\n if (this.scope.securityCode == null || this.scope.securityCode == \"\") {\n return;\n }\n this.scope.isLoading = true;\n this.portfolioService.getOrderDepthData(this.scope.securityCode)\n .then(function (result) {\n _this.scope.marketDepthInformation = result;\n }).finally(function () {\n _this.scope.isLoading = false;\n });\n };\n MarketDepthCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService', 'navigationService'];\n return MarketDepthCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.MarketDepthCtrl = MarketDepthCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n //export class ReportViewCtrl extends AbstractController {\n var ReportViewCtrl = (function (_super) {\n __extends(ReportViewCtrl, _super);\n function ReportViewCtrl($q, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService, reportService, reportDownloadService, bulkDownloadService, navigationService, userCompanyService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.renderReport = function () {\n var _this = this;\n this.scope.isRendering = true;\n this.scope.isDownloadReady = false;\n this.scope.isError = false;\n this.scope.hasData = false;\n this.scope.initialReportGenerated = true;\n this.scope.showNewReportBtn = true;\n if (this.scope.reportType === \"TaxReports\" || this.scope.reportType === \"QuarterlyReports\" || this.scope.reportType === \"InvoiceReports\") {\n this.scope.hidePdf = true;\n this.scope.hideCsv = true;\n }\n else {\n this.scope.hidePdf = false;\n this.scope.hideCsv = false;\n }\n this.reportService.getReport(this.scope.reportType, this.scope.selectedAccount.accountId, this.scope.startDate, this.scope.endDate)\n .then(function (result) {\n _this.scope.report = result;\n _this.scope.generatedDateTime = moment.tz(_this.scope.report.creationDateUtc, 'Australia/Sydney').format('h:mm a');\n _this.scope.generatedDate = moment(_this.scope.report.creationDateUtc).tz('Australia/Sydney').toDate();\n _this.scope.isDownloadReady = true;\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n _this.scope.isError = true;\n _this.scope.hasData = false;\n })\n .finally(function () {\n _this.scope.reportStartDate = _this.scope.startDate;\n _this.scope.reportEndDate = _this.scope.endDate;\n _this.scope.isRendering = false;\n });\n };\n this.q = $q;\n this.scope = $scope;\n this.scope.events = this;\n this.portfolioService = portfolioService;\n this.reportService = reportService;\n this.reportDownloadService = reportDownloadService;\n this.bulkDownloadService = bulkDownloadService;\n this.scope.loaded = null;\n this.scope.accounts = new Array();\n this.scope.currentPage = this.state.current.name;\n this.scope.endDate = moment().toDate();\n this.scope.startDate = moment().subtract(1, 'year').toDate();\n this.scope.showNewReportBtn = true;\n this.scope.isError = false;\n this.scope.hasData = false;\n this.scope.searchtextRun = \"Run another report\";\n this.scope.searchtext = {\n open: \"Run another report\",\n close: \"Hide report form\"\n };\n this.scope.isPreselected = false;\n this.scope.collapsedBanner = false;\n if ($stateParams.hasAccoladeAccounts) {\n this.scope.hasAccoladeAccounts = $stateParams.hasAccoladeAccounts;\n }\n else {\n this.scope.hasAccoladeAccounts = null;\n }\n if ($stateParams.collapsedBanner == true) {\n this.scope.collapsedBanner = true;\n this.scope.loaded = true;\n }\n if (this.state.current.name == \"report.tax\") {\n this.scope.isPreselected = true;\n this.scope.reportType = \"TaxReports\";\n }\n else if (this.state.current.name == \"report.quarterly\") {\n this.scope.isPreselected = true;\n this.scope.reportType = \"QuarterlyReports\";\n }\n else if (this.state.current.name == \"report.invoices\") {\n this.scope.isPreselected = true;\n this.scope.reportType = \"InvoiceReports\";\n }\n if (this.scope.isPreselected) {\n this.scope.loaded = true;\n this.scope.collapsedBanner = true;\n this.scope.searchtextRun = \"Run another search\";\n this.scope.searchtext = {\n open: \"Run another search\",\n close: \"Hide search form\"\n };\n }\n this.scope.hideCsv = false;\n this.scope.hidePdf = false;\n if (!this.scope.loaded) {\n this.scope.loaded = false;\n }\n userCompanyService.getUserCompany().then(function (company) {\n _this.scope.userCompany = company;\n });\n this.load();\n }\n ReportViewCtrl.prototype.load = function () {\n var _this = this;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.loaded = true;\n _this.scope.$apply(function () {\n _this.scope.accounts = result.filter(function (r) { return r.accountType == \"Accolade\"; });\n _this.scope.hasAccoladeAccounts = _this.scope.accounts.some(function (a) { return a.isAccolade; });\n if (_this.scope.isPreselected && !_this.scope.hasAccoladeAccounts) {\n _this.scope.collapsedBanner = false;\n _this.state.go('report');\n }\n });\n });\n };\n ;\n ReportViewCtrl.prototype.setSelectedAccount = function (accountId) {\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n console.info('selected account id: ' + this.scope.selectedAccount.accountId);\n this.scope.isError = false;\n console.log(this.scope.selectedAccount);\n this.scope.hasData = false;\n };\n ReportViewCtrl.prototype.toggleNewReportBtn = function () {\n this.scope.showNewReportBtn = !this.scope.showNewReportBtn;\n };\n ReportViewCtrl.prototype.setFromDate = function (fromDate) {\n this.scope.startDate = fromDate;\n console.info('from date: ' + this.scope.startDate);\n };\n ReportViewCtrl.prototype.setToDate = function (toDate) {\n this.scope.endDate = toDate;\n console.info('to date: ' + this.scope.endDate);\n };\n ReportViewCtrl.prototype.setReportType = function (reportType) {\n this.scope.reportType = reportType;\n console.info('report types: ' + this.scope.reportType);\n this.scope.isError = false;\n this.scope.hasData = false;\n };\n Object.defineProperty(ReportViewCtrl.prototype, \"showFromDate\", {\n get: function () {\n if (this.scope.reportType === Patersons.ReportType.UnrealisedCapitalGains.toString()) {\n return false;\n }\n else if (this.scope.reportType === Patersons.ReportType.Valuation.toString()) {\n return false;\n }\n else {\n return true;\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ReportViewCtrl.prototype, \"toDateLabel\", {\n get: function () {\n return this.showFromDate ? 'To:' : 'As at:';\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ReportViewCtrl.prototype, \"dateRangeLabel\", {\n get: function () {\n if (this.showFromDate) {\n var fromDateString = moment(this.scope.report.dateFrom).format('D MMM YYYY');\n var toDateString = moment(this.scope.report.dateTo).format('D MMM YYYY');\n return \"From \" + fromDateString + \" to \" + toDateString;\n }\n else {\n var asAtDateString = moment(this.scope.report.asAtDate).format('D MMM YYYY');\n return \"As at: \" + asAtDateString;\n }\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(ReportViewCtrl.prototype, \"areReportComponentsVisible\", {\n get: function () {\n return this.scope.report != null && this.scope.report.reportType.toString() == this.scope.reportType;\n },\n enumerable: true,\n configurable: true\n });\n ReportViewCtrl.prototype.downloadPdf = function () {\n console.info('Download PDF');\n this.reportDownloadService.downloadPdfFile(this.scope.report, this.scope.selectedAccount);\n };\n ReportViewCtrl.prototype.downloadCsv = function () {\n console.info('Download CSV');\n this.reportDownloadService.downloadCsvFile(this.scope.report, this.scope.selectedAccount);\n };\n ReportViewCtrl.prototype.downloadInvestorDocuments = function (investorDocs) {\n var _this = this;\n if (investorDocs.length <= 0) {\n return;\n }\n this.scope.isDownloading = true;\n var filename = this.scope.selectedAccount.accountId + \"-\" + moment(new Date()).format(\"YYYY-MM-DD\") + \".zip\";\n this.bulkDownloadService.downloadItems(investorDocs, filename)\n .finally(function () {\n _this.scope.isDownloading = false;\n });\n };\n ReportViewCtrl.$inject = ['$q', '$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService', 'reportService', 'reportDownloadService', 'bulkDownloadService', 'navigationService', 'userCompanyService'];\n return ReportViewCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.ReportViewCtrl = ReportViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n //export class LedgerViewCtrl extends AbstractController {\n var LedgerViewCtrl = (function (_super) {\n __extends(LedgerViewCtrl, _super);\n function LedgerViewCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, reportService, reportDownloadService, portfolioService, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.renderLedger = function (accountId, startDate, endDate) {\n var _this = this;\n this.scope.selectedAccount = this.scope.accounts.filter(function (a) { return a.accountId == accountId; })[0];\n this.scope.startDate = startDate;\n this.scope.endDate = endDate;\n this.scope.generatedDate = new Date();\n this.scope.isRendering = true;\n this.scope.isDownloadReady = false;\n this.scope.isError = false;\n this.scope.hasData = false;\n this.reportService.getReport(Patersons.ReportType.StandardLedger, this.scope.selectedAccount.accountId, this.scope.startDate, this.scope.endDate)\n .then(function (result) {\n _this.scope.report = result;\n _this.scope.isDownloadReady = true;\n _this.scope.isError = false;\n _this.scope.hasData = true;\n }, function (reason) {\n //this.scope.reportError = reason.data.message;\n _this.scope.report = null;\n _this.scope.isDownloadReady = true;\n _this.scope.isError = true;\n _this.scope.hasData = false;\n })\n .finally(function () {\n _this.scope.isRendering = false;\n });\n };\n this.getSummaryText = function () {\n var text = \"Report generated at \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\n \" AEST on \" +\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".\";\n return text;\n };\n this.scope = $scope;\n this.scope.events = this;\n this.reportService = reportService;\n this.reportDownloadService = reportDownloadService;\n this.portfolioService = portfolioService;\n this.scope.isError = false;\n this.scope.hasData = false;\n this.load();\n this.scope.endDate = moment().toDate();\n this.scope.startDate = moment().subtract(30, 'days').toDate();\n }\n LedgerViewCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isRendering = true;\n this.portfolioService.getCombinedPortfolioData()\n .then(function (result) {\n _this.scope.$apply(function () {\n _this.scope.accounts = result;\n _this.scope.isRendering = false;\n });\n });\n };\n LedgerViewCtrl.prototype.downloadPdf = function () {\n console.info('Download PDF');\n this.reportDownloadService.downloadPdfFile(this.scope.report, this.scope.selectedAccount);\n };\n LedgerViewCtrl.prototype.downloadCsv = function () {\n console.info('Download CSV');\n this.reportDownloadService.downloadCsvFile(this.scope.report, this.scope.selectedAccount);\n };\n LedgerViewCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'reportService', 'reportDownloadService', 'portfolioService', 'navigationService'];\n return LedgerViewCtrl;\n }(Patersons.PortfolioBaseCtrl));\n Patersons.LedgerViewCtrl = LedgerViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var XrayCtrl = (function (_super) {\n __extends(XrayCtrl, _super);\n function XrayCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.load();\n }\n XrayCtrl.prototype.load = function () {\n this.log.info(\"Xray Ctrl loading...\");\n var portfolio_xray = {\n name: 'demo portfolio 1',\n totalValue: 10000,\n currencyId: 'USD',\n holdings: [{\n identifier: 'AU000000SFY4',\n identifierType: 'ISIN',\n weight: 50\n }, {\n identifier: 'AU000000VAP7',\n identifierType: 'ISIN',\n weight: 30\n }, {\n identifier: 'AU000000BHP4',\n identifierType: 'ISIN',\n weight: 10\n }, {\n identifier: 'AU60PLA00028',\n identifierType: 'ISIN',\n weight: 10\n }],\n benchmark: {\n holdings: [{\n identifier: 'XIUSA04GJ2',\n identifierType: 'MSID',\n weight: 100\n }]\n }\n };\n rootMorningstarPromise().then(function (promiseChain) {\n console.log(\"initializing component\");\n initComponent('component-xray', 'ec-xray-container', 'ec-xray', 'ecXrayPats').then(function () {\n morningstar.asterix.instanceRegistry.get('ecXrayPats').setParameter('portfolio', portfolio_xray);\n });\n });\n };\n XrayCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\n return XrayCtrl;\n }(Patersons.AbstractController));\n Patersons.XrayCtrl = XrayCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var UATPortfolioCompareCtrl = (function (_super) {\n __extends(UATPortfolioCompareCtrl, _super);\n function UATPortfolioCompareCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.scope = $scope;\n this.load();\n }\n UATPortfolioCompareCtrl.prototype.load = function () {\n this.log.info(\"UATPortfolioCompare Ctrl loading...\");\n var portfolioDemo = {\n \"current\": {\n \"name\": \"demo portfolio 1\",\n \"totalValue\": 10000,\n \"currencyId\": \"AUD\",\n \"holdings\": [\n {\n \"identifier\": \"AU000000SFY4\",\n \"identifierType\": \"ISIN\",\n \"weight\": 50\n },\n {\n \"identifier\": \"AU000000VAP7\",\n \"identifierType\": \"ISIN\",\n \"weight\": 50\n }\n ],\n \"benchmark\": {\n \"holdings\": [\n {\n \"identifier\": \"XIUSA04GJ2\",\n \"identifierType\": \"MSID\",\n \"weight\": 100\n }\n ]\n }\n },\n \"proposed\": {\n \"name\": \"demo portfolio 2\",\n \"totalValue\": 10000,\n \"currencyId\": \"AUD\",\n \"holdings\": [\n {\n \"identifier\": \"AU000000SFY4\",\n \"identifierType\": \"ISIN\",\n \"weight\": 50\n },\n {\n \"identifier\": \"AU000000VAP7\",\n \"identifierType\": \"ISIN\",\n \"weight\": 30\n },\n {\n \"identifier\": \"AU000000BHP4\",\n \"identifierType\": \"ISIN\",\n \"weight\": 10\n },\n {\n \"identifier\": \"AU60PLA00028\",\n \"identifierType\": \"ISIN\",\n \"weight\": 10\n }\n ],\n \"benchmark\": {\n \"holdings\": [\n {\n \"identifier\": \"XIUSA04GJ2\",\n \"identifierType\": \"MSID\",\n \"weight\": 100\n }\n ]\n }\n }\n };\n rootMorningstarPromise().then(function (promiseChain) {\n console.log(\"initializing component\");\n initComponent('component-container', 'ec-portfolio-compare-container', 'ec-portfolio-compare', 'ecPortfolioCompare').then(function () {\n morningstar.asterix.instanceRegistry.find(\"ecPortfolioCompare\").setParameter(\"portfolio\", portfolioDemo);\n });\n });\n };\n UATPortfolioCompareCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\n return UATPortfolioCompareCtrl;\n }(Patersons.AbstractController));\n Patersons.UATPortfolioCompareCtrl = UATPortfolioCompareCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar portfolioModule = angular.module(\"app.portfolioModule\", []);\nportfolioModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.portfolioModule config...');\n $stateProvider\n .state(\"dashboard\", {\n url: \"/dashboard\",\n templateUrl: \"assets/templates/portfolioSummary/dashboard.html\",\n controller: 'portfolioDashboardCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Dashboard\" };\n }],\n }\n })\n .state(\"portfolioHeatmap\", {\n url: \"/portfolioHeatmap\",\n templateUrl: \"assets/templates/portfolioSummary/portfolioHeatmap.html\",\n controller: 'portfolioHeatmapCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Heatmap\" };\n }],\n }\n })\n .state(\"portfolioSnapshot\", {\n url: \"/portfolioSnapshot\",\n templateUrl: \"assets/templates/portfolioSummary/portfolioSnapshot.html\",\n controller: 'portfolioSnapshotCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Snapshot\" };\n }],\n }\n })\n .state(\"viewPortfolio\", {\n url: \"/portfolioOverview?accountId\",\n templateUrl: \"assets/templates/PortfolioSummary/portfolioOverview.html\",\n controller: 'portfolioViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Portfolio Overview\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"comparePortfolios\", {\n url: \"/comparePortfolios\",\n templateUrl: \"assets/templates/PortfolioSummary/compare.html\",\n controller: 'portfolioCompareCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Portfolio Compare\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"stockReport\", {\n url: \"/stockReport?secId\",\n templateUrl: \"assets/templates/PortfolioSummary/stockReport.html\",\n controller: 'stockReportCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Stock Report\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"fundReport\", {\n url: \"/fundReport?secId\",\n templateUrl: \"assets/templates/PortfolioSummary/fundReport.html\",\n controller: 'fundReportCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Fund Report\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"etfReport\", {\n url: \"/etfReport?secId\",\n templateUrl: \"assets/templates/PortfolioSummary/etfReport.html\",\n controller: 'etfReportCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"ETF Report\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"holdings\", {\n url: \"/holdings\",\n templateUrl: \"assets/templates/PortfolioSummary/holdings.html\",\n controller: 'holdingsCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Holdings\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n },\n params: {\n accountId: null,\n autoDownloadPDF: null,\n asAt: null\n }\n })\n .state('incomeProjection', {\n url: '/incomeProjection',\n templateUrl: 'assets/templates/PortfolioSummary/IncomeProjection.html'\n })\n .state('confirmationNotes', {\n url: '/confirmationNotes',\n templateUrl: 'assets/templates/portfolioSummary/confirmationNotes.html',\n controller: \"confirmationNotesCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Confirmation Notes\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state('marketOrders', {\n url: '/marketOrders',\n templateUrl: 'assets/templates/PortfolioSummary/marketOrders.html',\n controller: \"marketOrdersCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Market Orders\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"placeOrderRequest\", {\n url: \"/placeOrderRequest\",\n templateUrl: \"assets/templates/portfolioSummary/placeOrderRequest.html\",\n controller: \"placeOrderRequestViewCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Place Order Request\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"viewOrderRequests\", {\n url: \"/viewOrderRequests\",\n templateUrl: \"assets/templates/portfolioSummary/viewOrderRequests.html\",\n controller: \"viewOrderRequestsViewCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"View Order Requests\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"report\", {\n url: \"/report\",\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\n controller: 'reportViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Accolade Reports\" };\n }],\n },\n params: {\n hasAccoladeAccounts: null,\n collapsedBanner: null,\n },\n })\n .state(\"report.quarterly\", {\n url: \"/quarterly\",\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\n controller: 'reportViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Accolade Quarterly Reports\" };\n }],\n },\n params: {\n hasAccoladeAccounts: null,\n },\n })\n .state(\"report.tax\", {\n url: \"/tax\",\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\n controller: 'reportViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Accolade Tax Reports\" };\n }],\n },\n params: {\n hasAccoladeAccounts: null,\n },\n })\n .state(\"report.invoices\", {\n url: \"/invoices\",\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\n controller: 'reportViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Accolade Invoices\" };\n }],\n },\n params: {\n hasAccoladeAccounts: null,\n },\n })\n .state(\"marketDepth\", {\n url: \"/marketDepth\",\n templateUrl: \"assets/templates/portfolioSummary/marketDepth.html\",\n controller: 'marketDepthCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Market Depth\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"ledger\", {\n url: \"/ledger\",\n templateUrl: \"assets/templates/portfolioSummary/ledger.html\",\n controller: \"ledgerViewCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Ledger\" };\n }],\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"uatxray\", {\n url: \"/uatxray\",\n templateUrl: \"assets/templates/portfolioSummary/uat_xray.html\",\n controller: \"xrayCtrl\",\n resolve: {\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n })\n .state(\"uatportfoliocompare\", {\n url: \"/uatportfoliocompare\",\n templateUrl: \"assets/templates/portfolioSummary/uat_portfolioCompare.html\",\n controller: \"uatPortfolioCompareCtrl\",\n resolve: {\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n var profile = sessionService.getCurrentUserProfile();\n if (profile) {\n deferred.resolve();\n }\n else {\n deferred.reject();\n }\n return deferred.promise;\n }]\n }\n });\n }]);\nportfolioModule.controller('portfolioBaseCtrl', Patersons.PortfolioBaseCtrl);\nportfolioModule.controller('portfolioDashboardCtrl', Patersons.PortfolioDashboardCtrl);\nportfolioModule.controller('portfolioHeatmapCtrl', Patersons.PortfolioHeatmapCtrl);\nportfolioModule.controller('portfolioSnapshotCtrl', Patersons.PortfolioSnapshotCtrl);\nportfolioModule.controller('portfolioViewCtrl', Patersons.PortfolioViewCtrl);\nportfolioModule.controller('portfolioCompareCtrl', Patersons.PortfolioCompareCtrl);\nportfolioModule.controller('stockReportCtrl', Patersons.StockReportCtrl);\nportfolioModule.controller('fundReportCtrl', Patersons.FundReportCtrl);\nportfolioModule.controller('etfReportCtrl', Patersons.EtfReportCtrl);\nportfolioModule.controller('holdingsCtrl', Patersons.HoldingsCtrl);\nportfolioModule.controller('confirmationNotesCtrl', Patersons.ConfirmationNotesCtrl);\nportfolioModule.controller('marketOrdersCtrl', Patersons.MarketOrdersCtrl);\nportfolioModule.controller('placeOrderRequestViewCtrl', Patersons.PlaceOrderRequestViewCtrl);\nportfolioModule.controller('viewOrderRequestsViewCtrl', Patersons.ViewOrderRequestsViewCtrl);\nportfolioModule.controller('reportViewCtrl', Patersons.ReportViewCtrl);\nportfolioModule.controller('ledgerViewCtrl', Patersons.LedgerViewCtrl);\nportfolioModule.controller('marketDepthCtrl', Patersons.MarketDepthCtrl);\nportfolioModule.controller('xrayCtrl', Patersons.XrayCtrl);\nportfolioModule.controller('uatPortfolioCompareCtrl', Patersons.UATPortfolioCompareCtrl);\nportfolioModule.component('investorDocs', new Patersons.InvestorDocsComponent());\nportfolioModule.component('reportTypeSelect', new Patersons.ReportTypeSelectComponent());\nportfolioModule.component('accountDateRangeFilter', new Patersons.AccountDateRangeFilterComponent());\nportfolioModule.component('portfolioSummary', new Patersons.PortfolioSummaryComponent());\nportfolioModule.component('incomeReport', new Patersons.IncomeReportComponent());\nportfolioModule.component('cashReport', new Patersons.CashReportComponent());\nportfolioModule.component('capitalTransactionStatement', new Patersons.CapitalTransactionStatementComponent());\nportfolioModule.component('standardLedgerReport', new Patersons.StandardLedgerReportComponent());\nportfolioModule.component('performanceReport', new Patersons.PerformanceReportComponent());\nportfolioModule.component('portfolioGraph', new Patersons.PortfolioGraphComponent());\nportfolioModule.component('realisedCapitalGainsReport', new Patersons.RealisedCapitalGainsReportComponent());\nportfolioModule.component('unrealisedCapitalGainsReport', new Patersons.UnrealisedCapitalGainsReportComponent());\nportfolioModule.component('valuationReport', new Patersons.ValuationStatementComponent());\nportfolioModule.component('marketValueReport', new Patersons.MarketValueReportComponent());\nportfolioModule.component('reportDisclaimer', new Patersons.ReportDisclaimerComponent());\nportfolioModule.component('holdingsDisclaimer', new Patersons.HoldingsDisclaimerComponent());\nportfolioModule.component('cashHoldingsReport', new Patersons.CashHoldingsReportComponent());\nportfolioModule.component('cashHighInterestHoldingsReport', new Patersons.CashHighInterestHoldingsReportComponent());\nportfolioModule.component('termDepositsHoldingsReport', new Patersons.TermDepositsHoldingsReportComponent());\nportfolioModule.component('equityHoldingsReport', new Patersons.EquityHoldingsReportComponent());\nportfolioModule.component('totalMarketValue', new Patersons.TotalMarketValueComponent());\nportfolioModule.component('portfolioNavigation', new Patersons.PortfolioNavigationComponent());\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ChangeRequestBaseCtrl = (function (_super) {\n __extends(ChangeRequestBaseCtrl, _super);\n function ChangeRequestBaseCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\n this.navigationService = navigationService;\n this.navigationService.deactivateAll();\n }\n ChangeRequestBaseCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\n return ChangeRequestBaseCtrl;\n }(Patersons.AbstractController));\n Patersons.ChangeRequestBaseCtrl = ChangeRequestBaseCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ChangeRequestViewCtrl = (function (_super) {\n __extends(ChangeRequestViewCtrl, _super);\n function ChangeRequestViewCtrl($scope, $uibModal, $log, $location, $window, $state, $stateParams, $http, $rootScope, changeRequestService, tokenService, navigationService, identityService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.rootScope = $rootScope;\n this.changeRequestService = changeRequestService;\n this.tokenService = tokenService;\n this.identityService = identityService;\n this.scope.events = this;\n this.scope.currentIndex = 0;\n this.scope.isBusy = false;\n this.modal = $uibModal;\n this.load();\n }\n ChangeRequestViewCtrl.prototype.load = function () {\n var _this = this;\n this.scope.isLoading = true;\n this.scope.hasChangeRequests = false;\n this.changeRequestService.getChangeRequestsForApproval()\n .then(function (result) {\n _this.scope.changeRequests = result;\n if (_this.scope.changeRequests && _this.scope.changeRequests.length > 0) {\n _this.scope.hasChangeRequests = true;\n }\n else {\n return;\n }\n _this.setCurrentChangeRequest(0);\n }, function (error) {\n _this.scope.isError = true;\n _this.scope.isLoading = false;\n }).finally(function () {\n _this.scope.isLoading = false;\n });\n };\n ChangeRequestViewCtrl.prototype.goToPreviousChangeRequest = function () {\n this.scope.currentIndex -= 1;\n if (this.scope.currentIndex < 0) {\n this.scope.currentIndex = 0;\n ;\n }\n this.setCurrentChangeRequest(this.scope.currentIndex);\n };\n ChangeRequestViewCtrl.prototype.goToNextChangeRequest = function () {\n this.scope.currentIndex += 1;\n if (this.scope.currentIndex >= this.scope.changeRequests.length) {\n this.scope.currentIndex = this.scope.changeRequests.length - 1;\n }\n this.setCurrentChangeRequest(this.scope.currentIndex);\n };\n ChangeRequestViewCtrl.prototype.approveChangeRequest = function () {\n var _this = this;\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.identityService.getIsPhoneNumberVerifyed().\n then(function (phone_number_verified) {\n if (phone_number_verified !== true) {\n _this.scope.submissionFailedVerifyPhoneNumber = true;\n return;\n }\n var modalPopup = _this.modal.open({\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\n controller: Patersons.ApproveChangeRequestCtrl,\n keyboard: false,\n backdrop: 'static',\n resolve: {\n changeRequestId: _this.scope.currentChangeRequest.id\n }\n });\n modalPopup.result\n .then(function (result) {\n if (result === true) {\n _this.scope.currentChangeRequest.isApproved = true;\n _this.setApprovalStatusDescription(_this.scope.currentChangeRequest);\n _this.rootScope.$emit('changeRequestActioned', null);\n }\n }, function (error) {\n _this.scope.isError = true;\n _this.scope.isLoading = false;\n });\n });\n /*if (this.tokenService.tokenManager.profile.phone_number_verified !== 'true') {\n this.scope.submissionFailedVerifyPhoneNumber = true;\n return;\n }\n \n var modalPopup = this.modal.open({\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\n controller: ApproveChangeRequestCtrl,\n keyboard: false,\n backdrop: 'static',\n resolve: {\n changeRequestId: this.scope.currentChangeRequest.id\n }\n });\n \n modalPopup.result\n .then((result) => {\n if (result === true) {\n this.scope.currentChangeRequest.isApproved = true;\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\n this.rootScope.$emit('changeRequestActioned', null);\n }\n }, (error) => { // error handling\n this.scope.isError = true;\n this.scope.isLoading = false;\n });*/\n };\n ChangeRequestViewCtrl.prototype.rejectChangeRequest = function () {\n var _this = this;\n this.scope.isBusy = true;\n this.scope.currentChangeRequest.isRejected = true;\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\n this.changeRequestService.rejectChangeRequest(this.scope.currentChangeRequest.id)\n .then(function (result) {\n _this.rootScope.$emit('changeRequestActioned', null);\n }, function (error) {\n _this.scope.isError = true;\n _this.scope.isLoading = false;\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n ChangeRequestViewCtrl.prototype.setCurrentChangeRequest = function (index) {\n this.scope.submissionFailedVerifyPhoneNumber = false;\n this.scope.currentChangeRequest = this.scope.changeRequests[index];\n this.setChangeRequestTypeDescription(this.scope.currentChangeRequest);\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\n this.constructOriginalDataObject(this.scope.currentChangeRequest);\n this.constructModifiedDataObject(this.scope.currentChangeRequest);\n };\n ChangeRequestViewCtrl.prototype.constructOriginalDataObject = function (changeRequest) {\n this.scope.originalData = null;\n this.scope.originalDataKeys = null;\n if (changeRequest.originalData === null) {\n return;\n }\n this.scope.originalData = JSON.parse(changeRequest.originalData);\n this.scope.originalDataKeys = Object.keys(this.scope.originalData);\n };\n ChangeRequestViewCtrl.prototype.constructModifiedDataObject = function (changeRequest) {\n this.scope.modifiedData = null;\n this.scope.modifiedDataKeys = null;\n if (changeRequest.modifiedData === null) {\n return;\n }\n this.scope.modifiedData = JSON.parse(changeRequest.modifiedData);\n this.scope.modifiedDataKeys = Object.keys(this.scope.modifiedData);\n };\n ChangeRequestViewCtrl.prototype.setApprovalStatusDescription = function (changeRequest) {\n if (changeRequest.isApproved) {\n changeRequest.approvalStatusDescription = 'Approved';\n }\n else if (changeRequest.isRejected) {\n changeRequest.approvalStatusDescription = 'Rejected';\n }\n else {\n changeRequest.approvalStatusDescription = 'Pending';\n }\n };\n ChangeRequestViewCtrl.prototype.setChangeRequestTypeDescription = function (changeRequest) {\n switch (changeRequest.changeRequestType) {\n case 'AccoladeOptions':\n changeRequest.changeRequestTypeDescription = 'Accolade Options';\n break;\n case 'AddressDetails':\n changeRequest.changeRequestTypeDescription = 'Address Details';\n break;\n case 'RegistrationAddressDetails':\n changeRequest.changeRequestTypeDescription = 'Registration Address Details';\n break;\n case 'AccountEmailAddress':\n changeRequest.changeRequestTypeDescription = 'Account Email Address';\n break;\n case 'ContractNoteEmailAddress':\n changeRequest.changeRequestTypeDescription = 'Contract Note Email Address';\n break;\n case 'PhoneNumbers':\n changeRequest.changeRequestTypeDescription = 'Phone Numbers';\n break;\n case 'BankAccountDetails':\n changeRequest.changeRequestTypeDescription = 'Bank Account Details';\n break;\n case 'TaxFileNumber':\n changeRequest.changeRequestTypeDescription = 'Tax File Number';\n break;\n default:\n changeRequest.changeRequestTypeDescription = changeRequest.changeRequestType;\n }\n };\n ChangeRequestViewCtrl.$inject = ['$scope', '$uibModal', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'changeRequestService', 'tokenService', 'navigationService', 'identityService'];\n return ChangeRequestViewCtrl;\n }(Patersons.ChangeRequestBaseCtrl));\n Patersons.ChangeRequestViewCtrl = ChangeRequestViewCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar changeRequestModule = angular.module(\"app.changeRequestModule\", []);\nchangeRequestModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.changeRequestModule config...');\n $stateProvider\n .state(\"changeRequests\", {\n url: \"/changeRequests\",\n templateUrl: \"assets/templates/changeRequests/changeRequest.html\",\n controller: 'changeRequestViewCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Account Information Change Requests\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n });\n }]);\nchangeRequestModule.controller('changeRequestBaseCtrl', Patersons.ChangeRequestBaseCtrl);\nchangeRequestModule.controller('changeRequestViewCtrl', Patersons.ChangeRequestViewCtrl);\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var VerifyPhoneCtrl = (function () {\n function VerifyPhoneCtrl($scope, $location, $window, $state, $stateParams, $http, identityService) {\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.scope.events = this;\n var userId = $stateParams.userId;\n }\n VerifyPhoneCtrl.prototype.save = function () {\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.phoneForm.$invalid) {\n return;\n }\n alert('checking phone...');\n };\n VerifyPhoneCtrl.$inject = ['$scope', '$location', '$window', '$state', '$stateParams', '$http', 'identityService'];\n return VerifyPhoneCtrl;\n }());\n Patersons.VerifyPhoneCtrl = VerifyPhoneCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ChangePasswordCtrl = (function (_super) {\n __extends(ChangePasswordCtrl, _super);\n function ChangePasswordCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, identityService, navigationService) {\n var _this = this;\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.onValidation = function (isValid) {\n if (_this.scope) {\n _this.scope.isValidPassword = isValid;\n }\n };\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.identityService = identityService;\n this.scope.events = this;\n this.scope.passwordInputType = \"password\";\n this.scope.isBusy = false;\n this.scope.changePasswordDetails = new Patersons.ChangePasswordDetails;\n }\n ChangePasswordCtrl.prototype.togglePasswordVisibility = function () {\n if (this.scope.passwordInputType === \"password\") {\n this.scope.passwordInputType = \"text\";\n }\n else {\n this.scope.passwordInputType = \"password\";\n }\n };\n ChangePasswordCtrl.prototype.changePassword = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.changePasswordForm.$invalid) {\n return;\n }\n this.scope.isBusy = true;\n this.identityService.changePassword(this.scope.changePasswordDetails)\n .then(function (result) {\n location.href = '/dashboard';\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n ChangePasswordCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'identityService', 'navigationService'];\n return ChangePasswordCtrl;\n }(Patersons.IdentityBaseCtrl));\n Patersons.ChangePasswordCtrl = ChangePasswordCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};\nvar Patersons;\n(function (Patersons) {\n var ChangeEmailCtrl = (function (_super) {\n __extends(ChangeEmailCtrl, _super);\n function ChangeEmailCtrl($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, identityService, navigationService, tokenService, sessionService) {\n _super.call(this, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\n this.scope = $scope;\n this.location = $location;\n this.window = $window;\n this.state = $state;\n this.stateParams = $stateParams;\n this.http = $http;\n this.identityService = identityService;\n this.tokenService = tokenService;\n this.scope.profile = this.tokenService.tokenManager.profile;\n if (!this.scope.profile) {\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\n this.tokenService.tokenManager.redirectForToken();\n }\n this.scope.events = this;\n this.scope.isBusy = false;\n this.scope.emailChanged = false;\n this.scope.profileAddressDetails = new Patersons.ProfileAddress;\n this.scope.changeEmailForm = { form: null };\n this.scope.changeEmailDetails = new Patersons.ChangeEmailDetails;\n this.scope.changeEmailDetails.newEmail = this.scope.profile.email;\n this.load();\n }\n ChangeEmailCtrl.prototype.load = function () {\n var _this = this;\n var promise = this.identityService.getUserAddressDetails();\n promise.then(function (result) {\n _this.scope.profileAddressDetails.addressLine1 = result[\"addressLine1\"];\n _this.scope.profileAddressDetails.addressLine2 = result[\"addressLine2\"];\n _this.scope.profileAddressDetails.addressLine3 = result[\"addressLine3\"];\n _this.scope.profileAddressDetails.addressLine4 = result[\"addressLine4\"];\n _this.scope.profileAddressDetails.postcode = result[\"postcode\"];\n _this.scope.profileAddressDetails.country = result[\"country\"];\n console.log(_this.scope.profileAddressDetails);\n });\n };\n ChangeEmailCtrl.prototype.changeEmail = function () {\n var _this = this;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.changeEmailForm.form.$invalid) {\n return;\n }\n this.scope.isBusy = true;\n this.identityService.changeEmail(this.scope.changeEmailDetails)\n .then(function (result) {\n _this.scope.emailChanged = true;\n setTimeout(function () {\n _this.tokenService.tokenManager.redirectForToken();\n }, 2000);\n }, function (reason) {\n _this.scope.errorHandler = reason.data;\n })\n .finally(function () {\n _this.scope.isBusy = false;\n });\n };\n ChangeEmailCtrl.$inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'identityService', 'navigationService', 'tokenService', 'sessionService'];\n return ChangeEmailCtrl;\n }(Patersons.IdentityBaseCtrl));\n Patersons.ChangeEmailCtrl = ChangeEmailCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar Patersons;\n(function (Patersons) {\n var SetPasswordCtrl = (function () {\n function SetPasswordCtrl($scope, identityService, tokenService) {\n var _this = this;\n this.onValidation = function (isValid) {\n if (_this.scope) {\n _this.scope.isValidPassword = isValid;\n }\n };\n this.scope = $scope;\n this.identityService = identityService;\n this.tokenService = tokenService;\n this.scope.events = this;\n this.scope.isSubmitted = false;\n this.scope.isSuccess = false;\n this.scope.passwordInputType = \"password\";\n this.scope.setPasswordDetails = new Patersons.SetPasswordDetails();\n }\n SetPasswordCtrl.prototype.togglePasswordVisibility = function () {\n if (this.scope.passwordInputType === \"password\") {\n this.scope.passwordInputType = \"text\";\n }\n else {\n this.scope.passwordInputType = \"password\";\n }\n };\n SetPasswordCtrl.prototype.save = function () {\n var _this = this;\n this.scope.errorHandler = null;\n this.scope.isSubmitted = true;\n this.scope.$broadcast('show-errors-check-validity');\n if (this.scope.setPasswordForm.$invalid) {\n return;\n }\n this.scope.isLoading = true;\n this.identityService.setPassword(this.scope.setPasswordDetails)\n .then(function (result) {\n _this.scope.isSuccess = true;\n _this.sleep(2000).then(function () {\n _this.tokenService.tokenManager.redirectForToken();\n });\n }, function (response) {\n _this.scope.isSuccess = false;\n _this.scope.errorHandler = response.data;\n }).finally(function () {\n _this.scope.isLoading = false;\n });\n };\n SetPasswordCtrl.prototype.sleep = function (time) {\n return new Promise(function (resolve) { return setTimeout(resolve, time); });\n };\n SetPasswordCtrl.$inject = ['$scope', 'identityService', 'tokenService'];\n return SetPasswordCtrl;\n }());\n Patersons.SetPasswordCtrl = SetPasswordCtrl;\n})(Patersons || (Patersons = {}));\n\n'use strict';\nvar identityModule = angular.module(\"app.identityModule\", []);\nidentityModule.config([\"$stateProvider\", \"$locationProvider\",\n function ($stateProvider, $locationProvider) {\n console.log('app.identityModule config...');\n $stateProvider\n .state('forgottenPan', {\n url: '/forgottenPan',\n templateUrl: 'assets/templates/identity/forgottenPan.html',\n controller: \"forgottenPanCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Forgotten Pan\" };\n }],\n }\n })\n .state('forgottenPassword', {\n url: '/forgottenPassword',\n templateUrl: 'assets/templates/identity/forgottenPassword.html',\n controller: \"forgottenPasswordCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Forgotten Password\" };\n }],\n }\n })\n .state('changeMobile', {\n url: '/changeMobile',\n templateUrl: 'assets/templates/identity/changeMobile.html',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Change Mobile\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state('registerMobile', {\n url: '/registerMobile',\n templateUrl: 'assets/templates/identity/registerMobile.html',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Register Mobile\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state('changePassword', {\n url: '/changePassword',\n templateUrl: 'assets/templates/identity/changePassword.html',\n controller: \"changePasswordCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Change Password\" };\n }],\n }\n })\n .state('changeEmail', {\n url: '/changeEmail',\n templateUrl: 'assets/templates/identity/changeEmail.html',\n controller: \"changeEmailCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Update User Profile\" };\n }],\n }\n })\n .state('verifyPhone', {\n url: '/verifyPhone?userId',\n templateUrl: 'assets/templates/identity/verifyPhone.html',\n controller: \"verifyPhoneCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Verify Phone\" };\n }],\n impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\n var deferred = $q.defer();\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\n $state.go('dashboard');\n deferred.reject();\n }\n else {\n deferred.resolve();\n }\n return deferred.promise;\n }]\n }\n })\n .state('confirmPassword', {\n url: '/confirmPassword',\n templateUrl: 'assets/templates/identity/confirmPassword.html',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Confirm Password\" };\n }],\n }\n })\n .state('callbackAction', {\n url: '/callback/:response',\n templateUrl: 'assets/templates/common/loading.html',\n controller: 'identityCallbackCtrl'\n })\n .state('setPassword', {\n url: '/setPassword',\n templateUrl: 'assets/templates/identity/setPassword.html',\n controller: 'setPasswordCtrl',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Set Password\" };\n }],\n }\n });\n }]);\nidentityModule.controller('IdentityBaseCtrl', Patersons.IdentityBaseCtrl);\nidentityModule.controller('identityCallbackCtrl', Patersons.CallbackCtrl);\nidentityModule.controller('verifyPhoneCtrl', Patersons.VerifyPhoneCtrl);\nidentityModule.controller('changePhoneCtrl', Patersons.ChangePhoneCtrl);\nidentityModule.controller('forgottenPanCtrl', Patersons.ForgottenPanCtrl);\nidentityModule.controller('forgottenPasswordCtrl', Patersons.ForgottenPasswordCtrl);\nidentityModule.controller('changePasswordCtrl', Patersons.ChangePasswordCtrl);\nidentityModule.controller('changeEmailCtrl', Patersons.ChangeEmailCtrl);\nidentityModule.controller('setPasswordCtrl', Patersons.SetPasswordCtrl);\n\n\"use strict\";\nvar controllerModule = angular.module(\"app.controllers\", [\"ui.bootstrap\"]);\ncontrollerModule.controller('navbarCtrl', Patersons.NavbarCtrl);\ncontrollerModule.controller('footerCtrl', Patersons.FooterCtrl);\ncontrollerModule.controller('abstractController', Patersons.AbstractController);\ncontrollerModule.controller('clientAdviserViewCtrl', Patersons.ClientAdviserViewCtrl);\ncontrollerModule.controller('helpViewCtrl', Patersons.HelpViewCtrl);\ncontrollerModule.controller('landingCtrl', Patersons.LandingCtrl);\n\n\"use strict\";\nvar compareTo = function () {\n return {\n require: \"ngModel\",\n scope: {\n otherModelValue: \"=compareTo\"\n },\n link: function (scope, element, attributes, ngModel) {\n ngModel.$validators.compareTo = function (modelValue) {\n return modelValue == scope.otherModelValue;\n };\n scope.$watch(\"otherModelValue\", function () {\n ngModel.$validate();\n });\n }\n };\n};\nvar appDirectives = angular.module(\"app.directives\", []);\nappDirectives.config(function () {\n var model = document.getElementById(\"model\").textContent.trim();\n var dictionary = JSON.parse(model);\n for (var key in dictionary) {\n module.constant(key, dictionary[key]);\n }\n});\nappDirectives.directive(\"appVersion\", function () {\n var model = document.getElementById(\"model\").textContent.trim();\n var dictionary = JSON.parse(model);\n var version = dictionary['websiteVersionNumber'];\n return {\n template: 'Version: ' + version\n };\n});\nappDirectives.directive(\"compareTo\", compareTo);\nappDirectives.directive('showErrors', function () {\n return {\n restrict: 'A',\n require: '^form',\n link: function (scope, el, attrs, formCtrl) {\n // find the text box element, which has the 'name' attribute\n var inputEl = el[0].querySelector(\"[name]\");\n // convert the native text box element to an angular element\n var inputNgEl = angular.element(inputEl);\n // get the name on the text box so we know the property to check\n // on the form controller\n var inputName = inputNgEl.attr('name');\n // only apply the has-error class after the user leaves the text box\n inputNgEl.bind('blur', function () {\n el.toggleClass('has-error', formCtrl[inputName].$invalid);\n });\n }\n };\n});\nappDirectives.directive('addressForm', function () {\n return {\n restrict: 'E',\n templateUrl: 'assets/templates/accountDetails/addressForm.html',\n scope: {\n addressTitle: '@',\n address: '=',\n selectedAccount: '<',\n mailAddressForm: '=',\n isDisabled: '<'\n }\n };\n});\n// Note: rendered as \nappDirectives.directive('marketDepthForm', function () {\n return {\n restrict: 'E',\n templateUrl: 'assets/templates/portfolioSummary/components/marketDepth.component.html'\n };\n});\nappDirectives.directive('holdingsSummary', function () {\n return {\n restrict: 'E',\n templateUrl: 'assets/templates/portfolioSummary/holdingsSummary.html',\n };\n});\nappDirectives.directive('marketOrdersSummary', function () {\n return {\n restrict: 'E',\n controller: Patersons.MarketOrdersCtrl,\n templateUrl: 'assets/templates/portfolioSummary/marketOrdersSummary.html'\n };\n});\nappDirectives.directive('errSrc', function () {\n return {\n link: function (scope, element, attrs) {\n element.bind('error', function () {\n if (attrs.src != attrs.errSrc) {\n attrs.$set('src', attrs.errSrc);\n }\n });\n attrs.$observe('ngSrc', function (value) {\n if (!value && attrs.errSrc) {\n attrs.$set('src', attrs.errSrc);\n }\n });\n }\n };\n});\nappDirectives.directive(\"isNotDuplicate\", [\"$q\", function ($q) {\n return {\n require: \"ngModel\",\n link: function (scope, elm, attrs, ctrl) {\n ctrl.$asyncValidators.isNotDuplicate = function (modelValue, viewValue) {\n if (ctrl.$isEmpty(viewValue)) {\n return $q.resolve();\n }\n var existing = attrs.isNotDuplicate.split(\"|\");\n var def = $q.defer();\n if (existing.indexOf(viewValue.toLowerCase()) === -1) {\n def.resolve();\n }\n else {\n def.reject();\n }\n return def.promise;\n };\n }\n };\n }]);\nappDirectives.directive(\"dateFormat\", [\"$q\", function ($q) {\n return {\n require: \"ngModel\",\n link: function (scope, elm, attrs, ctrl) {\n ctrl.$asyncValidators.dateFormat = function (modelValue, viewValue) {\n if (ctrl.$isEmpty(viewValue)) {\n return $q.resolve();\n }\n // Validate format against dd/dd/dddd\n if (!/^\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d$/.test(viewValue)) {\n return $q.reject();\n }\n if (!moment(viewValue, \"DD/MM/YYYY\").isValid()) {\n return $q.reject();\n }\n return $q.resolve();\n };\n }\n };\n }]);\nappDirectives.directive('passwordMatch', [\"$q\", function ($q) {\n return {\n restrict: 'A',\n scope: true,\n require: 'ngModel',\n link: function (scope, elem, attrs, control) {\n var checker = function () {\n //get the value of the first password\n var e1 = scope.$eval(attrs.ngModel);\n //get the value of the other password\n var e2 = scope.$eval(attrs.passwordMatch);\n return e1 == e2;\n };\n scope.$watch(checker, function (n) {\n //set the form control to valid if both\n //passwords are the same, else invalid\n control.$setValidity(\"unique\", n);\n //attrs.passwordMatch.$setValidity(\"pattern\", n);\n });\n }\n };\n }]);\nvar defaultTitle = '';\nappDirectives.directive('pageTitle', ['$rootScope', '$interpolate', '$state', 'userCompanyService', function ($rootScope, $interpolate, $state, userCompanyService) {\n return {\n restrict: 'A',\n link: function (scope, element) {\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n //reset the meta data when a route changes - the document title should be updated by the resolve meta property on each state\n $rootScope.meta = undefined;\n });\n $rootScope.$on('$stateChangeSuccess', function (event, toState) {\n userCompanyService.getUserCompany().then(function (company) {\n defaultTitle = company.companyName;\n var separateBy = ' - ';\n if ($rootScope.meta && $rootScope.meta.title) {\n var stateTitle = $rootScope.meta.title;\n element.html(stateTitle + separateBy + defaultTitle);\n $rootScope.$emit('$titleChangeSuccess', stateTitle + separateBy + defaultTitle);\n }\n else {\n element.html(defaultTitle);\n $rootScope.$emit('$titleChangeSuccess', defaultTitle);\n }\n });\n });\n }\n };\n }]);\n\n'use strict';\nvar appComponents = angular.module(\"app.components\", []);\nappComponents.component('changeRequestSubmitted', new Patersons.ChangeRequestSubmittedComponent());\nappComponents.component('phoneNotRegistered', new Patersons.PhoneNotRegisteredComponent());\nappComponents.component('changePhone', new Patersons.ChangePhoneComponent());\nappComponents.component('approversNotRegistered', new Patersons.ApproversNotRegisteredComponent());\nappComponents.component('sectionHeader', new Patersons.SectionHeaderComponent());\nappComponents.component('spinner', new Patersons.SpinnerComponent());\nappComponents.component('accountSelect', new Patersons.AccountSelectComponent());\nappComponents.component('actionButton', new Patersons.ActionButtonComponent());\nappComponents.component('passwordValidation', new Patersons.PasswordValidationComponent());\nappComponents.component('dateSelect', new Patersons.DateSelectComponent());\nappComponents.component('morningstarError', new Patersons.MorningstarErrorComponent());\nappComponents.component('featuredItem', new Patersons.FeaturedItemComponent());\nappComponents.component('feedList', new Patersons.feedListComponent());\n\n\"use strict\";\nvar apiGatewayToken = '';\nChart.defaults.LineWithLine = Chart.defaults.line;\nChart.defaults.global.defaultFontFamily = \"'Neue Helvetica W01', 'sans-serif'\";\nChart.controllers.LineWithLine = Chart.controllers.line.extend({\n draw: function (ease) {\n Chart.controllers.line.prototype.draw.call(this, ease);\n if (this.chart.tooltip._active && this.chart.tooltip._active.length) {\n var activePoint = this.chart.tooltip._active[0], ctx = this.chart.ctx, x = activePoint.tooltipPosition().x, topY = this.chart.legend.bottom, bottomY = this.chart.chartArea.bottom;\n // draw line\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(x, topY);\n ctx.lineTo(x, bottomY);\n ctx.lineWidth = 1;\n ctx.strokeStyle = '#333';\n ctx.setLineDash([5, 5]);\n ctx.stroke();\n ctx.restore();\n }\n }\n});\n//init css vars ponyfill\nfunction rootMorningstarPromise() {\n return new Promise(function (resolve, reject) {\n loaderConfig.apiTokens.apiGatewayToken = _marketsApiToken;\n console.log('initializing morningstar');\n //loads Morningstar\n morningstar.loader.load(loaderConfig).then(function () {\n resolve(); //returns a promise object\n });\n });\n}\nfunction fetchFromObject(obj, prop) {\n //property not found\n if (typeof obj === \"undefined\")\n return false;\n //index of next property split\n var _index = prop.indexOf(\".\");\n //property split found; recursive call\n if (_index > -1) {\n //get object at property (before split), pass on remainder\n return fetchFromObject(obj[prop.substring(0, _index)], prop.substr(_index + 1));\n }\n //no split; get property\n return obj[prop];\n}\nfunction loadMarketsComponent(elementId, containerId, componentTagName, componentId) {\n var container = document.createElement(\"div\");\n var containerParent = document.getElementById(elementId);\n container.setAttribute(\"id\", containerId);\n containerParent.appendChild(container);\n var marketsComponentSettings = fetchFromObject(loaderConfig.configuration.overrides.components, componentId + \".settings\");\n return new Promise(function (resolve, reject) {\n var component = morningstar.components[componentTagName];\n if (component) {\n component.createComponent({\n element: container,\n initialConfiguration: {\n component: {\n configuration: marketsComponentSettings,\n id: containerId,\n callbacks: marketsComponentSettings.callbacks\n }\n }\n });\n resolve();\n }\n else {\n reject('Could not find component with tagname in morningstar components: ' + componentTagName);\n }\n });\n}\nvar waitForEle = function (element, callback) {\n var checkExist = setInterval(function () {\n if ($(element).length) {\n clearInterval(checkExist);\n callback();\n }\n }, 1000); // check every 100ms\n};\nvar initComponent = function (elementId, containerId, componentTagName, componentId) {\n var count = 0;\n var maxRetries = 3;\n var init = function (element) {\n var component = morningstar.asterix.instanceRegistry.find(componentId);\n if (component) {\n var path = component.modulePath;\n var componentTag = document.createElement(componentTagName);\n var container = document.createElement('div');\n if (componentId.indexOf('ecWatchList') === -1 && !morningstar.asterix.instanceRegistry.find(componentId).isActive) {\n console.log('Destroying watchlist first..');\n morningstar.asterix.instanceRegistry.get(path).destroy();\n }\n morningstar.asterix.instanceRegistry.init(path);\n componentTag.setAttribute('mstar-component-id', componentId);\n // ... and attach it to the container.\n container.setAttribute('id', containerId);\n container.appendChild(componentTag);\n // Bootstrap the element\n angular.bootstrap(container, morningstar.asterix.ng.getAngularModuleDependencies());\n element.innerHTML = '';\n element.appendChild(container);\n }\n else {\n console.error(\"Could not find component with ID \" + componentId);\n }\n };\n var promiseChain = new Promise(function (resolve) {\n waitForEle('#' + elementId, function () {\n var element = document.getElementById(elementId);\n init(element);\n resolve();\n });\n });\n if (loaderConfig.lazy.initializeMarketsComponent && componentTagName.indexOf('markets-') == 0) {\n promiseChain.then(function () { loadMarketsComponent(elementId, containerId, componentTagName, componentId); });\n }\n return promiseChain;\n};\n// var morningstarDependencies = morningstar.asterix.ng.getAngularModuleDependencies();\nvar allDependencies = [\n \"ui.router\",\n \"ui.router.state.events\",\n \"app.filters\",\n \"app.services\",\n \"app.directives\",\n \"app.components\",\n \"app.controllers\",\n 'ui.bootstrap',\n 'ui.bootstrap.showErrors',\n 'ui.bootstrap.modal',\n 'validation.match',\n 'app.identityModule',\n 'app.portfolioModule',\n 'app.analysisModule',\n 'app.myDetailsModule',\n 'app.researchModule',\n 'app.accountDetailsModule',\n 'app.changeRequestModule',\n 'angular-smart-chartist',\n 'ngSanitize',\n 'ngCsv',\n 'chart.js',\n // 'SALModule',\n 'ngRoute',\n 'duScroll',\n 'ngTagsInput',\n //analytics\n \"ApplicationInsightsModule\",\n 'angulartics',\n 'angulartics.google.tagmanager'\n];\nvar module = angular.module(\"app\", allDependencies);\nmodule.config([\n \"$provide\",\n \"$stateProvider\",\n \"$locationProvider\",\n \"$httpProvider\",\n \"applicationInsightsServiceProvider\",\n \"showErrorsConfigProvider\",\n '$compileProvider',\n '$analyticsProvider',\n function ($provide, $stateProvider, $locationProvider, $httpProvider, applicationInsightsServiceProvider, showErrorsConfigProvider, $compileProvider, $analyticsProvider) {\n $compileProvider.aHrefSanitizationWhitelist(/^\\s*(https?|mailto|tel):/);\n $locationProvider.html5Mode(true);\n $stateProvider\n .state(\"home\", {\n url: \"/\",\n templateUrl: 'assets/templates/common/loading.html',\n controller: 'landingCtrl'\n })\n .state('help', {\n url: '/help',\n templateUrl: 'assets/templates/common/help.html',\n controller: \"helpViewCtrl\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Help\" };\n }],\n }\n })\n .state('forbidden', {\n url: '/forbidden',\n templateUrl: 'assets/templates/common/forbidden.html',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Forbidden\" };\n }],\n }\n })\n .state('error', {\n url: '/error',\n templateUrl: 'assets/templates/common/error.html',\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Error\" };\n }],\n }\n })\n .state(\"otherwise\", {\n url: \"*path\",\n templateUrl: \"assets/templates/common/404.html\",\n resolve: {\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\n $rootScope.meta = { title: \"Not Found\" };\n }],\n }\n });\n var model = document.getElementById(\"model\").textContent.trim();\n //var trustedLoginMessage = $sceProvider.trustAsHtml(model['content']['loginMessage']);\n var dictionary = JSON.parse(model);\n var applicationInsightsInstrumentationKey = dictionary['applicationInsightsInstrumentationKey'];\n var options = { applicationName: 'Investor Website', autoPageViewTracking: true, autoLogTracking: false, autoExceptionTracking: true };\n applicationInsightsServiceProvider.configure(applicationInsightsInstrumentationKey, options);\n $provide.decorator(\"applicationInsightsService\", [\"tokenService\", \"$delegate\", function myDecorate(tokenService, $delegate) {\n var original = $delegate.trackPageView;\n $delegate.trackPageView = function decoratedWarn(msg) {\n var propertyInfo = {};\n propertyInfo.ComponentName = \"Investor Website\";\n if (tokenService.tokenManager.profile) {\n propertyInfo.email = tokenService.tokenManager.profile.email;\n propertyInfo.account = tokenService.tokenManager.profile.account;\n //propertyInfo.agaccount = tokenService.tokenManager.profile.agaccount;\n propertyInfo.auth_time = new Date(tokenService.tokenManager.profile.auth_time * 1000);\n propertyInfo.given_name = tokenService.tokenManager.profile.given_name;\n propertyInfo.family_name = tokenService.tokenManager.profile.family_name;\n propertyInfo.pan = tokenService.tokenManager.profile.preferred_username;\n propertyInfo.role = tokenService.tokenManager.profile.role;\n propertyInfo.sub = tokenService.tokenManager.profile.sub;\n propertyInfo.sid = tokenService.tokenManager.profile.sid;\n }\n $delegate.setCommonProperties(propertyInfo);\n original.apply($delegate, arguments);\n };\n return $delegate;\n }]);\n $provide.decorator(\"$analytics\", [\"tokenService\", \"$delegate\", function (tokenService, $delegate) {\n if (tokenService.tokenManager.profile) {\n $analyticsProvider.settings.ga = {\n userId: tokenService.tokenManager.profile.preferred_username\n };\n }\n return $delegate;\n }]);\n $analyticsProvider.excludeRoutes(['/callback', '/forbidden']);\n $analyticsProvider.withBase(false);\n $analyticsProvider.firstPageview(false);\n //handle page tracking manually to work around dynamic titles\n $analyticsProvider.virtualPageviews(false);\n showErrorsConfigProvider.showSuccess(true);\n $httpProvider.interceptors.push('bearerInjector');\n }]);\nmodule.run([\n '$templateCache',\n '$rootScope',\n '$state',\n '$stateParams',\n '$http',\n 'tokenService',\n 'sessionService',\n '$analytics',\n '$location',\n 'userCompanyService',\n function ($templateCache, $rootScope, $state, $stateParams, $http, tokenService, sessionService, $analytics, $location, userCompanyService) {\n console.log(\"Running App\");\n // Allows to retrieve UI Router state information from inside templates\n $rootScope.$state = $state;\n $rootScope.$stateParams = $stateParams;\n $rootScope.$on(\"$stateChangeError\", console.log.bind(console));\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\n $http.pendingRequests.forEach(function (request) {\n var url = request.url;\n var stringsToMatch = [\n \"dataService/api/adviser\",\n \"dataService/odata/changeRequests/ChangeRequestService.GetChangeRequestsForApprovalCount\",\n \"dataService/api/userCompany\",\n \"dataService/api/Reporting/CheckFreezeWindow\"\n ];\n var match = false;\n stringsToMatch.forEach(function (string) {\n if (!match && url.indexOf(string) > -1) {\n match = true;\n }\n });\n //Check if the requests are within the nav bar or footer - if so do not cancel them \n if (!match) {\n if (request.cancel) {\n request.cancel.resolve();\n }\n }\n });\n console.log('destroying sal-report');\n //remove the SAL reports\n $('#sal-report').empty();\n $('#app').removeClass(function (index, className) {\n return (className.match(/(^|\\s)page-\\S+/g) || []).join(' ');\n });\n $('#app').addClass('page-' + toState.name);\n });\n //only track the page when title is resolved\n $rootScope.$on('$titleChangeSuccess', function (event, route) {\n $analytics.pageTrack($location.path());\n });\n //profit loss class\n $rootScope.getProfitLossClass = function (number) {\n var _class = \"\";\n var _number = parseFloat(number);\n if (!isNaN(_number)) {\n if (number === 0) {\n _class = \"\";\n }\n else if (_number > 0) {\n _class = \"success\";\n }\n else {\n _class = \"danger\";\n }\n }\n return _class;\n };\n }]);\n","\"use strict\";\r\n\r\nmodule Patersons {\r\n\r\n export class IdentityService extends BaseService\r\n {\r\n triggerForgottenPan(forgottenPanDetails: Patersons.ForgottenPanDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/ForgottenPan\", forgottenPanDetails);\r\n };\r\n\r\n triggerForgottenPassword(forgottenPasswordDetails: Patersons.ForgottenPasswordDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/ForgottenPassword\", forgottenPasswordDetails);\r\n };\r\n\r\n changePassword(changePasswordDetails: Patersons.ChangePasswordDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/ChangePassword\", changePasswordDetails);\r\n };\r\n\r\n changeEmail(changeEmailDetails: Patersons.ChangeEmailDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/ChangeEmail\", changeEmailDetails);\r\n };\r\n\r\n changeMobileNumber(phoneDetails: Patersons.PhoneDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/ChangeMobileNumber\", phoneDetails);\r\n };\r\n\r\n confirmMobileNumberChange(phoneDetails: Patersons.PhoneConfirmationDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/ConfirmSms\", phoneDetails);\r\n };\r\n\r\n setPassword(setPasswordDetails: Patersons.SetPasswordDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/SetPassword\", setPasswordDetails);\r\n };\r\n\r\n request2FAToken(): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/Request2FAToken\", null);\r\n };\r\n\r\n getSkipMobileRegistration(): ng.IHttpPromise {\r\n return this.get(\"/identity/api/account/GetSkipMobileRegistration\");\r\n };\r\n\r\n getIsPhoneNumberVerifyed(): ng.IHttpPromise {\r\n return this.get(\"/identity/api/account/IsPhoneNumberVerifyed\");\r\n };\r\n\r\n getPhoneNumber(): ng.IHttpPromise {\r\n return this.get(\"/identity/api/account/GetPhoneNumber\");\r\n };\r\n\r\n getUserAddressDetails(): ng.IHttpPromise{\r\n return this.get(\"/identity/api/account/GetUserAddressDetails\");\r\n }\r\n\r\n saveSkipMobileRegistration(skipMobileDetails: Patersons.SkipMobileDetails): ng.IHttpPromise {\r\n return this.post(\"/identity/api/account/SaveSkipMobileRegistration\", skipMobileDetails);\r\n };\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class AnalysisService extends BaseService{\r\n\r\n getWatchlists() {\r\n return this.get(\"/dataService/odata/watchlists\");\r\n };\r\n\r\n getAWatchlist(watchlistId: number){\r\n return this.get(\"/dataService/odata/watchlists(\" + watchlistId + \")\");\r\n };\r\n\r\n patchWatchlist(watchlist: Watchlist) {\r\n return this.patch(\"/dataService/odata/watchlists(\" + watchlist.id + ')', watchlist);\r\n };\r\n\r\n postWatchlist(newWatchlist: Watchlist) {\r\n return this.post(\"/dataService/odata/watchlists\", newWatchlist);\r\n };\r\n\r\n deleteWatchlist(watchlistId: number) {\r\n return this.delete(\"/dataService/odata/watchlists(\" + watchlistId + \")\");\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export interface SessionTimeoutModalScope extends ng.IScope {\r\n currentState: string\r\n events: Patersons.SessionTimeoutModalCtrl;\r\n }\r\n export class SessionTimeoutModalCtrl {\r\n\r\n scope: Patersons.SessionTimeoutModalScope;\r\n modalInstance: any;\r\n static $inject = ['$scope', '$uibModalInstance', 'currentState'];\r\n\r\n constructor($scope, $uibModalInstance, currentState) {\r\n this.scope = $scope;\r\n this.scope.currentState = currentState;\r\n this.modalInstance = $uibModalInstance\r\n this.scope.events = this;\r\n }\r\n\r\n close(data) {\r\n this.modalInstance.close(data);\r\n };\r\n dismiss(data) {\r\n this.modalInstance.dismiss(data);\r\n };\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface UserProfile {\r\n given_name: string;\r\n family_name: string;\r\n email: string;\r\n }\r\n\r\n export class SessionService {\r\n tokenService: TokenService;\r\n modalInstance: any;\r\n modalStack: any;\r\n openModal :any;\r\n sessionTimeoutHandler = null\r\n sessionPreTimeoutHandler = null\r\n sessionTimeoutKey = '$psl.sessionTimeout'\r\n $analytics;\r\n static $inject = ['tokenService', '$rootScope', '$uibModal', '$uibModalStack', '$analytics'];\r\n\r\n constructor(tokenService, $rootScope, $uibModal, $uibModalStack,$analytics) {\r\n this.tokenService = tokenService;\r\n this.modalInstance = $uibModal;\r\n this.modalStack = $uibModalStack;\r\n this.$analytics = $analytics;\r\n $rootScope.$on('$stateChangeStart', (event, toState, toParams, fromState, fromParams) => {\r\n const session = this.checkSession()\r\n // if (!session) {\r\n // event.preventDefault();\r\n // return;\r\n // }\r\n })\r\n }\r\n setSessionExpiringModal() {\r\n this.modalStack.dismissAll()\r\n this.openModal = this.modalInstance.open({\r\n\r\n templateUrl: 'assets/templates/common/sessionTimeoutModal.html',\r\n size: 'sm',\r\n controller: SessionTimeoutModalCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n openedClass: 'timeout-modal',\r\n resolve: {\r\n currentState: function () { return 'expiring' }\r\n }\r\n }).result.then((result) => {\r\n if(result == 'yes'){\r\n this.checkSession();\r\n }\r\n })\r\n }\r\n setSessionExpiredModal(){\r\n this.modalStack.dismissAll()\r\n this.openModal = this.modalInstance.open({\r\n\r\n templateUrl: 'assets/templates/common/sessionTimeoutModal.html',\r\n size: 'sm',\r\n controller: SessionTimeoutModalCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n openedClass: 'timeout-modal',\r\n resolve: {\r\n currentState: function() { return 'expired' }\r\n }\r\n }).result.then((result) => {\r\n if(result =='ok'){\r\n this.handleSessionTimedout()\r\n }\r\n })\r\n }\r\n checkSession() {\r\n console.log('checking timeout')\r\n const sessionTimeoutExists = localStorage.getItem(this.sessionTimeoutKey);\r\n const now = new Date();\r\n const timeout = new Date(+sessionTimeoutExists)\r\n const isLoggedIn = this.isLoggedIn();\r\n const timeoutInMinutes = 20;\r\n clearTimeout(this.sessionTimeoutHandler);\r\n clearTimeout(this.sessionPreTimeoutHandler);\r\n\r\n if (isLoggedIn) {\r\n if ((now > timeout) && sessionTimeoutExists) {\r\n console.log('timedout')\r\n //need to log user out here\r\n this.setSessionExpiredModal();\r\n return false;\r\n } else {\r\n const timeout = now.getTime() + (timeoutInMinutes * 60 * 1000) // add x minutes\r\n console.log('extending session')\r\n localStorage.setItem(this.sessionTimeoutKey, timeout.toString())\r\n\r\n this.sessionPreTimeoutHandler = setTimeout(() => {\r\n console.log(\"Timeout is coming up\")\r\n this.setSessionExpiringModal()\r\n }, (timeout - (1 * 60 * 1000)) - now.getTime()) // 1 minute before\r\n\r\n this.sessionTimeoutHandler = setTimeout(() => {\r\n console.log(\"Timeout is past\")\r\n this.setSessionExpiredModal()\r\n }, (timeout) - now.getTime()) // timeout has passed\r\n return true;\r\n }\r\n } else {\r\n localStorage.removeItem(this.sessionTimeoutKey)\r\n return true;\r\n }\r\n }\r\n handleSessionTimedout (){\r\n window.stop();\r\n localStorage.removeItem(this.sessionTimeoutKey)\r\n this.$analytics.eventTrack('Logout Session Timed Out', {\r\n category: 'Logout'\r\n });\r\n window.location = \"/identity/connect/endsession\" as any;\r\n // this.tokenService.tokenManager.redirectForLogout();\r\n return false;\r\n\r\n }\r\n login(): void {\r\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\r\n this.tokenService.tokenManager.redirectForToken();\r\n }\r\n\r\n logout(): void {\r\n this.$analytics.eventTrack('Logout Success', {\r\n category: 'Logout'\r\n });\r\n\r\n this.tokenService.tokenManager.removeToken();\r\n window.location = \"/identity/connect/endsession\" as any;\r\n // this.tokenService.tokenManager.redirectForLogout();\r\n }\r\n\r\n isLoggedIn(): boolean {\r\n return this.tokenService.tokenManager && !this.tokenService.tokenManager.expired;\r\n }\r\n\r\n getCurrentUserProfile(): UserProfile {\r\n if(this.isLoggedIn()){\r\n return this.tokenService.tokenManager.profile;\r\n }else{\r\n this.login();\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class SizeDetectorService {\r\n $html: any;\r\n constructor() {\r\n this.initSizeDetector();\r\n }\r\n private initSizeDetector() {\r\n console.log(\"initializing size detector\")\r\n $(document).ready(($) => {\r\n this.$html = $('html')\r\n\r\n $(window).resize(() => {\r\n this.checkWidth();\r\n });\r\n //Fire it when the page first loads:\r\n this.checkWidth();\r\n });\r\n }\r\n private checkWidth() {\r\n const windowWidth = document.body.clientWidth;\r\n this.$html.removeClass('table-xSmall table-small table-medium table-large');\r\n if (windowWidth < 569) {\r\n return this.$html.addClass('table-small');\r\n }\r\n else if (windowWidth >= 569 && windowWidth < 1024) {\r\n return this.$html.addClass('table-medium');\r\n }\r\n else if (windowWidth > 1024) {\r\n return this.$html.addClass('table-large');\r\n }\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export interface MorningStarData {\r\n holdingTypeId: number;\r\n SecId: string;\r\n Name: string;\r\n ExchangeCode: string;\r\n Symbol: string;\r\n FundShareClassId: string;\r\n }\r\n export class MorningStarService {\r\n constructor() {\r\n }\r\n private mapAgilityExchangeCodeToMIC(exchangeCode){\r\n switch (exchangeCode) {\r\n\r\n case \"HKE\":\r\n case \"HKG\":\r\n exchangeCode = \"EX$$$$XHKG\"\r\n break;\r\n case \"SGX\":\r\n case \"SES\":\r\n exchangeCode = \"EX$$$$XSES\"\r\n break;\r\n case \"NAS\":\r\n exchangeCode = \"EX$$$$XNAS\"\r\n break;\r\n case \"NYS\":\r\n exchangeCode = \"EX$$$$XNYS\"\r\n break;\r\n case \"AME\":\r\n case \"ASE\":\r\n exchangeCode = \"EX$$$$XASE\"\r\n break;\r\n case \"LSE\":\r\n case \"LON\":\r\n exchangeCode = \"EX$$$$XLON\"\r\n break;\r\n case \"ETR\":\r\n case \"FRA\":\r\n exchangeCode = \"EX$$$$XFRA\"\r\n break;\r\n case \"PAR\":\r\n exchangeCode = \"EX$$$$XPAR\"\r\n break;\r\n case \"ARC\":\r\n case \"ARCX\":\r\n exchangeCode = \"EX$$$$ARCX\"\r\n break;\r\n case \"AMS\":\r\n exchangeCode = \"EX$$$$XAMS\"\r\n break;\r\n case \"MAD\":\r\n case \"MCE\":\r\n exchangeCode = \"EX$$$$XMCE\"\r\n break;\r\n case \"MTA\":\r\n case \"MIL\":\r\n exchangeCode = \"EX$$$$XMIL\"\r\n break;\r\n case \"AXW\":\r\n case \"ASX\":\r\n exchangeCode = \"EX$$$$XASX\";\r\n break;\r\n default:\r\n exchangeCode = \"UNL\";\r\n break;\r\n }\r\n return exchangeCode;\r\n }\r\n public getRecentResearch = (filterBy1Year?: boolean): Promise => {\r\n return new Promise((resolve, reject) => {\r\n $.ajax({\r\n url: \"https://content.morningstar.com.au/equityxml/customResearchReportXml?client=canaccordgenuity&format=json&v=2&rowsreturn=everything\",\r\n type: \"GET\",\r\n }).then(res => {\r\n if (res && res.customArcResearchList) {\r\n if(filterBy1Year){\r\n var oneYearAgo = new Date();\r\n oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1);\r\n const filteredItems = res.customArcResearchList.filter((item) => {\r\n const date = new Date(item.dateWritten)\r\n return date >= oneYearAgo;\r\n })\r\n resolve(filteredItems);\r\n }else{\r\n resolve(res.customArcResearchList)\r\n }\r\n }else{\r\n resolve(null)\r\n }\r\n }).fail(res => {\r\n resolve(res)\r\n })\r\n })\r\n }\r\n public getASXAnnouncementsDocument = (path): Promise => {\r\n const query = {\r\n path: path\r\n }\r\n \r\n return new Promise((resolve, reject) => {\r\n $.ajax({\r\n url: \"/financeService/Morningstar/GetASXAnnouncementDocument\",\r\n data: query,\r\n type: \"GET\",\r\n }).then(res => {\r\n resolve(res)\r\n }).fail(res => {\r\n resolve(res)\r\n })\r\n })\r\n }\r\n public getASXAnnouncements = (asxcode?, dateRange?, page?): Promise => {\r\n const query = {} as any;\r\n if(asxcode){\r\n query.asxcode = asxcode\r\n }\r\n if(dateRange){\r\n query.dateRange = dateRange\r\n }\r\n if(page){\r\n query.page = page\r\n }\r\n return new Promise((resolve, reject) => {\r\n $.ajax({\r\n url: \"/financeService/Morningstar/GetASXAnnouncements\",\r\n data: query,\r\n type: \"GET\",\r\n }).then(res => {\r\n resolve(res)\r\n }).fail(res => {\r\n resolve(res)\r\n })\r\n })\r\n }\r\n public getMorningStarDataForSecurityCode(exchangeCode: string, securityCode: string) : Promise{\r\n return new Promise((resolve, reject) => {\r\n if(!exchangeCode || !securityCode){\r\n resolve(null)\r\n return;\r\n }\r\n // replace : with . for the M* API\r\n let symbol = securityCode.replace(/:/g, \".\");\r\n // need to append 0 to HKG/KHE security codes\r\n if (exchangeCode == \"HKE\" || exchangeCode == \"HKG\"){\r\n symbol = \"0\" + symbol;\r\n } \r\n $.ajax({\r\n url: \"https://lt.morningstar.com/api/rest.svc/4ostbpo1me/security/screener?page=1&pageSize=1&sortOrder=name=asc&outputType=json&version=1&languageId=en-AU¤cyId=AUD&universeIds=UNIVE$$ALL&securityDataPoints=holdingTypeId%7CSecId%7CAPIR%7CName%7CExchangeCode%7CSymbol%7CFundShareClassId&filters=ExchangeID:EQ:\" + this.mapAgilityExchangeCodeToMIC(exchangeCode) + \"|Symbol:EQ:\" + symbol,\r\n type: \"GET\",\r\n }).then(res => {\r\n if (res.total > 0) {\r\n resolve(res.rows[0])\r\n }else{\r\n resolve(null)\r\n }\r\n }).fail(res => {\r\n resolve(res)\r\n })\r\n });\r\n }\r\n public getMorningStarDataForSecurityId(securityId): Promise{\r\n return new Promise((resolve, reject) => {\r\n $.ajax({\r\n url: \"https://lt.morningstar.com/api/rest.svc/4ostbpo1me/security/screener?page=1&pageSize=1&sortOrder=name=asc&outputType=json&version=1&languageId=en-AU¤cyId=AUD&universeIds=UNIVE$$ALL&securityDataPoints=holdingTypeId%7CSecId%7CAPIR%7CName%7CExchangeCode%7CSymbol%7CFundShareClassId&filters=SecId:EQ:\" + securityId,\r\n type: \"GET\",\r\n }).then(res => {\r\n if (res.total > 0) {\r\n resolve(res.rows[0])\r\n }else{\r\n resolve(null)\r\n }\r\n }).fail(res => {\r\n resolve(res)\r\n })\r\n });\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class NavigationService {\r\n\r\n sections = ['dashboard', 'portfolio', 'analysis', 'research'];\r\n\r\n constructor() {\r\n }\r\n\r\n activateSection(section: string): void {\r\n this.deactivateAll();\r\n\r\n var sectionDiv = angular.element(document.querySelector('#' + section+'-section'));\r\n sectionDiv.addClass('active-section');\r\n }\r\n\r\n deactivateSection(section: string): void {\r\n var sectionDiv = angular.element(document.querySelector('#' + section + '-section'));\r\n sectionDiv.removeClass('active-section');\r\n }\r\n\r\n deactivateAll(): void {\r\n for (let section of this.sections) {\r\n let sectionDiv = angular.element(document.querySelector('#' + section + '-section'));\r\n sectionDiv.removeClass('active-section');\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ClientConfigService extends BaseService {\r\n \r\n getAdviser() {\r\n return this.get(\"/dataService/api/adviser\");\r\n };\r\n\r\n getChangeRequestCount() {\r\n return this.get(\"/dataService/odata/changeRequests/ChangeRequestService.GetChangeRequestsForApprovalCount\");\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export enum ResearchPublicationType {\r\n AustralianInvestor = \"AustralianInvestor\",\r\n MorningMarket = \"MorningMarket\",\r\n WeeklyMarketWrap = \"WeeklyMarketWrap\"\r\n }\r\n\r\n export interface SubscribedResearchPublication {\r\n id: string;\r\n isSubscribed: boolean;\r\n name: string;\r\n description: string;\r\n enabled: boolean;\r\n }\r\n\r\n export class MyDetailsService extends BaseService { \r\n \r\n getAccoladeOptions(): ng.IHttpPromise {\r\n return this.get(\"/dataService/odata/accoladeoptions/Holdings.GetByUserId\");\r\n };\r\n\r\n updateAccoladeOptions(accoladeOptions: AccoladeOptions): ng.IHttpPromise {\r\n return this.put(\"/dataService/odata/accoladeoptions(\" + accoladeOptions.id + \")\", accoladeOptions);\r\n };\r\n\r\n getResearchSubscriptions(): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/ResearchSubscriptions\");\r\n };\r\n\r\n getResearchSubscription(publication: ResearchPublicationType): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/ResearchSubscriptions/\" + publication);\r\n };\r\n \r\n updateResearchSubscriptions(data: SubscribedResearchPublication[]): ng.IHttpPromise {\r\n return this.patch(\"/dataService/api/ResearchSubscriptions\", data.reduce((acc, curr) => {\r\n if(curr.enabled){\r\n acc[curr.id] = curr.isSubscribed\r\n }\r\n return acc\r\n }, {}));\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PortfolioService extends BaseService {\r\n\r\n portfolios: { [id: string]: Account }\r\n portfolioOrder: {\r\n accountId: string,\r\n order: number;\r\n }[];\r\n static $inject = ['$http', '$log', '$state', '$q', 'tokenService'];\r\n\r\n constructor($http, $log, $state, $q, tokenService) {\r\n super($http, $log, $state, $q, tokenService)\r\n this.portfolios = {};\r\n this.portfolioOrder = [];\r\n }\r\n\r\n private getPortfolioOrder() {\r\n this.portfolioOrder = []\r\n\r\n return this.get(\"/dataService/api/Portfolios/GetPortfolioOrder\").then((results) => {\r\n this.portfolioOrder = results;\r\n }, (reason) => {\r\n console.log('No order data loaded ');\r\n this.log.error(reason);\r\n });\r\n }\r\n\r\n private getPortfolios(accounts) {\r\n this.portfolios = {};\r\n if (!Array.isArray(accounts)) {\r\n accounts = [accounts];\r\n }\r\n let allPromises: Array> = new Array();\r\n\r\n for (var i = 0; i < accounts.length; i++) {\r\n let accountCode = accounts[i];\r\n var foundPortolio = this.portfolios[accountCode]\r\n if (foundPortolio === undefined) {\r\n this.log.debug(\"Load portfolio with accountCode: \" + accountCode);\r\n allPromises.push(this.get(\"/dataService/api/Portfolios/\" + accountCode)\r\n .then((results) => {\r\n this.log.info(results);\r\n results.summaryError = false;\r\n this.portfolios[accountCode] = results;\r\n this.log.info(this.portfolios[accountCode]);\r\n },\r\n (reason) => {\r\n // error handling: can't get account details\r\n console.log('No account data loaded '+accountCode);\r\n const accountPlaceholder = new Account();\r\n accountPlaceholder.accountId = accountCode;\r\n accountPlaceholder.accountName = 'Currently Unavailable';\r\n accountPlaceholder.summaryError = true;\r\n this.portfolios[accountCode] = accountPlaceholder;\r\n this.log.info(this.portfolios[accountCode]);\r\n this.log.error(reason);\r\n }));\r\n }\r\n }\r\n return Promise.all(allPromises)\r\n }\r\n\r\n getCombinedPortfolioData() {\r\n if (!this.tokenService.tokenManager.profile) {\r\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\r\n this.tokenService.tokenManager.redirectForToken();\r\n // this.state.go('dashboard')\r\n throw \"Get Profile first\";\r\n }\r\n\r\n var acccounts: Array = [];\r\n if (this.tokenService.tokenManager.profile[\"account\"]){\r\n if (this.tokenService.tokenManager.profile[\"account\"] instanceof Array) {\r\n acccounts = this.tokenService.tokenManager.profile[\"account\"];\r\n }\r\n else{\r\n acccounts = [this.tokenService.tokenManager.profile[\"account\"]];\r\n }\r\n }\r\n\r\n var agacccounts: Array = [];\r\n if (this.tokenService.tokenManager.profile[\"agaccount\"]){\r\n if (this.tokenService.tokenManager.profile[\"agaccount\"] instanceof Array){\r\n agacccounts = this.tokenService.tokenManager.profile[\"agaccount\"];\r\n }\r\n else {\r\n agacccounts = [this.tokenService.tokenManager.profile[\"agaccount\"]];\r\n }\r\n }\r\n\r\n acccounts = acccounts.concat(agacccounts);\r\n return new Promise((resolve, reject) => {\r\n this.getPortfolios(acccounts)\r\n .then((result) => {\r\n return this.getPortfolioOrder()\r\n })\r\n .then((result) => {\r\n this.log.info('All portfolios loaded' + this.portfolios);\r\n var accounts: Array = new Array();\r\n\r\n for (var key in this.portfolios) {\r\n this.log.info(key);\r\n var account = this.portfolios[key];\r\n account.isAuthorisedAgentAccount = (agacccounts.indexOf(account.accountId) > -1);\r\n accounts.push(account);\r\n }\r\n\r\n // order the accounts\r\n const accountsOrdered: Array = new Array();\r\n this.portfolioOrder.forEach((portfolioOrder) => {\r\n const account = accounts.filter((account) => {\r\n return account.accountId === portfolioOrder.accountId;\r\n });\r\n if (account && account[0]) {\r\n accountsOrdered.push(account[0]);\r\n }\r\n });\r\n\r\n // add the rest of the accounts as before\r\n accounts.sort((a, b) => {\r\n return a.accountId > b.accountId ? 1 : ((b.accountId > a.accountId) ? -1 : 0);\r\n }).forEach((account) => {\r\n if (accountsOrdered.indexOf(account) === -1) {\r\n accountsOrdered.push(account);\r\n }\r\n });\r\n resolve(accountsOrdered);\r\n });\r\n })\r\n \r\n };\r\n\r\n getPortfolioData() {\r\n if (!this.tokenService.tokenManager.profile) {\r\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\r\n this.tokenService.tokenManager.redirectForToken();\r\n }\r\n\r\n var acccounts: Array = [];\r\n if (this.tokenService.tokenManager.profile[\"account\"] instanceof Array) {\r\n acccounts = this.tokenService.tokenManager.profile[\"account\"];\r\n }\r\n else{\r\n acccounts = [this.tokenService.tokenManager.profile[\"account\"]];\r\n }\r\n\r\n return this.getPortfolios(acccounts)\r\n .then((result) => {\r\n this.log.info('All portfolios loaded' + this.portfolios);\r\n var accounts: Array = new Array();\r\n\r\n for (var key in this.portfolios) {\r\n this.log.info(key);\r\n var account = this.portfolios[key];\r\n account.isAuthorisedAgentAccount = false;\r\n accounts.push(account);\r\n }\r\n return accounts.sort((a, b) => {\r\n return a.accountId > b.accountId ? 1 : ((b.accountId > a.accountId) ? -1 : 0);\r\n });\r\n });\r\n };\r\n\r\n // get dashboard -> account -> header values\r\n getTopSectors(accountCode: string): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/topSectors\");\r\n }\r\n\r\n getTopAssetClass(accountCode: string): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/topAssetClass\");\r\n }\r\n\r\n getAccoladeTopSectors(accountCode: string): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/AccoladeTopSectors\");\r\n }\r\n\r\n getAccoladeTopAssetClass(accountCode: string): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/AccoladeTopAssetClass\");\r\n }\r\n\r\n getAccoladeHoldings(accountCode: string): ng.IHttpPromise {\r\n return this.get(\"/dataService/api/shares/\" + accountCode + \"/AccoladeHoldings\");\r\n }\r\n\r\n updateTaxFileNumber(accountCode: string, taxFileNumber: string, taxFileNumberType: string) {\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetTaxFileNumber', '{\"Number\": \"' + taxFileNumber + '\", \"TaxFileNumberType\": \"' + taxFileNumberType + '\"}');\r\n }\r\n\r\n updateBankDetails(accountCode: string, bankDetails: BankAccountDetail): ng.IHttpPromise {\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetBankAccount', bankDetails);\r\n };\r\n\r\n updateAllBankDetails(accountCode: string, bankDetails: BankAccountDetail): ng.IHttpPromise {\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetAllBankAccounts', bankDetails);\r\n };\r\n\r\n updatePostalAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\r\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetPostalAddress\", addressDetail);\r\n };\r\n\r\n updateResidentialAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\r\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetResidentialAddress\", addressDetail);\r\n };\r\n\r\n updateRegistrationAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\r\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetRegistrationAddress\", addressDetail);\r\n };\r\n\r\n /*updateAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\r\n return this.post(\"/dataService/api/Portfolios/\" + accountCode + \"/SetAddress\", addressDetail);\r\n };\r\n\r\n updateSensitiveAddressDetails(accountCode: string, addressDetail: Address): ng.IHttpPromise {\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetSensitiveAddress', addressDetail);\r\n };*/\r\n\r\n updateEmailAddress(accountCode: string, emailAddress: EmailAddress): ng.IHttpPromise {\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetEmailAddress', emailAddress);\r\n };\r\n updateSensitiveEmailAddress(accountCode: string, emailAddress: EmailAddress): ng.IHttpPromise {\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetSensitiveEmailAddress', emailAddress);\r\n };\r\n\r\n updatePhoneNumbers(accountCode: string, account: Account): ng.IHttpPromise {\r\n\r\n return this.post('/dataService/api/Portfolios/' + accountCode + '/SetPhoneNumber', account);\r\n };\r\n\r\n getInternationalShares(accountId) {\r\n return this.get(\"/dataService/api/Shares/\" + accountId + '/International');\r\n };\r\n\r\n getInternationalSharesForHoldings(account: Account) {\r\n if (account.accountType && account.accountType.toUpperCase() === 'STANDARD') {\r\n return this.get(\"/dataService/api/Shares/\" + account.accountId + '/InternationalStandard');\r\n } else {\r\n return this.get(\"/dataService/api/Shares/\" + account.accountId + '/InternationalAccolade');\r\n }\r\n };\r\n\r\n getShares(accountId) {\r\n return this.get(\"/dataService/api/Shares/\" + accountId);\r\n };\r\n\r\n\r\n getCombinedShares(accountId) {\r\n return this.get(\"/dataService/api/Shares/\" + accountId + \"/All\");\r\n };\r\n getCashAccounts(accountId: string) {\r\n return this.get(\"/dataService/api/CashAccounts/\" + accountId);\r\n };\r\n\r\n getHighInterestCashAccounts(accountId: string) {\r\n return this.get(\"/dataService/api/CashAccounts/\" + accountId + \"/HighInterest\");\r\n };\r\n\r\n getTermDeposits(accountId: string) {\r\n return this.get(\"/dataService/api/TermDeposits/\" + accountId);\r\n };\r\n\r\n getPortfolioValue(account: Account) {\r\n if (account.accountType && account.accountType.toUpperCase() === 'STANDARD') {\r\n return this.get(\"/dataService/api/StandardPortfolioValue/\" + account.accountId);\r\n } else {\r\n return this.get(\"/dataService/api/AccoladePortfolioValue/\" + account.accountId);\r\n }\r\n };\r\n\r\n getBackdatedPortfolioData(accountCode: string, asAt: Date): ng.IPromise {\r\n return this.get(\"/dataService/api/BackdatedHolding/\" + accountCode + \"/\" + moment(asAt).format(\"YYYY-MM-DD\"));\r\n };\r\n\r\n getContractNotes(accountCode: string, dateFrom: Date, dateTo: Date) {\r\n return this.get(\"/dataService/api/ContractNotes/\" + accountCode + \"/\" + moment(dateFrom).format(\"YYYY-MM-DD\") + \"/\" + moment(dateTo).format(\"YYYY-MM-DD\"));\r\n };\r\n\r\n getMarketOrders(accountCode: string) {\r\n return this.get(\"/dataService/api/MarketOrders/\" + accountCode);\r\n };\r\n\r\n getOrderDepthData(securityCode: string) {\r\n return this.get(\"/financeService/OrderDepth/\" + securityCode);\r\n };\r\n\r\n\r\n placeOrderRequest(details: OrderRequest): ng.IHttpPromise {\r\n return this.post(\"/dataService/odata/OrderRequests\", details);\r\n };\r\n\r\n getOrderRequests(): ng.IHttpPromise {\r\n return this.get(\"/dataService/odata/OrderRequests/\");\r\n };\r\n\r\n createCancelOrder(order: OrderRequest): ng.IHttpPromise {\r\n return this.post(\"/dataService/odata/OrderRequests\", order);\r\n };\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface FreezeWindow {\r\n asAtFreezeDate: string;\r\n isInFreezeWindow: boolean;\r\n }\r\n export class ReportService extends BaseService {\r\n\r\n getFile(url): ng.IPromise {\r\n this.log.info(\"reportService getting binary pdf data for\" + url);\r\n return this.http.get(url, { responseType: 'arraybuffer' })\r\n .then(data => {\r\n var file = new Blob([data], { type: 'application/pdf' });\r\n var fileURL = URL.createObjectURL(file);\r\n window.open(fileURL);\r\n }, (reason) => { return this.errorHandler(reason, \"Error retrieving binary pdf data\")});\r\n };\r\n getAllAccoladeNotifications(): ng.IPromise>{\r\n this.log.info(\"reportService getting investor docs notifications\");\r\n return this.get('/dataService/api/InvestorDocs/GetAllNotifications');\r\n }\r\n acknowledgeAccoladeNotifications(): ng.IPromise{\r\n this.log.info(\"reportService acknolegding investor docs notifications\");\r\n return this.get('/dataService/api/InvestorDocs/AcknowledgeAllNotifications');\r\n }\r\n getReport(reportType: ReportType, accountCode: string, dateFrom: Date, dateTo: Date): ng.IPromise {\r\n return this.get(\"/dataService/api/Reporting?reportType=\" + reportType + \"&accountCode=\" + accountCode + \"&dateFrom=\" + dateFrom.toISOString() + \"&dateTo=\" + dateTo.toISOString());\r\n };\r\n checkFreezeWindow(): ng.IPromise {\r\n return this.get(\"/dataService/api/Reporting/CheckFreezeWindow\");\r\n };\r\n }\r\n}","'use strict';\r\n\r\ndeclare var pdfMake: any;\r\n\r\nmodule Patersons {\r\n\r\n export class ReportDownloadService {\r\n pdfBuilder: PdfBuilder;\r\n report: AbstractReport;\r\n account: Account;\r\n q: ng.IQService;\r\n filter: ng.IFilterService;\r\n pdfBuilderService: PDFBuilderService;\r\n base64logo: string;\r\n userCompanyService: Patersons.UserCompanyService;\r\n userCompany: UserCompany;\r\n static $inject = ['$q', '$filter', 'pdfBuilderService','userCompanyService'];\r\n\r\n constructor($q, $filter, pdfBuilderService,userCompanyService) {\r\n this.q = $q;\r\n this.filter = $filter;\r\n this.pdfBuilderService = pdfBuilderService;\r\n this.userCompanyService = userCompanyService;\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.userCompany = company;\r\n })\r\n this.pdfBuilderService.newPdfBuilderInstance().then((pdfBuilder) => {\r\n this.pdfBuilder = pdfBuilder\r\n })\r\n }\r\n downloadPdfFile(report: AbstractReport, account: Account) {\r\n this.report = report;\r\n this.account = account;\r\n\r\n var fileName = this.getFileName();\r\n this.getPdfTemplateDefinition().then((def)=> {\r\n var reportDefinition = this.getReportDefinition(def);\r\n //console.log(JSON.stringify(reportDefinition));\r\n pdfMake.createPdf(reportDefinition).download(fileName + '.pdf');\r\n })\r\n };\r\n downloadCsvFile(report: AbstractReport, account: Account) {\r\n this.report = report;\r\n this.account = account;\r\n\r\n var fileName = this.getFileName();\r\n\r\n this.makeCsv(fileName + '.csv');\r\n };\r\n\r\n makeCsv(filename) {\r\n var blob = this.createCsvFile();\r\n if (window.navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveBlob(blob, filename);\r\n } else {\r\n var downloadLink = document.createElement('a');\r\n downloadLink.href = window.URL.createObjectURL(blob);\r\n downloadLink.target = '_blank';\r\n downloadLink.setAttribute('download', filename);\r\n\r\n document.body.appendChild(downloadLink);\r\n downloadLink.click();\r\n downloadLink.remove();\r\n }\r\n }\r\n\r\n //pdf and csv download\r\n getReportDefinition(doc) {\r\n switch (this.report.reportType) {\r\n case ReportType.CapitalTransactions:\r\n return this.getCapitalTransactionStatement(doc);\r\n case ReportType.QuarterlyReports:\r\n return this.getQuarterlyReportsReport(doc);\r\n case ReportType.Cash:\r\n return this.getCashReport(doc);\r\n case ReportType.Income:\r\n return this.getIncomeReport(doc);\r\n case ReportType.CapitalGains:\r\n return this.getCapitalGainsReport(doc);\r\n case ReportType.UnrealisedCapitalGains:\r\n return this.getUnrealisedCapitalGainsReport(doc);\r\n case ReportType.Performance:\r\n return this.getPerformanceReport(doc);\r\n case ReportType.TaxReports:\r\n return this.getTaxReportsReport(doc);\r\n case ReportType.Valuation:\r\n return this.getValuationStatement(doc);\r\n case ReportType.StandardLedger:\r\n return this.getStandardLedger(doc);\r\n default:\r\n console.error('Unrecognised report type encountered: ' + this.report.reportType);\r\n return null;\r\n }\r\n }\r\n getColumnDefinitions(reportType: ReportType) {\r\n switch (reportType) {\r\n case ReportType.CapitalTransactions:\r\n return {\r\n columnNames: ['tradeDate', 'settlementDate', 'quantity', 'code', 'description', 'unitPrice', 'grossAmount', 'brokerage', 'gst', 'netAmount'],\r\n /*displayNames: [\r\n { text: 'Trade Date', alignment: 'left'},\r\n { text: 'Settlement Date', alignment: 'left'},\r\n { text: 'Quantity', alignment: 'right'},\r\n { text: 'Code', alignment: 'left'},\r\n { text: 'Description', alignment: 'left'},\r\n { text: 'Unit Price', alignment: 'right'},\r\n { text: 'Gross Amount', alignment: 'right'},\r\n { text: 'Brokerage', alignment: 'right'},\r\n { text: 'GST', alignment: 'right'},\r\n { text: 'Net Amount', alignment: 'right'},\r\n ],*/\r\n displayNames: [\r\n 'Trade Date',\r\n 'Settlement Date',\r\n 'Quantity',\r\n 'Code',\r\n 'Description',\r\n 'Unit Price',\r\n 'Gross Amount',\r\n 'Brokerage',\r\n 'GST',\r\n 'Net Amount'\r\n ],\r\n csvColumnNames: ['tradeDate', 'settlementDate', 'quantity', 'code', 'description', 'unitPrice', 'grossAmount', 'brokerage', 'gst', 'netAmount', 'tradeCategory'],\r\n csvDisplayNames: ['Trade Date', 'Settlement Date', 'Quantity', 'Code', 'Description', 'Unit Price', 'Gross Amount', 'Brokerage', 'GST', 'Net Amount', 'Category'],\r\n columnWidths: ['auto', 'auto', 'auto', 'auto', '*', 'auto', 'auto', 'auto', 'auto', 'auto']\r\n };\r\n case ReportType.QuarterlyReports:\r\n return {\r\n columnNames: [\"name\"],\r\n /*displayNames: [\r\n {text: \"Title\", alignment: 'left'}\r\n ],*/\r\n displayNames: [\r\n \"Title\"\r\n ],\r\n csvColumnNames: [\"name\"],\r\n csvDisplayNames: [\"Report Name\"],\r\n columnWidths: ['*']\r\n };\r\n case ReportType.Cash:\r\n return {\r\n columnNames: [\"date\", \"description\", \"debit\", \"credit\", \"balance\"],\r\n /*displayNames: [\r\n { text: \"Date\", alignment: 'left'},\r\n { text: \"Description\", alignment: 'left'},\r\n { text: \"Debit\", alignment: 'right'},\r\n { text: \"Credit\", alignment: 'right'},\r\n { text: \"Balance\", alignment: 'right'}\r\n ],*/\r\n displayNames: [\r\n \"Date\",\r\n \"Description\",\r\n \"Debit\",\r\n \"Credit\",\r\n \"Balance\"\r\n ],\r\n csvColumnNames: [\"date\", \"description\", \"debit\", \"credit\", \"balance\", \"cashSecurityGroupName\"],\r\n csvDisplayNames: [\"Date\", \"Description\", \"Debit\", \"Credit\", \"Balance\", \"Cash Security Group\"],\r\n columnWidths: ['auto', '*', 90, 90, 90]\r\n };\r\n case ReportType.Income:\r\n return {\r\n columnNames: ['payDate', 'exDate', 'code', 'description', 'amount', 'frankingCredits', 'withholdingTax', 'gst'],\r\n\r\n /*displayNames: [\r\n { text:\"Pay-Date\", alignment: 'left'},\r\n { text:\"Ex-Date\", alignment: 'left'},\r\n { text:\"Code\", alignment: 'left'},\r\n { text:\"Description\", alignment: 'left'},\r\n { text:\"Amount Received / Paid\",alignment: 'right'},\r\n { text:\"Franking Credits\", alignment: 'right'},\r\n { text:\"Withholding Tax\", alignment: 'right'},\r\n { text:\"GST\", alignment: 'right'}\r\n ],*/\r\n displayNames: [\r\n \"Pay-Date\",\r\n \"Ex-Date\",\r\n \"Code\",\r\n \"Description\",\r\n \"Amount Received / Paid\",\r\n \"Franking Credits\",\r\n \"Withholding Tax\",\r\n \"GST\"\r\n ],\r\n csvColumnNames: ['payDate', 'exDate', 'code', 'description', 'amount', 'frankingCredits', 'withholdingTax', 'gst', 'transType', 'subTransType'],\r\n csvDisplayNames: [\"Pay-Date\", \"Ex-Date\", \"Code\", \"Description\", \"Amount Received / Paid\", \"Franking Credits\", \"Withholding Tax\", \"GST\", \"Type\", \"SubType\"],\r\n //columnWidths: [50, 50, 40, \"*\", 90, 90, 90, 90]\r\n columnWidths: [50, 50, '*', 200, 50, 50, 50, 50]\r\n };\r\n case ReportType.CapitalGains:\r\n return {\r\n columnNames: ['purchaseDate', 'saleDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'salePrice', 'capitalProceeds'],\r\n /*displayNames: [\r\n { text:'Purchase Date', alignment: 'left'},\r\n { text:'Sale Date', alignment: 'left'},\r\n { text:'Quantity', alignment: 'right'},\r\n { text:'Capital Proceeds', alignment: 'right'},\r\n { text:'Total Cost', alignment: 'right'},\r\n { text:'Reduced Cost Base', alignment: 'right'},\r\n { text:'Indexed Cost Base', alignment: 'right'},\r\n { text:'Discount Cost Base', alignment: 'right'},\r\n { text:'Capital Loss', alignment: 'right'},\r\n { text:'Indexed Gain', alignment: 'right'},\r\n { text:'Gross Discount Gain', alignment: 'right'},\r\n { text:'Other Gain', alignment: 'right'},\r\n ],*/\r\n displayNames: [\r\n 'Purchase Date',\r\n 'Sale Date',\r\n 'Quantity',\r\n 'Cost Price',\r\n 'Total Cost',\r\n 'Reduced Cost Base',\r\n 'Indexed Cost Base',\r\n 'Discount Cost Base',\r\n 'Capital Loss',\r\n 'Indexed Gain',\r\n 'Gross Discount Gain',\r\n 'Other Gain',\r\n 'Sale Price',\r\n 'Capital Proceeds',\r\n ],\r\n csvColumnNames: ['purchaseDate', 'saleDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'securityDescription', 'assetClass', 'salePrice', 'capitalProceeds'],\r\n csvDisplayNames: ['Purchase Date', 'Sale Date', 'Quantity', 'Cost Price', 'Total Cost', 'Reduced Cost Base', 'Indexed Cost Base', 'Discount Cost Base', 'Capital Loss', 'Indexed Gain', 'Gross Discount Gain', 'Other Gain', 'Security Description', 'Asset Class', 'Sale Price', 'Capital Proceeds'],\r\n columnWidths: [\"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\", \"*\",\"*\", \"*\", \"*\"]\r\n }\r\n case ReportType.UnrealisedCapitalGains:\r\n return {\r\n columnNames: ['purchaseDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'marketPrice', 'marketValue'],\r\n /*displayNames: [\r\n { text:'Purchase Date', alignment: 'left'},\r\n { text:'Quantity', alignment: 'right'},\r\n { text:'Market Value', alignment: 'right'},\r\n { text:'Total Cost', alignment: 'right'},\r\n { text:'Reduced Cost Base', alignment: 'right'},\r\n { text:'Indexed Cost Base', alignment: 'right'},\r\n { text:'Discounted Cost Base', alignment: 'right'},\r\n { text:'Capital Loss', alignment: 'right'},\r\n { text:'Indexed Gain', alignment: 'right'},\r\n { text:'Gross Discount Gain', alignment: 'right'},\r\n { text:'Other Gain', alignment: 'right'},\r\n ],*/\r\n displayNames: [\r\n 'Purchase Date',\r\n 'Quantity',\r\n 'Cost Price',\r\n 'Total Cost',\r\n 'Reduced Cost Base',\r\n 'Indexed Cost Base',\r\n 'Discounted Cost Base',\r\n 'Capital Loss',\r\n 'Indexed Gain',\r\n 'Gross Discount Gain',\r\n 'Other Gain',\r\n 'Market Price',\r\n 'Market Value',\r\n ],\r\n csvColumnNames: ['purchaseDate', 'quantity', 'costPrice', 'totalCost', 'reducedCostBase', 'indexedCostBase', 'discountedCostBase', 'capitalLoss', 'indexedGain', 'grossDiscountGain', 'otherGain', 'securityDescription', 'assetClass', 'marketPrice', 'marketValue'],\r\n csvDisplayNames: ['Purchase Date', 'Quantity', 'Cost Price', 'Total Cost', 'Reduced Cost Base', 'Indexed Cost Base', 'Discounted Cost Base', 'Capital Loss', 'Indexed Gain', 'Gross Discount Gain', 'Other Gain', 'Security Description', 'Asset Class', 'Market Price', 'Market Value'],\r\n columnWidths: ['*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*']\r\n }\r\n case ReportType.Performance:\r\n return {\r\n columnNames: ['openMarketValue', 'netContributionsWithdrawals', 'netAssetMovement', 'income', 'expenses', 'managementFees', 'closedMarketValue', 'irr'],\r\n /*displayNames: [\r\n { text:'Open Market Value', alignment: 'right'},\r\n { text:'Net Contributions / Withdrawals', alignment: 'right'},\r\n { text:'Net Asset Movement', alignment: 'right'},\r\n { text:'Income', alignment: 'right'},\r\n { text:'Expenses', alignment: 'right'},\r\n { text:'Management Fees', alignment: 'right'},\r\n { text:'Closed Market Value', alignment: 'right'},\r\n { text:'IRR', alignment: 'right'}\r\n ],*/\r\n displayNames: [\r\n 'Open Market Value',\r\n 'Net Contributions / Withdrawals',\r\n 'Net Asset Movement',\r\n 'Income',\r\n 'Expenses',\r\n 'Management Fees',\r\n 'Closed Market Value',\r\n 'IRR'\r\n ],\r\n csvColumnNames: ['openMarketValue', 'netContributionsWithdrawals', 'netAssetMovement', 'income', 'expenses', 'managementFees', 'closedMarketValue', 'irr'],\r\n csvDisplayNames: ['Open Market Value', 'Net Contributions / Withdrawals', 'Net Asset Movement', 'Income', 'Expenses', 'Management Fees', 'Closed Market Value', 'IRR'],\r\n columnWidths: ['*', 300]\r\n }\r\n case ReportType.TaxReports:\r\n return {\r\n columnNames: [\"name\"],\r\n /*displayNames: [\r\n { text:\"Title\", alignment: 'left'}\r\n ],*/\r\n displayNames: [\r\n \"Title\"\r\n ],\r\n csvColumnNames: [\"name\"],\r\n csvDisplayNames: [\"Report Name\"],\r\n columnWidths: ['*']\r\n };\r\n case ReportType.Valuation:\r\n \r\n //remove Gross Yield, Estimated Income and Estimated Franking Credits for CG accounts\r\n if(this.userCompany.enableFeature){\r\n const result = {\r\n columnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\",\"profitOrLoss\", \"pctAssets\", \"estAnnualIncome\", \"estFrankingCredits\", \"estGrossYield\"],\r\n displayNames: [\r\n \"Code\",\r\n \"Security Name\",\r\n \"Quantity\",\r\n \"Cost Price\",\r\n \"Reduced Cost Base\",\r\n \"Market Price\",\r\n \"Market Value\",\r\n \"Profit (Loss)\",\r\n \"Pct. Assets\",\r\n \"Historic Income\",\r\n \"Historic Fr. Credits\",\r\n \"Historic Gross Yield\"\r\n ],\r\n\r\n columnNamesInternational: [\r\n \"code\",\r\n \"currency\",\r\n \"securityName\",\r\n \"quantity\",\r\n \"nativeCostPrice\",\r\n \"nativeTotalCost\",\r\n \"nativeMarketPrice\",\r\n \"nativeMarketValue\",\r\n \"nativeProfitLoss\",\r\n \"totalCost\",\r\n \"marketValue\",\r\n \"profitOrLoss\",\r\n \"pctAssets\",\r\n \"estAnnualIncome\"\r\n ],\r\n\r\n displayNamesInternational: [\r\n \"Code\",\r\n \"Currency\",\r\n \"Name\",\r\n \"Quantity\",\r\n \"Native Cost Price\",\r\n \"Native Total Cost\",\r\n \"Native Market Price\",\r\n \"Native Market Value\",\r\n \"Native Profit (Loss)\",\r\n \"AUD Total Cost\",\r\n \"AUD Market Value\",\r\n \"AUD Profit (Loss)\",\r\n \"Pct. Assets\",\r\n \"Historic Income\"\r\n ],\r\n csvColumnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\", \"profitOrLoss\", \"pctAssets\", \"estAnnualIncome\", \"estFrankingCredits\", \"estGrossYield\"],\r\n csvDisplayNames: [\"Code\", \"Security Name\", \"Quantity\", \"Cost Price\", \"Reduced Cost Base\", \"Market Price\", \"Market Value\",\"Profit (Loss)\", \"Pct. Assets\", \"Historic Income\", \"Historic Fr. Credits\", \"Historic Gross Yield\"],\r\n columnWidths: [\"auto\", \"*\", 50, 40, 60, 50, 60, 50, 40, 60, 50, 40],\r\n columnWidthsInternational: [\"auto\", \"auto\", \"*\", 40, 40, 50, 50, 50, 40, 50, 50, 40, 40, 40],\r\n csvGroupBy: \"category\",\r\n\r\n totalColumnNames: [\"totalCost\", \"marketValue\", \"estAnnualIncome\", \"estFrankingCredits\", \"estAnnualGrossIncome\", \"estGrossYield\"],\r\n totalDisplayNames: [\"Total Cost\", \"Total Market Value\", \"Est.Annual Income\", \"Est.Annual Franking Credit\", \"Est.Annual Gross Income\", \"Est.Annual Gross Yield\"],\r\n totalColumnWidths: [\"*\", \"*\", \"*\", \"*\", \"*\", \"*\"]\r\n\r\n csvTotalColumnNames: [\"\",\"\",\"\",\"\",\"\",\"totalCost\", \"marketValue\", \"profitOrLoss\", \"estAnnualIncome\", \"estFrankingCredits\", \"estAnnualGrossIncome\", \"estGrossYield\"],\r\n csvTotalDisplayNames: [\"\",\"\",\"\",\"\",\"\",\"Total Cost\", \"Total Market Value\", \"Profit (Loss)\", \"Historic Income\", \"Historic Franking Credits\", \"Historic Gross Income\", \"Historic Gross Yield\"],\r\n\r\n }\r\n return result\r\n }else{\r\n const result = {\r\n columnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\",\"profitOrLoss\", \"pctAssets\"],\r\n displayNames: [\r\n \"Code\",\r\n \"Security Name\",\r\n \"Quantity\",\r\n \"Cost Price\",\r\n \"Reduced Cost Base\",\r\n \"Market Price\",\r\n \"Market Value\",\r\n \"Profit (Loss)\", \r\n \"Pct. Assets\",\r\n ],\r\n displayNamesInternational: [\r\n \"Code\",\r\n \"Currency\",\r\n \"Name\",\r\n \"Quantity\",\r\n \"Native Cost Price\",\r\n \"Native Total Cost\",\r\n \"Native Market Price\",\r\n \"Native Market Value\",\r\n \"Native Profit (Loss)\",\r\n \"AUD Total Cost\",\r\n \"AUD Market Value\",\r\n \"AUD Profit (Loss)\",\r\n \"Pct. Assets\",\r\n ],\r\n\r\n columnNamesInternational: [\r\n \"code\",\r\n \"currency\",\r\n \"securityName\",\r\n \"quantity\",\r\n \"nativeCostPrice\",\r\n \"nativeTotalCost\",\r\n \"nativeMarketPrice\",\r\n \"nativeMarketValue\",\r\n \"nativeProfitLoss\",\r\n \"totalCost\",\r\n \"marketValue\",\r\n \"profitOrLoss\",\r\n \"pctAssets\"\r\n ],\r\n\r\n csvColumnNames: [\"code\", \"securityName\", \"quantity\", \"costPrice\", \"totalCost\", \"price\", \"marketValue\",\"profitOrLoss\", \"pctAssets\"],\r\n csvDisplayNames: [\"Code\", \"Security Name\", \"Quantity\", \"Cost Price\", \"Reduced Cost Base\", \"Market Price\", \"Market Value\",\"Profit (Loss)\", \"Pct. Assets\"],\r\n columnWidths: [\"auto\", \"*\", 50, 40, 60, 50, 60, 50, 40],\r\n columnWidthsInternational: [\"auto\", \"auto\", \"*\", 40, 40, 50, 50, 50, 40, 50, 50, 40, 40],\r\n csvGroupby: \"category\",\r\n\r\n totalColumnNames: [\"totalCost\", \"marketValue\"],\r\n totalDisplayNames: [\"Total Cost\", \"Total Market Value\"],\r\n totalColumnWidths: [\"*\", \"*\",]\r\n\r\n csvTotalColumnNames: [\"\",\"\",\"\",\"\",\"\",\"totalCost\", \"marketValue\", \"profitOrLoss\", \"estAnnualIncome\"],\r\n scvTotalDisplayNames: [\"\",\"\",\"\",\"\",\"\",\"Total Cost\", \"Total Market Value\", \"Profit (Loss)\", \"Historic Income\"],\r\n\r\n \r\n }\r\n return result\r\n }\r\n case ReportType.StandardLedger:\r\n return {\r\n columnNames: [\"ledgerDate\", \"description\", \"amount\", \"balance\", \"currency\", \"reference\"],\r\n /*displayNames: [\r\n { text:\"Date\", alignment: 'left'},\r\n { text:\"Description\", alignment: 'left'},\r\n { text:\"Amount\", alignment: 'right'},\r\n { text:\"Balance\", alignment: 'right'},\r\n { text:\"Currency\", alignment: 'right'},\r\n { text:\"Reference\", alignment: 'right'}\r\n ],*/\r\n displayNames: [\r\n \"Date\",\r\n \"Description\",\r\n \"Amount\",\r\n \"Balance\",\r\n \"Currency\",\r\n \"Reference\"\r\n ],\r\n csvColumnNames: [\"ledgerDate\", \"description\", \"amount\", \"balance\", \"currency\", \"reference\"],\r\n csvDisplayNames: [\"Date\", \"Description\", \"Amount\", \"Balance\", \"Currency\", \"Reference\"],\r\n columnWidths: [\"auto\", \"*\", \"auto\", \"auto\", \"auto\", \"auto\"]\r\n }\r\n default:\r\n console.error('Unrecognised report type encountered: ' + reportType);\r\n return null;\r\n }\r\n }\r\n\r\n getCapitalTransactionStatement(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var statement = this.report as CapitalTransactionStatement;\r\n var transactions, footer, colspan = 1;\r\n if (statement && statement.tradeCategories && statement.tradeCategories.length > 0) {\r\n var categories = statement.tradeCategories;\r\n for (var i = 0; i < categories.length; i++) {\r\n var category = categories[i];\r\n doc.content.push(this.headerRow(category.name));\r\n transactions = category.transactions;\r\n footer = category.subtotal;\r\n footer.tradeDate = null;\r\n footer.settlementDate = null;\r\n footer.quantity = 'n/a';\r\n footer.unitPrice = 'n/a';\r\n\r\n doc.content.push(this.table(transactions, headerCols, displayHeaderCols, widths, null, colspan, footer));\r\n }\r\n }\r\n return doc;\r\n }\r\n\r\n getCapitalGainsReport(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var report = this.report as RealisedCapitalGainsReport;\r\n var footer, colspan = 1;\r\n if (report && report.assetClasses.length > 0) {\r\n var assetClasses = report.assetClasses as RealisedCapitalGainsAssetClass[];\r\n\r\n for (var i = 0; i < assetClasses.length; i++) {\r\n var assetClass = assetClasses[i] as RealisedCapitalGainsAssetClass;\r\n doc.content.push(this.headerRow(assetClass.name));\r\n // AE: Capital Gains Report header row fix\r\n doc.content.push(this.table(null, headerCols, displayHeaderCols, widths, null, colspan, null));\r\n var assets = assetClass.assets as RealisedCapitalGainsAsset[];\r\n for (var j = 0; j < assets.length; j++) {\r\n var asset = assets[j] as RealisedCapitalGainsAsset;\r\n doc.content.push(this.subHeaderRow(asset.name));\r\n footer = asset.subtotal;\r\n footer.purchaseDate = null;\r\n\r\n footer.saleDate = null;\r\n doc.content.push(this.table(asset.capitalGains, headerCols, null, widths, null, colspan, footer));\r\n }\r\n\r\n footer = assetClass.subtotal;\r\n\r\n\r\n footer.purchaseDate = null;\r\n footer.saleDate = null;\r\n footer.quantity = null;\r\n doc.content.push(this.subTotalTable(null, headerCols, null, widths, 'Sub Total', colspan, footer));\r\n }\r\n footer = report.total;\r\n footer.purchaseDate = null;\r\n footer.saleDate = null;\r\n footer.quantity = null;\r\n doc.content.push(this.totalTable(null, headerCols, null, widths, 'Total', colspan, footer));\r\n }\r\n return doc;\r\n }\r\n getUnrealisedCapitalGainsReport(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var report = this.report as UnrealisedCapitalGainsReport;\r\n var footer, colspan = 1;\r\n if (report && report.assetClasses.length > 0) {\r\n var assetClasses = report.assetClasses as UnrealisedCapitalGainsAssetClass[];\r\n for (var i = 0; i < assetClasses.length; i++) {\r\n var assetClass = assetClasses[i] as UnrealisedCapitalGainsAssetClass;\r\n doc.content.push(this.headerRow(assetClass.name));\r\n // AE: Unreleased Capital Gains headers row fix\r\n doc.content.push(this.table(null, headerCols, displayHeaderCols, widths, null, colspan, null));\r\n var assets = assetClass.assets as UnrealisedCapitalGainsAsset[];\r\n for (var j = 0; j < assets.length; j++) {\r\n var asset = assets[j] as UnrealisedCapitalGainsAsset;\r\n doc.content.push(this.subHeaderRow(asset.name));\r\n footer = asset.subtotal;\r\n footer.purchaseDate = null;\r\n doc.content.push(this.table(asset.capitalGains, headerCols, null, widths, null, colspan, footer));\r\n }\r\n footer = assetClass.subtotal;\r\n footer.purchaseDate = null;\r\n footer.quantity = 'n/a';\r\n footer.marketValue = 'n/a';\r\n footer.indexedCostBase = 'n/a';\r\n footer.discountedCostBase = 'n/a';\r\n footer.indexedGain = 'n/a';\r\n doc.content.push(this.subTotalTable(null, headerCols, null, widths, 'Sub Total', colspan, footer));\r\n }\r\n footer = report.total;\r\n footer.purchaseDate = null;\r\n footer.quantity = 'n/a';\r\n footer.marketValue = 'n/a';\r\n footer.indexedCostBase = 'n/a';\r\n footer.discountedCostBase = 'n/a';\r\n footer.indexedGain = 'n/a';\r\n doc.content.push(this.totalTable(null, headerCols, null, widths, 'Total', colspan, footer));\r\n }\r\n return doc;\r\n }\r\n getPerformanceReport(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var report = this.report as PerformanceReport;\r\n if (!report) {\r\n return null;\r\n }\r\n var columnNames = columnDefinitions.columnNames;\r\n var displayNames = columnDefinitions.displayNames;\r\n var performanceTable = {\r\n table: {\r\n widths: columnDefinitions.columnWidths,\r\n headerRows: 0,\r\n body: []\r\n },\r\n layout: this.getPerformanceLayout() //this.layoutThinLightBorder()\r\n }\r\n doc.content.push(this.headerRow(\"Performance\"));\r\n\r\n for (var i = 0; i < columnNames.length; i++) {\r\n var displayName = displayNames[i];\r\n var item = columnNames[i];\r\n var value = this.currencyFormatted(report[item]);\r\n if (i == 0 || i > columnNames.length-3){\r\n performanceTable.table.body.push([\r\n { text: displayName, border: [false, false, false, true], style: this.pdfBuilder.styles.tableCellBold },\r\n { text: value, alignment: 'right', border: [false, false, false, true], style: this.pdfBuilder.styles.tableCellBold }\r\n ]);\r\n } else {\r\n performanceTable.table.body.push([\r\n { text: displayName, border: [false, false, false, true], style: this.pdfBuilder.styles.tableCell },\r\n { text: value, alignment: 'right', border: [false, false, false, true], style: this.pdfBuilder.styles.tableCell }\r\n ]);\r\n }\r\n }\r\n doc.content.push(performanceTable);\r\n return doc;\r\n }\r\n capitalizeFirstLetter(string) {\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n }\r\n // Holdings report\r\n\r\n\r\n handleLongString(category){\r\n category.items.forEach((x,index)=>{\r\n let words = x.securityName.split(\" \");\r\n let code = x.code.split(/[_\\s]+/);\r\n\r\n // split the words into subwords\r\n\r\n for (let i = 0; i < words.length; i++) {\r\n if (words[i].length > 5) {\r\n words[i] = words[i].substring(0, 5) + \" \" + words[i].substring(5);\r\n }\r\n }\r\n for (let i = 0; i < code.length; i++) {\r\n if (code[i].length > 3) {\r\n code[i] = code[i].substring(0, 3) + \" \" + code[i].substring(3);\r\n }\r\n }\r\n let newCode = code.join(\" \");\r\n category.items[index].code =newCode;\r\n let newSentence = words.join(\" \");\r\n category.items[index].securityName =newSentence\r\n } \r\n \r\n // split the code into two codes\r\n \r\n );\r\n }\r\n\r\n getValuationStatement(doc) {\r\n let columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n let headerCols = columnDefinitions.columnNames;\r\n let headerColsInternational = columnDefinitions.columnNamesInternational;\r\n let displayHeaderCols = columnDefinitions.displayNames;\r\n let displayHeaderColsInternational = columnDefinitions.displayNamesInternational;\r\n let widths = columnDefinitions.columnWidths;\r\n let widthsInternational = columnDefinitions.columnWidthsInternational;\r\n let valuationStatement = this.report as ValuationStatement;\r\n let tableBody: any[] = [];\r\n\r\n // Non-LOA securities\r\n if (valuationStatement.nonLoaSecurities) {\r\n let categories = valuationStatement.nonLoaSecurities as AssetCategory[];\r\n for (let i = 0; i < categories.length; i++) {\r\n let category = categories[i];\r\n this.handleLongString(category);\r\n tableBody = [];\r\n if(category.categoryName.includes(\"International\")){\r\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderColsInternational));\r\n tableBody.push(this.formatSubheadingRow(category.categoryName, headerColsInternational.length));\r\n let lineItems = this.formatDataForPdf(category.items);\r\n let footer = this.formatDataForPdf(category.subtotal);\r\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerColsInternational, null, null, 0, footer));\r\n doc.content.push(this.tableWithHeader(tableBody, headerColsInternational, widthsInternational));\r\n }else{\r\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\r\n tableBody.push(this.formatSubheadingRow(category.categoryName, headerCols.length));\r\n let lineItems = this.formatDataForPdf(category.items);\r\n let footer = this.formatDataForPdf(category.subtotal);\r\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\r\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\r\n\r\n }\r\n }\r\n }\r\n\r\n // Non-LOA unsettled dividends\r\n if (valuationStatement.nonLoaUnsettledDividends) {\r\n let dividends = valuationStatement.nonLoaUnsettledDividends;\r\n if (dividends.items && dividends.items.length > 0) {\r\n tableBody = []\r\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\r\n tableBody.push(this.formatSubheadingRow(\"Unsettled Dividends\", headerCols.length));\r\n let lineItems = this.formatDataForPdf(dividends.items);\r\n let footer = this.formatDataForPdf(dividends.subtotal);\r\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\r\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\r\n }\r\n }\r\n\r\n // LOA securities\r\n if (valuationStatement.loaSecurities) {\r\n let categories = valuationStatement.loaSecurities as AssetCategory[];\r\n for (let i = 0; i < categories.length; i++) {\r\n tableBody = [];\r\n let category = categories[i];\r\n this.handleLongString(category);\r\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\r\n tableBody.push(this.formatSubheadingRow(category.categoryName, headerCols.length));\r\n let lineItems = this.formatDataForPdf(category.items);\r\n let footer = this.formatDataForPdf(category.subtotal);\r\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\r\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\r\n }\r\n }\r\n\r\n // LOA unsettled dividends\r\n if (valuationStatement.loaUnsettledDividends) {\r\n let dividends = valuationStatement.loaUnsettledDividends;\r\n if (dividends.items && dividends.items.length > 0) {\r\n tableBody = [];\r\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\r\n tableBody.push(this.formatSubheadingRow(\"Unsettled Dividends\", headerCols.length));\r\n let lineItems = this.formatDataForPdf(dividends.items);\r\n let footer = this.formatDataForPdf(dividends.subtotal);\r\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\r\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths));\r\n }\r\n }\r\n if(valuationStatement.managedAccounts){\r\n Object.keys(valuationStatement.managedAccounts).forEach(key => {\r\n if (valuationStatement.managedAccounts[key].items.length) {\r\n let categories = valuationStatement.managedAccounts[key].items as AssetCategory[];\r\n tableBody = []\r\n tableBody.push(this.getHoldingsHeaderRow(displayHeaderCols));\r\n tableBody.push(this.formatSubheadingRow(this.capitalizeFirstLetter(key), headerCols.length));\r\n for (let i = 0; i < categories.length; i++) {\r\n let category = categories[i];\r\n this.handleLongString(category);\r\n tableBody.push(this.formatNestedSubheadingRow(category.categoryName, headerCols.length));\r\n let lineItems = this.formatDataForPdf(category.items);\r\n let footer = this.formatDataForPdf(category.subtotal);\r\n tableBody = tableBody.concat(this.buildTableBody(lineItems, headerCols, null, null, 0, footer));\r\n }\r\n doc.content.push(this.tableWithHeader(tableBody, headerCols, widths, displayHeaderCols));\r\n }\r\n \r\n })\r\n }\r\n // doc.content.push(this.tableWithHeader(tableBody, headerCols, widths, displayHeaderCols));\r\n\r\n // Grand totals\r\n if (valuationStatement.grandTotal) {\r\n let total = [];\r\n total.push(valuationStatement.grandTotal);\r\n doc.content.push(this.headerRow(\"Grand Totals\"));\r\n doc.content.push(this.table(total, columnDefinitions.totalColumnNames, columnDefinitions.totalDisplayNames, columnDefinitions.totalColumnWidths, null, 0, null));\r\n }\r\n\r\n return doc;\r\n }\r\n getQuarterlyReportsReport(doc) {\r\n let columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n let headerCols = columnDefinitions.columnNames;\r\n let displayHeaderCols = columnDefinitions.displayNames;\r\n let widths = columnDefinitions.columnWidths;\r\n let quarterlyReport = this.report as QuarterlyReportsListReport;\r\n let colspan = 1;\r\n if (quarterlyReport && quarterlyReport.investorDocs && quarterlyReport.investorDocs.length > 0) {\r\n doc.content.push(this.table(quarterlyReport.investorDocs,\r\n headerCols,\r\n displayHeaderCols,\r\n widths,\r\n null,\r\n colspan,\r\n null));\r\n }\r\n return doc;\r\n }\r\n getTaxReportsReport(doc) {\r\n let columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n let headerCols = columnDefinitions.columnNames;\r\n let displayHeaderCols = columnDefinitions.displayNames;\r\n let widths = columnDefinitions.columnWidths;\r\n let taxReport = this.report as TaxReportsListReport;\r\n let colspan = 1;\r\n if (taxReport && taxReport.investorDocs && taxReport.investorDocs.length > 0) {\r\n doc.content.push(this.table(taxReport.investorDocs,\r\n headerCols,\r\n displayHeaderCols,\r\n widths,\r\n null,\r\n colspan,\r\n null));\r\n }\r\n return doc;\r\n }\r\n getCashReport(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var cashReport = this.report as CashReport;\r\n var transactions, footer, colspan = 1;\r\n if (cashReport && cashReport.transactionGroups && cashReport.transactionGroups.length > 0) {\r\n var groups = cashReport.transactionGroups;\r\n for (var i = 0; i < groups.length; i++) {\r\n var group = groups[i];\r\n doc.content.push(this.headerRow(group.name));\r\n transactions = group.transactions;\r\n footer = group.closingBalance;\r\n doc.content.push(this.table(transactions, headerCols, displayHeaderCols, widths, null, colspan, footer));\r\n }\r\n }\r\n return doc;\r\n }\r\n getIncomeReport(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var incomeReport = this.report as IncomeReport;\r\n var categories: TransactionTypeCategory[];\r\n var subCategories: TransactionTypeSubCategory[];\r\n var footer: IncomeReportLineItem;\r\n var colspan = 4;\r\n\r\n if (incomeReport && incomeReport.transactionTypeCategories && incomeReport.transactionTypeCategories.length > 0) {\r\n var categories = incomeReport.transactionTypeCategories;\r\n for (var cat = 0; cat < categories.length; cat++) {\r\n var category = categories[cat];\r\n doc.content.push(this.headerRow(category.name));\r\n doc.content.push(this.tableWithHeader(null, columnDefinitions, widths, displayHeaderCols));\r\n for (var subCat = 0; subCat < category.subCategories.length; subCat++) {\r\n var subCategory = category.subCategories[subCat];\r\n if (subCategory.name != category.name) {\r\n doc.content.push(this.subHeaderRow(subCategory.name));\r\n }\r\n var lineItems = subCategory.lineItems;\r\n doc.content.push(this.table(lineItems, headerCols, null, widths, null, null, null));\r\n }\r\n\r\n footer = category.subtotal;\r\n footer.payDate = null;\r\n footer.exDate = null;\r\n footer.code = null;\r\n footer.description = null;\r\n doc.content.push(this.table(null, headerCols, null, widths, \"TOTAL \" + category.name.toUpperCase(), colspan, footer));\r\n }\r\n\r\n if (incomeReport && incomeReport.grandTotal) {\r\n footer = incomeReport.grandTotal;\r\n footer.payDate = null;\r\n footer.exDate = null;\r\n footer.code = null;\r\n footer.description = null;\r\n\r\n doc.content.push(this.table(null, headerCols, null, widths, \"INCOME LESS EXPENSES:\", colspan, footer));\r\n }\r\n }\r\n\r\n return doc;\r\n }\r\n\r\n getStandardLedger(doc) {\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var colspan = 1;\r\n\r\n var standardLedgerReport = this.report as StandardLedgerReport;\r\n if (standardLedgerReport &&\r\n standardLedgerReport.ledgerEntries &&\r\n standardLedgerReport.ledgerEntries.length > 0) {\r\n var entries = standardLedgerReport.ledgerEntries;\r\n doc.content.push(this.headerRow(\"Ledger\"));\r\n doc.content.push(this.ledgerTable(entries, headerCols, displayHeaderCols, widths, null, colspan, null));\r\n }\r\n\r\n return doc;\r\n }\r\n\r\n formatDataForPdf(data) {\r\n if (!data) return null;\r\n var pdfData = angular.copy(data);\r\n if (pdfData instanceof Array) {\r\n pdfData.map((item) => {\r\n this.formatDataRow(item);\r\n });\r\n } else {\r\n this.formatDataRow(pdfData);\r\n }\r\n return pdfData;\r\n }\r\n\r\n formatDataRow(item) {\r\n if (item == null || item === undefined) return null;\r\n switch (this.report.reportType) {\r\n case ReportType.CapitalTransactions:\r\n item.tradeDate = this.dateFormatted(item.tradeDate);\r\n item.settlementDate = this.dateFormatted(item.settlementDate);\r\n item.quantity = this.currencyFormatted(item.quantity);\r\n item.unitPrice = this.currencyFormatted(item.unitPrice);\r\n item.grossAmount = this.currencyFormatted(item.grossAmount);\r\n item.brokerage = this.currencyFormatted(item.brokerage);\r\n item.gst = this.currencyFormatted(item.gst);\r\n item.netAmount = this.currencyFormatted(item.netAmount);\r\n break;\r\n case ReportType.QuarterlyReports:\r\n break;\r\n case ReportType.Cash:\r\n item.date = this.dateFormatted(item.date);\r\n item.debit = this.currencyFormatted(this.absoluteValue(item.debit));\r\n item.credit = this.currencyFormatted(item.credit);\r\n item.balance = this.currencyFormatted(item.balance);\r\n break;\r\n case ReportType.Income:\r\n item.payDate = this.dateFormatted(item.payDate);\r\n item.exDate = this.dateFormatted(item.exDate);\r\n item.amount = this.currencyFormatted(item.amount);\r\n item.frankingCredits = this.currencyFormatted(item.frankingCredits);\r\n item.withholdingTax = this.currencyFormatted(item.withholdingTax);\r\n item.gst = this.currencyFormatted(item.gst);\r\n break;\r\n case ReportType.CapitalGains:\r\n item.purchaseDate = this.dateFormatted(item.purchaseDate);\r\n item.saleDate = this.dateFormatted(item.saleDate);\r\n item.quantity = this.integerFormatted(item.quantity);\r\n item.costPrice = this.currencyFormatted(item.costPrice);\r\n item.totalCost = this.currencyFormatted(item.totalCost);\r\n item.reducedCostBase = this.currencyFormatted(item.reducedCostBase);\r\n item.indexedCostBase = this.currencyFormatted(item.indexedCostBase);\r\n item.discountedCostBase = this.currencyFormatted(item.discountedCostBase);\r\n item.capitalLoss = this.currencyFormatted(item.capitalLoss);\r\n item.indexedGain = this.currencyFormatted(item.indexedGain);\r\n item.grossDiscountGain = this.currencyFormatted(item.grossDiscountGain);\r\n item.salePrice = this.currencyFormatted(item.salePrice);\r\n item.otherGain = this.currencyFormatted(item.otherGain);\r\n item.capitalProceeds = this.currencyFormatted(item.capitalProceeds);\r\n break;\r\n case ReportType.UnrealisedCapitalGains:\r\n item.purchaseDate = this.dateFormatted(item.purchaseDate);\r\n item.quantity = this.integerFormatted(item.quantity);\r\n item.costPrice = this.currencyFormatted(item.costPrice);\r\n item.totalCost = this.currencyFormatted(item.totalCost);\r\n item.reducedCostBase = this.currencyFormatted(item.reducedCostBase);\r\n item.indexedCostBase = this.currencyFormatted(item.indexedCostBase);\r\n item.discountedCostBase = this.currencyFormatted(item.discountedCostBase);\r\n item.capitalLoss = this.currencyFormatted(item.capitalLoss);\r\n item.indexedGain = this.currencyFormatted(item.indexedGain);\r\n item.grossDiscountGain = this.currencyFormatted(item.grossDiscountGain);\r\n item.otherGain = this.currencyFormatted(item.otherGain);\r\n item.marketPrice = this.currencyFormatted(item.marketPrice);\r\n item.marketValue = this.currencyFormatted(item.marketValue);\r\n break;\r\n case ReportType.Performance:\r\n break;\r\n case ReportType.TaxReports:\r\n break;\r\n case ReportType.Valuation:\r\n if (item.hasOwnProperty(\"unsettledIncome\")) {\r\n item.code = item.securityCode;\r\n item.marketValue = this.currencyFormatted(item.unsettledIncome);\r\n } else {\r\n item.quantity = this.currencyFormatted(item.quantity);\r\n item.costPrice = this.formatAsCurrency4DecPts(item.costPrice);\r\n item.totalCost = this.currencyFormatted(item.totalCost);\r\n item.price = this.formatAsCurrency4DecPts(item.price);\r\n item.marketValue = this.currencyFormatted(item.marketValue);\r\n item.profitOrLoss = this.currencyFormatted(item.profitOrLoss);\r\n item.pctAssets = this.percentFormatted(item.pctAssets);\r\n item.estAnnualIncome = this.currencyFormatted(item.estAnnualIncome);\r\n item.estAnnualGrossIncome = this.currencyFormatted(item.estAnnualGrossIncome);\r\n item.estFrankingCredits = this.currencyFormatted(item.estFrankingCredits);\r\n item.estGrossYield = this.percentFormatted(item.estGrossYield);\r\n\r\n item.nativeCostPrice = this.currencyFormatted(item.nativeCostPrice);\r\n item.nativeTotalCost = this.currencyFormatted(item.nativeTotalCost);\r\n item.nativeMarketPrice = this.currencyFormatted(item.nativeMarketPrice);\r\n item.nativeMarketValue = this.currencyFormatted(item.nativeMarketValue);\r\n item.nativeProfitLoss = this.currencyFormatted(item.nativeProfitLoss);\r\n }\r\n break;\r\n case ReportType.StandardLedger:\r\n item.ledgerDate = this.dateFormatted(item.ledgerDate);\r\n item.amount = this.currencyFormatted(item.amount);\r\n item.balance = this.currencyFormatted(item.balance);\r\n item.isCancelled = IdMgr.YesNo()(item.isCancelled);\r\n item.isOpen = IdMgr.YesNo()(item.isOpen);\r\n break;\r\n default:\r\n console.error('Unrecognised report type encountered: ' + this.report.reportType);\r\n return null;\r\n }\r\n return item;\r\n }\r\n\r\n dateFormatted(date: Date) {\r\n return date ? moment(date).format(\"DD-MM-YYYY\") : null;\r\n }\r\n\r\n getPdfTemplateDefinition() {\r\n var deferred = this.q.defer();\r\n \r\n let timestamp = moment.tz(this.report.creationDateUtc, 'Australia/Sydney').format(\"h:mm a [AEST on] D MMM YYYY\");\r\n let reportTitle = this.report.title;\r\n //let adviserName = this.account.adviserName ? this.account.adviserName : \"\";\r\n //let dateHeading: any[] = this.buildDateHeading(this.report.asAtDate, this.report.dateFrom, this.report.dateTo);\r\n let docDefinition = {\r\n pageSize: 'A4',\r\n pageOrientation: 'landscape',\r\n pageMargins: [ 56, 28, 56, 60 ],\r\n content: [\r\n this.pdfBuilder.getImageContent(),\r\n {\r\n text: reportTitle,\r\n style: this.pdfBuilder.styles.header,\r\n margin: [0, 0, 0, 0]\r\n },\r\n {\r\n text: this.filter(\"accountName\")(this.account.designation ? this.account.accountName+' '+this.account.designation : this.account.accountName),\r\n style: this.pdfBuilder.styles.subHeader,\r\n margin: [0, 5, 0, 10]\r\n },\r\n this.buildHeadingTable(this.report.asAtDate, this.report.dateFrom, this.report.dateTo),\r\n ],\r\n footer: this.pdfBuilder.docDefinition.footer,\r\n styles: {\r\n header: {\r\n fontSize: 16,\r\n bold: false,\r\n margin: [5, 5, 0, 10]\r\n },\r\n headerText: {\r\n margin: [5, 5, 5, 5]\r\n },\r\n lastHeaderText: {\r\n margin: [5, 5, 5, 15]\r\n },\r\n tableHeader: {\r\n fontSize: 8,\r\n bold: true,\r\n alignment: 'center',\r\n fillColor: '#dadada',\r\n margin: [5, 5, 0, 10]\r\n },\r\n filledHeader: {\r\n bold: true,\r\n fontSize: 8,\r\n color: 'white',\r\n fillColor: this.pdfBuilder.userCompany.colorSecondary,\r\n margin: [10, 2, 2, 2],\r\n },\r\n filledHoldingsHeader: {\r\n bold: true,\r\n fontSize: 8,\r\n color: 'white',\r\n fillColor: '#dadada',\r\n margin: [10, 2, 2, 2],\r\n },\r\n secondaryHeader: {\r\n bold: true,\r\n fontSize: 8,\r\n color: 'black',\r\n alignment: 'left'\r\n },\r\n footerRow: {\r\n bold: true,\r\n fontSize: 8,\r\n margin: [0, 2, 2, 2]\r\n },\r\n footerText: {\r\n fontSize: 5,\r\n bold: false,\r\n alignment: 'center'\r\n }\r\n }\r\n };\r\n deferred.resolve(docDefinition);\r\n return deferred.promise;\r\n }\r\n appendSpannedCells(row: any[], span: number): any[] {\r\n // For a colspanning cell, we must still define the empty cells.\r\n for (let i = 1; i < span; i++) {\r\n row.push({border: [false, false, false, false]});\r\n }\r\n return row;\r\n }\r\n\r\n\r\n formatNestedSubheadingRow(label: string, colspan: number) {\r\n let row: any[] = [];\r\n row.push({\r\n border: [false, false, false, false],\r\n text: label,\r\n colSpan: colspan,\r\n style: this.pdfBuilder.styles.filledSubHeader,\r\n margin: [0, 5, 5, 5],\r\n alignment: 'left' });\r\n this.appendSpannedCells(row, colspan);\r\n return row;\r\n }\r\n\r\n formatSubheadingRow(label: string, colspan: number) {\r\n let row: any[] = [];\r\n row.push({\r\n border: [false, false, false, false],\r\n text: label,\r\n colSpan: colspan,\r\n style: this.pdfBuilder.styles.filledHeader,\r\n margin: [0, 5, 5, 5],\r\n alignment: 'left' });\r\n this.appendSpannedCells(row, colspan);\r\n return row;\r\n }\r\n\r\n headerRow(label: string) {\r\n return {\r\n table: {\r\n widths: ['*'],\r\n body: [\r\n [\r\n {\r\n border: [false, false, false, false],\r\n text: label,\r\n style: this.pdfBuilder.styles.filledHeader,\r\n margin: [5, 2, 2, 2]\r\n }\r\n ]\r\n ]\r\n },\r\n layout: 'noBorders'\r\n };\r\n }\r\n\r\n subHeaderRow(label: string) {\r\n return {\r\n table: {\r\n widths: ['*'],\r\n body: [[{ text: label, style: 'secondaryHeader', margin: [5,2,2,2] }]]\r\n },\r\n layout: 'noBorders'\r\n };\r\n }\r\n\r\n // if footerLabel - Sub Total\r\n table(transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\r\n var data = this.formatDataForPdf(transactions);\r\n var footer = this.formatDataForPdf(footerData);\r\n return {\r\n fontSize: 8,\r\n table: {\r\n widths: widths,\r\n headerRows: 0,\r\n body: this.buildTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\r\n },\r\n layout: (headers) ? this.getTablelayout(false, false, true, false) : this.getTablelayout(false, false, false, false)//(headers) ? this.layoutThinLightBorderHeader() : this.layoutThinLightBorder()\r\n };\r\n }\r\n\r\n // if footerLabel - Sub Total\r\n ledgerTable(transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\r\n var data = this.formatDataForPdf(transactions);\r\n var footer = this.formatDataForPdf(footerData);\r\n return {\r\n fontSize: 8,\r\n table: {\r\n widths: widths,\r\n headerRows: 0,\r\n body: this.buildTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\r\n },\r\n layout: this.getTablelayout(false, false, false, false, true)\r\n };\r\n }\r\n\r\n // if footerLabel - Sub Total\r\n subTotalTable(transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\r\n var data = this.formatDataForPdf(transactions);\r\n var footer = this.formatDataForPdf(footerData);\r\n return {\r\n fontSize: 8,\r\n table: {\r\n widths: widths,\r\n headerRows: 0,\r\n body: this.buildSubTotalTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\r\n },\r\n layout: this.getTablelayout(true, false, false, false)\r\n };\r\n }\r\n\r\n // if footerLabel - Sub Total\r\n totalTable(transactions, columns, headers, widths, footerLabel, footerLabelColspan, footerData) {\r\n var data = this.formatDataForPdf(transactions);\r\n var footer = this.formatDataForPdf(footerData);\r\n return {\r\n fontSize: 8,\r\n table: {\r\n widths: widths,\r\n headerRows: 0,\r\n body: this.buildSubTotalTableBody(data, columns, headers, footerLabel, footerLabelColspan, footer)\r\n },\r\n layout: this.getTablelayout(false, true, false, false)\r\n };\r\n }\r\n\r\n tableWithHeader(bodyRows: any[], columns: any, columnWidths: any, headers: any) {\r\n let isHoldings = false;\r\n let tableBody: any[] = [];\r\n if (bodyRows) {\r\n isHoldings = true;\r\n for (var i = 0; i < bodyRows.length; i++){\r\n tableBody.push(bodyRows[i]);\r\n }\r\n }\r\n // fix for income and expenses report (body rows is null)\r\n else{\r\n if (headers) {\r\n tableBody.push(this.getHeaderRow(headers));\r\n }\r\n }\r\n return {\r\n fontSize: 8,\r\n table: {\r\n widths: columnWidths,\r\n headerRows: 1,\r\n body: tableBody\r\n },\r\n margin: isHoldings ? [0,0,0,10] : [],\r\n layout: (isHoldings) ?\r\n this.getTablelayout(false, false, false, true) :\r\n this.getTablelayout(false, false, true, false)\r\n };\r\n }\r\n\r\n buildHeadingTable(asAtDate: Date, dateFrom: Date, dateTo: Date){\r\n let headingTable = {\r\n style: { fontSize: 8 },\r\n margin: [-4, 8, 0, 5],\r\n table: {\r\n widths: ['auto', '*', 'auto', 'auto'],\r\n body: []\r\n }\r\n };\r\n\r\n headingTable.table.body.push([\r\n { border: [false, false, false, false], text: 'Adviser: ', style: { bold: true, alignment: 'left' } },\r\n { border: [false, false, false, false], text: this.account.adviserName ? this.account.adviserName : \"\", style: { bold: false, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\r\n ]);\r\n\r\n headingTable.table.body.push([\r\n { border: [false, false, false, false], text: 'Account No: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: this.account.accountId, style: { bold: false, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\r\n ]);\r\n\r\n if (!asAtDate) {\r\n headingTable.table.body.push(\r\n [\r\n { border: [false, false, false, false], text: 'From Date: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: moment(dateFrom).format(\"YYYY-MM-DD\"), style: { bold: false, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\r\n ]);\r\n headingTable.table.body.push(\r\n [\r\n { border: [false, false, false, false], text: 'To Date: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: moment(dateTo).format(\"YYYY-MM-DD\"), style: { bold: false, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: true, alignment: 'right', fontSize: 8 } },\r\n { border: [false, false, false, false], text: '', style: { bold: false, alignment: 'right', fontSize: 8 } }\r\n ]);\r\n }\r\n\r\n headingTable.table.body.push([\r\n { border: [false, false, false, false], text: 'Report Generated At: ', style: { bold: true, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: moment.tz(new Date(), 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), style: { bold: false, alignment: 'left', fontSize: 8 } },\r\n { border: [false, false, false, false], text: (asAtDate) ? 'As at:' : '', style: { bold: true, alignment: 'right', fontSize: 8 } },\r\n { border: [false, false, false, false], text: (asAtDate) ? moment(asAtDate).tz('Sydney/Australia').format(\"D MMM YYYY hh:mm:ss A [AEST]\") : '', style: { bold: false, alignment: 'right', fontSize: 8.5 } }\r\n ]);\r\n\r\n return headingTable;\r\n }\r\n\r\n // footerLabel - Sub Total\r\n buildTableBody(data, columns, headers, footerLabel, footerLabelColspan, footerData) {\r\n var body = [];\r\n if (headers) {\r\n body.push(this.getHeaderRow(headers));\r\n }\r\n if (data) {\r\n data.forEach(row => {\r\n var dataRow = this.getRow(row, columns);\r\n body.push(dataRow);\r\n });\r\n }\r\n if (footerData) {\r\n body.push(this.getFooterRow(footerLabel, columns, footerLabelColspan, footerData));\r\n }\r\n return body;\r\n }\r\n\r\n // footerLabel - Sub Total\r\n buildSubTotalTableBody(data, columns, headers, footerLabel, footerLabelColspan, footerData) {\r\n var body = [];\r\n if (headers) {\r\n body.push(this.getHeaderRow(headers));\r\n }\r\n if (data) {\r\n data.forEach(row => {\r\n var dataRow = this.getSubTotalRow(row, columns);\r\n body.push(dataRow);\r\n });\r\n }\r\n if (footerData) {\r\n body.push(this.getSubTotalFooterRow(footerLabel, columns, footerLabelColspan, footerData));\r\n }\r\n return body;\r\n }\r\n\r\n isNumericHeader(header){\r\n var numericHeaders = [\r\n 'Quantity',\r\n 'Price',\r\n 'Cost',\r\n 'Value',\r\n 'Assets',\r\n 'Income',\r\n 'Credit',\r\n 'Debit',\r\n 'Balance',\r\n 'Yield',\r\n 'Amount',\r\n 'Brokerage',\r\n 'GST',\r\n 'Tax',\r\n 'Capital',\r\n 'Gain',\r\n 'Loss'\r\n ];\r\n return numericHeaders.some(function(v) { return header.indexOf(v) >= 0; });\r\n }\r\n\r\n getHeaderRow(headers) {\r\n var formattedHeaders = [];\r\n if (headers) {\r\n for (var h = 0; h < headers.length; h++) {\r\n formattedHeaders.push({\r\n border: [false, false, false, true],\r\n text: headers[h],\r\n style: this.pdfBuilder.styles.tableHeader,\r\n alignment: this.isNumericHeader(headers[h]) ? 'right' : 'left'\r\n }\r\n );\r\n }\r\n }\r\n return formattedHeaders;\r\n }\r\n\r\n getHoldingsHeaderRow(headers) {\r\n var formattedHeaders = [];\r\n if (headers) {\r\n for (var h = 0; h < headers.length; h++) {\r\n formattedHeaders.push({\r\n border: [false, true, false, true],\r\n text: headers[h],\r\n style: this.pdfBuilder.styles.filledHoldingsHeader,\r\n alignment: this.isNumericHeader(headers[h]) ? 'right' : 'left'\r\n }\r\n );\r\n }\r\n }\r\n return formattedHeaders;\r\n }\r\n\r\n getRow(data, columns) {\r\n var result = [];\r\n columns.forEach(column => {\r\n if (column && data[column]) {\r\n const style =JSON.parse(JSON.stringify(this.pdfBuilder.styles.tableCell))\r\n if(column === \"profitOrLoss\" || column === \"nativeProfitLoss\"){\r\n const value = parseFloat(data[column]);\r\n if(!isNaN(value)){\r\n if(value != 0){\r\n if (value > 0) { \r\n style.fillColor = '#dff0d8';\r\n }else{\r\n style.fillColor = '#f2dede'; \r\n }\r\n }\r\n }\r\n }\r\n result.push({\r\n border: [false, false, false, true],\r\n text: data[column].toString(),\r\n style: style,\r\n alignment: !isNaN(data[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left'\r\n });\r\n } else {\r\n result.push({border: [false, false, false, true], text:''});\r\n }\r\n });\r\n return result; \r\n }\r\n\r\n getSubTotalRow(data, columns) {\r\n var result = [];\r\n columns.forEach(column => {\r\n if (column && data[column]) {\r\n result.push({\r\n border: [false, true, false, false],\r\n text: data[column].toString(),\r\n style: this.pdfBuilder.styles.tableCell,\r\n alignment: !isNaN(data[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left'\r\n });\r\n } else {\r\n result.push({border: [false, true, false, false], text:''});\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n getFooterRow(footerLabel, columns, footerColspan, footerData) {\r\n let workingColumns = angular.copy(columns);\r\n let result = [];\r\n if (footerLabel) {\r\n result = [{\r\n text: footerLabel,\r\n colSpan: footerColspan,\r\n style: {bold: true},\r\n alignment: 'left',\r\n border: [false, false, false, false]\r\n }];\r\n delete workingColumns[0]; //this is to keep the same col count same as the rest of the table rows\r\n }\r\n if (!workingColumns || workingColumns.length <= 0) {\r\n return result;\r\n }\r\n workingColumns.forEach(column => {\r\n if (column && footerData[column]) {\r\n result.push({\r\n text: footerData[column].toString(),\r\n style: {bold: true},\r\n alignment: !isNaN(footerData[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left',\r\n margin: [0,0,0,0],\r\n border: [false, true, false, false]\r\n });\r\n } else {\r\n result.push({ text: '', style: {bold: true}, border: [false, false, false, false] });\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n getSubTotalFooterRow(footerLabel, columns, footerColspan, footerData) {\r\n let workingColumns = angular.copy(columns);\r\n let result = [];\r\n if (footerLabel) {\r\n result = [{\r\n text: footerLabel,\r\n colSpan: footerColspan,\r\n style: 'footerRow',\r\n alignment: 'left',\r\n border: [false, true, false, false]\r\n }];\r\n delete workingColumns[0]; //this is to keep the same col count same as the rest of the table rows\r\n }\r\n if (!workingColumns || workingColumns.length <= 0) {\r\n return result;\r\n }\r\n workingColumns.forEach(column => {\r\n if (column && footerData[column]) {\r\n result.push({\r\n text: footerData[column].toString(),\r\n style: 'footerRow',\r\n alignment: !isNaN(footerData[column].replace(/,/g, '').replace(/%/g, '')) ? 'right' : 'left',\r\n margin: [0,0,0,0],\r\n border: [false, true, false, false]\r\n });\r\n } else {\r\n result.push({ text: '', style: 'footerRow', border: [false, true, false, false] });\r\n }\r\n });\r\n return result;\r\n }\r\n\r\n integerFormatted(amount): string {\r\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\r\n return '';\r\n }\r\n let i: number = parseInt(amount);\r\n return this.addCommas(i.toString());\r\n }\r\n private formatAsCurrency4DecPts(amount: any): string {\r\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\r\n return '';\r\n }\r\n return amount.toFixed(4).replace(/\\d(?=(\\d{3})+\\.)/g, '$&,');\r\n\r\n }\r\n currencyFormatted(amount): string {\r\n if (amount === 'n/a' || amount === '' || amount === null || amount === undefined) {\r\n return '';\r\n }\r\n var i: number = parseFloat(amount);\r\n if (isNaN(i)) {\r\n i = 0.00;\r\n }\r\n var minus = '';\r\n if (i < 0) { minus = '-'; }\r\n i = Math.abs(i);\r\n i = parseInt(((i + .005) * 100).toString());\r\n i = i / 100;\r\n var s = i.toString();\r\n if (s.indexOf('.') < 0) { s += '.00'; }\r\n if (s.indexOf('.') === (s.length - 2)) { s += '0'; }\r\n s = minus + s;\r\n return this.addCommas(s);\r\n }\r\n addCommas(nStr): string {\r\n nStr = nStr + '';\r\n var x = nStr.split('.');\r\n var x1 = x[0];\r\n var x2 = x.length > 1 ? '.' + x[1] : '';\r\n var rgx = /(\\d+)(\\d{3})/;\r\n while (rgx.test(x1)) {\r\n x1 = x1.replace(rgx, '$1' + ',' + '$2');\r\n }\r\n return x1 + x2;\r\n }\r\n absoluteValue(amount: number): number {\r\n if (amount === null || amount === undefined) {\r\n return null;\r\n }\r\n return Math.abs(amount);\r\n }\r\n percentFormatted(amount: any) {\r\n let numberString: string = this.currencyFormatted(amount);\r\n return numberString + \"%\";\r\n }\r\n getFileName() {\r\n if (this.account == null) {\r\n return \"\";\r\n }\r\n if (this.report == null) {\r\n return \"\";\r\n }\r\n var accountId = this.account.accountId;\r\n var startDate = moment(this.report.dateFrom).format(\"YYYY-MM-DD\");\r\n var endDate = moment(this.report.dateTo).format(\"YYYY-MM-DD\");\r\n return accountId + \"-\" + this.report.reportType + \"-\" + startDate + \"_\" + endDate;\r\n }\r\n\r\n createCsvFile() {\r\n let nowDate = moment(new Date());\r\n let topLine = ReportDownloadService.getCsvTopLine(this.account, this.report.creationDateUtc, this.report.dateFrom, this.report.dateTo, this.report.asAtDate);\r\n var columnDefinition = this.getColumnDefinitions(this.report.reportType);\r\n var header = this.getCsvColumnHeadings();\r\n var columnNames = this.getCsvColumnNames();\r\n var data = this.getCsvData();\r\n var groupBy = columnDefinition.csvGroupBy\r\n\r\n let csvContent = [];\r\n\r\n let processCsvRows = function(rows){\r\n for (var i = 0; i < rows.length; i++) {\r\n var row = rows[i];\r\n var rowItems = [];\r\n\r\n\r\n for (var columnIndex = 0; columnIndex < columnNames.length; columnIndex++) {\r\n var val = row[columnNames[columnIndex]];\r\n rowItems.push(val);\r\n }\r\n\r\n csvContent.push(rowItems);\r\n }\r\n }\r\n\r\n if(groupBy){\r\n csvContent.push([topLine]);\r\n csvContent.push([]);\r\n // Group data by category\r\n let groupedData = data.reduce((acc, row) => {\r\n let category = row[groupBy];\r\n if (!acc[category]) {\r\n acc[category] = [];\r\n }\r\n acc[category].push(row);\r\n return acc;\r\n }, {});\r\n\r\n // Loop through each category and its rows\r\n for (let category in groupedData) {\r\n csvContent.push([category]);\r\n\r\n csvContent.push(header); // Add column headings for each category\r\n\r\n let rows = groupedData[category];\r\n\r\n // Loop through each row in the current category\r\n processCsvRows(rows);\r\n }\r\n }else{\r\n csvContent.push([topLine])\r\n csvContent.push(header);\r\n\r\n processCsvRows(data);\r\n }\r\n\r\n let managedAccounts = this.report.managedAccounts;\r\n if(managedAccounts){\r\n Object.keys(managedAccounts).forEach(key => {\r\n if(managedAccounts[key].items.length){\r\n csvContent.push([\"CG Managed Accounts\"])\r\n for (var i = 0; i < managedAccounts[key].items.length; i++) {\r\n if (managedAccounts[key].items[i] && managedAccounts[key].items[i].items.length > 0) {\r\n let asset = managedAccounts[key].items[i];\r\n csvContent.push([asset.categoryName, \"\", \"\", \"\", asset.subtotal.totalCost, \"\", asset.subtotal.marketValue, asset.subtotal.profitOrLoss, asset.subtotal.pctAssets, \"\", \"\", \"\"])\r\n csvContent.push(header);\r\n \r\n processCsvRows(asset.items);\r\n }\r\n }\r\n \r\n }\r\n })\r\n }\r\n\r\n let csvTotalColumnNames = columnDefinition.csvTotalColumnNames;\r\n let csvTotalDisplayNames = columnDefinition.csvTotalDisplayNames;\r\n\r\n if(columnDefinition.csvTotalColumnNames){\r\n let totals = this.report.grandTotal;\r\n\r\n //Grand totals\r\n csvContent.push(csvTotalDisplayNames);\r\n\r\n var rowItems = [];\r\n for (var columnIndex = 0; columnIndex < csvTotalColumnNames.length; columnIndex++) {\r\n var val = totals[csvTotalColumnNames[columnIndex]];\r\n \r\n rowItems.push(val);\r\n }\r\n csvContent.push(rowItems);\r\n \r\n }\r\n let EOL: string = '\\r\\n';\r\n let csvContentString: string = \"\";\r\n\r\n for (let row of csvContent) {\r\n let rowItems: any[] = [];\r\n\r\n for (let field of row) {\r\n let val: any = field;\r\n\r\n if (val === undefined || val === null) {\r\n val = \"\";\r\n }\r\n\r\n if (typeof val === 'string') {\r\n val = val.replace(/\"/g, '\"\"');\r\n }\r\n\r\n if (typeof val === 'number') {\r\n rowItems.push(val);\r\n } else {\r\n rowItems.push('\"' + val + '\"');\r\n }\r\n }\r\n\r\n csvContentString += rowItems.join(',') + EOL;\r\n }\r\n\r\n\r\n return new Blob([csvContentString], { type: 'text/csv;charset=utf-8' });\r\n }\r\n\r\n getColumnNames() {\r\n var definitions = this.getColumnDefinitions(this.report.reportType);\r\n return definitions ? definitions.columnNames : null;\r\n }\r\n\r\n getCsvColumnHeadings() {\r\n var definitions = this.getColumnDefinitions(this.report.reportType);\r\n return definitions ? definitions.csvDisplayNames : null;\r\n }\r\n\r\n getCsvColumnNames() {\r\n var definitions = this.getColumnDefinitions(this.report.reportType);\r\n return definitions ? definitions.csvColumnNames : null;\r\n }\r\n\r\n public static getCsvTopLine(account: Account, creationDateUtc: Date, dateFrom: Date, dateTo: Date, asAtDate: Date): string {\r\n let adviser = account.adviserName ? account.adviserName :\r\n account.adviserCode ? account.adviserCode : \"\";\r\n let timestamp = moment.tz(creationDateUtc,'Australia/Sydney').format(\"h:mm a [AEST on] D MMM YYYY\");\r\n\r\n let dateString: string;\r\n if (asAtDate === undefined) {\r\n let fromDateStr = moment(dateFrom).format(\"[From:] D MMM YYYY\");\r\n let toDateStr = moment(dateTo).format(\"[To:] D MMM YYYY\");\r\n dateString = fromDateStr + ' ' + toDateStr;\r\n } else {\r\n let asAtDateStr = moment(asAtDate).format(\"[As at:] D MMM YYYY\");\r\n dateString = asAtDateStr;\r\n }\r\n\r\n return 'Adviser: ' + adviser +\r\n ', Account: ' + account.accountId +\r\n ', ' + dateString +\r\n ', Report generated at: ' + timestamp;\r\n }\r\n\r\n getCsvData() {\r\n switch (this.report.reportType) {\r\n case ReportType.CapitalTransactions:\r\n return this.getCapitalTransactionStatementCsv();\r\n case ReportType.QuarterlyReports:\r\n return this.getQuarterlyReportsCsv();\r\n case ReportType.Cash:\r\n return this.getCashCsv();\r\n case ReportType.Income:\r\n return this.getIncomeCsv();\r\n case ReportType.CapitalGains:\r\n return this.getCapitalGainsCsv();\r\n case ReportType.UnrealisedCapitalGains:\r\n return this.getUnrealisedCapitalGainsCsv();\r\n case ReportType.Performance:\r\n return this.getPerformanceCsv();\r\n case ReportType.TaxReports:\r\n return this.getTaxReportsCsv();\r\n case ReportType.Valuation:\r\n return this.getValuationStatementCsv();\r\n case ReportType.StandardLedger:\r\n return this.getStandardLedgerCsv();\r\n default:\r\n console.error('Unrecognised report type encountered: ' + this.report.reportType);\r\n return null;\r\n }\r\n }\r\n getCapitalTransactionStatementCsv() {\r\n var result: any = [], csvData: any;\r\n var statement = this.report as CapitalTransactionStatement;\r\n var transactions;\r\n if (statement && statement.tradeCategories && statement.tradeCategories.length > 0) {\r\n var categories = statement.tradeCategories;\r\n for (var i = 0; i < categories.length; i++) {\r\n var category = categories[i];\r\n transactions = category.transactions;\r\n csvData = angular.copy(transactions);\r\n csvData.map((txn) => {\r\n delete txn.isSell;\r\n delete txn.sign;\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n }\r\n return result;\r\n }\r\n getCapitalGainsCsv() {\r\n var result: any = [], csvData: any;\r\n var report = this.report as RealisedCapitalGainsReport;\r\n if (report && report.assetClasses.length > 0) {\r\n var assetClasses = report.assetClasses as RealisedCapitalGainsAssetClass[];\r\n for (var i = 0; i < assetClasses.length; i++) {\r\n var assetClass = assetClasses[i] as RealisedCapitalGainsAssetClass;\r\n var assets = assetClass.assets as RealisedCapitalGainsAsset[];\r\n for (var j = 0; j < assets.length; j++) {\r\n var asset = assets[j] as RealisedCapitalGainsAsset;\r\n var capitalGains = asset.capitalGains as RealisedCapitalGain[];\r\n csvData = angular.copy(capitalGains);\r\n csvData.map((txn) => {\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n getUnrealisedCapitalGainsCsv() {\r\n var result: any = [], csvData: any;\r\n var report = this.report as UnrealisedCapitalGainsReport;\r\n if (report && report.assetClasses.length > 0) {\r\n var assetClasses = report.assetClasses as UnrealisedCapitalGainsAssetClass[];\r\n for (var i = 0; i < assetClasses.length; i++) {\r\n var assetClass = assetClasses[i] as UnrealisedCapitalGainsAssetClass;\r\n var assets = assetClass.assets as UnrealisedCapitalGainsAsset[];\r\n for (var j = 0; j < assets.length; j++) {\r\n var asset = assets[j] as UnrealisedCapitalGainsAsset;\r\n var capitalGains = asset.capitalGains as UnrealisedCapitalGain[];\r\n csvData = angular.copy(capitalGains);\r\n csvData.map((txn) => {\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n }\r\n }\r\n return result;\r\n }\r\n getPerformanceCsv() {\r\n var report = this.report as PerformanceReport;\r\n return [report];\r\n }\r\n getQuarterlyReportsCsv() {\r\n\r\n var result: any = [], csvData: any;\r\n var quarterlyReportsListReport = this.report as QuarterlyReportsListReport;\r\n\r\n if (quarterlyReportsListReport && quarterlyReportsListReport.investorDocs && quarterlyReportsListReport.investorDocs.length > 0) {\r\n var entries = quarterlyReportsListReport.investorDocs;\r\n csvData = angular.copy(entries);\r\n csvData.map((txn) => {\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n\r\n return result;\r\n }\r\n getTaxReportsCsv() {\r\n\r\n var result: any = [], csvData: any;\r\n var taxReportsListReport = this.report as TaxReportsListReport;\r\n\r\n if (taxReportsListReport && taxReportsListReport.investorDocs && taxReportsListReport.investorDocs.length > 0) {\r\n var entries = taxReportsListReport.investorDocs;\r\n csvData = angular.copy(entries);\r\n csvData.map((txn) => {\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n\r\n return result;\r\n }\r\n getCashCsv() {\r\n var result: any = [], csvData: any;\r\n var cashReport = this.report as CashReport;\r\n if (cashReport && cashReport.transactionGroups && cashReport.transactionGroups.length > 0) {\r\n var groups = cashReport.transactionGroups;\r\n for (var i = 0; i < groups.length; i++) {\r\n var group = groups[i];\r\n var transactions = group.transactions;\r\n csvData = angular.copy(transactions);\r\n csvData.map((txn) => {\r\n delete txn.aac;\r\n delete txn.accountName;\r\n delete txn.netValue;\r\n delete txn.openingBalance;\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n }\r\n return result;\r\n }\r\n getIncomeCsv() {\r\n var result: any = [], csvData: any, transactions: IncomeReportLineItem[];\r\n var columnDefinitions = this.getColumnDefinitions(this.report.reportType);\r\n var headerCols = columnDefinitions.columnNames;\r\n var displayHeaderCols = columnDefinitions.displayNames;\r\n var widths = columnDefinitions.columnWidths;\r\n var incomeReport = this.report as IncomeReport;\r\n var transactionTypeCategories = incomeReport.transactionTypeCategories;\r\n\r\n if (transactionTypeCategories && transactionTypeCategories.length > 0) {\r\n for (var cat = 0; cat < transactionTypeCategories.length; cat++) {\r\n let subcategories = transactionTypeCategories[cat].subCategories;\r\n for (var subCat = 0; subCat < subcategories.length; subCat++) {\r\n var lineItems = subcategories[subCat].lineItems;\r\n csvData = angular.copy(lineItems);\r\n csvData.map((txn) => {\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n getStandardLedgerCsv() {\r\n var result: any = [], csvData: any, transactions: LedgerEntry[];\r\n var standardLedgerReport = this.report as StandardLedgerReport;\r\n\r\n if (standardLedgerReport && standardLedgerReport.ledgerEntries && standardLedgerReport.ledgerEntries.length > 0) {\r\n var entries = standardLedgerReport.ledgerEntries;\r\n csvData = angular.copy(entries);\r\n csvData.map((txn) => {\r\n return this.formatDataRow(txn);\r\n });\r\n result = result.concat(csvData);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n getValuationStatementCsv() {\r\n let result: any = [];\r\n let csvData: any;\r\n let statement = this.report as ValuationStatement;\r\n if (statement.nonLoaSecurities && statement.nonLoaSecurities.length > 0) {\r\n let categories = statement.nonLoaSecurities;\r\n categories.forEach(cat => {\r\n csvData = angular.copy(cat.items);\r\n csvData = csvData.map((itm) => {\r\n return {\r\n category: itm.categoryName,\r\n code: itm.code,\r\n securityName: itm.securityName,\r\n quantity: itm.quantity,\r\n costPrice: this.safeFixedDecimals(itm.costPrice, 4),\r\n totalCost: this.safeFixedDecimals(itm.totalCost, 2),\r\n price: this.safeFixedDecimals(itm.price, 4),\r\n marketValue: this.safeFixedDecimals(itm.marketValue, 2),\r\n profitOrLoss: this.safeFixedDecimals(itm.profitOrLoss, 2),\r\n pctAssets: this.safeFixedDecimals(itm.pctAssets, 2),\r\n estAnnualIncome: this.safeFixedDecimals(itm.estAnnualIncome, 2),\r\n estFrankingCredits: this.safeFixedDecimals(itm.estFrankingCredits, 2),\r\n estGrossYield: this.safeFixedDecimals(itm.estGrossYield, 2)\r\n };\r\n });\r\n result = result.concat(csvData);\r\n });\r\n }\r\n if (statement.nonLoaUnsettledDividends && statement.nonLoaUnsettledDividends.items && statement.nonLoaUnsettledDividends.items.length > 0) {\r\n let dividends = statement.nonLoaUnsettledDividends;\r\n csvData = angular.copy(dividends.items);\r\n csvData = csvData.map((itm) => {\r\n return {\r\n category: \"Unsettled Dividends\",\r\n code: itm.securityCode,\r\n securityName: itm.securityName,\r\n quantity: null,\r\n costPrice: null,\r\n totalCost: null,\r\n price: null,\r\n marketValue: this.safeFixedDecimals(itm.unsettledIncome, 2),\r\n profitOrLoss: null,\r\n pctAssets: null,\r\n estAnnualIncome: null,\r\n estFrankingCredits: null,\r\n estGrossYield: null\r\n };\r\n });\r\n result = result.concat(csvData);\r\n }\r\n if (statement.loaSecurities && statement.loaSecurities.length > 0) {\r\n let categories = statement.loaSecurities;\r\n categories.forEach(cat => {\r\n csvData = angular.copy(cat.items);\r\n csvData = csvData.map((itm) => {\r\n return {\r\n category: itm.categoryName,\r\n code: itm.code,\r\n securityName: itm.securityName,\r\n quantity: itm.quantity,\r\n costPrice: this.safeFixedDecimals(itm.costPrice, 4),\r\n totalCost: this.safeFixedDecimals(itm.totalCost, 2),\r\n price: this.safeFixedDecimals(itm.price, 4),\r\n marketValue: this.safeFixedDecimals(itm.marketValue, 2),\r\n profitOrLoss: this.safeFixedDecimals(itm.profitOrLoss, 2),\r\n pctAssets: this.safeFixedDecimals(itm.pctAssets, 2),\r\n estAnnualIncome: this.safeFixedDecimals(itm.estAnnualIncome, 2),\r\n estFrankingCredits: this.safeFixedDecimals(itm.estFrankingCredits, 2),\r\n estGrossYield: this.safeFixedDecimals(itm.estGrossYield, 2)\r\n };\r\n });\r\n result = result.concat(csvData);\r\n });\r\n }\r\n if (statement.loaUnsettledDividends && statement.loaUnsettledDividends.items && statement.loaUnsettledDividends.items.length > 0) {\r\n let dividends = statement.loaUnsettledDividends;\r\n csvData = angular.copy(dividends.items);\r\n csvData = csvData.map((itm) => {\r\n return {\r\n category: \"Unsettled Dividends\",\r\n code: itm.securityCode,\r\n securityName: itm.securityName,\r\n quantity: null,\r\n costPrice: null,\r\n totalCost: null,\r\n price: null,\r\n marketValue: this.safeFixedDecimals(itm.unsettledIncome, 2),\r\n profitOrLoss: null,\r\n pctAssets: null,\r\n estAnnualIncome: null,\r\n estFrankingCredits: null,\r\n estGrossYield: null\r\n };\r\n });\r\n result = result.concat(csvData);\r\n }\r\n return result;\r\n }\r\n safeFixedDecimals(value: number, decimals: number): number {\r\n if (value === null || value === undefined) {\r\n return undefined;\r\n }\r\n\r\n return parseFloat(value.toFixed(decimals));\r\n }\r\n\r\n getPerformanceLayout(){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 1 || i === node.table.body.length-1) { return this.userCompany.colorSecondary }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n\r\n getTablelayout(subtotal: boolean, total: boolean, headers: boolean, holdings: boolean, noFooter: boolean = null): any {\r\n if (holdings){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 0) { return 'black'; }\r\n if (i === 2 || i === node.table.body.length-1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n //return 'lightgray';\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n if (subtotal){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 0) { return this.userCompany.colorSecondary; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n if (total){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 0) { return this.userCompany.colorSecondary; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n if (headers){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 1 || i === node.table.body.length-1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n if (noFooter){\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n //hLineColor: function(i, node) { return 'lightgray';},\r\n hLineColor: (i, node) => {\r\n if (i === node.table.body.length) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; }\r\n }\r\n }\r\n\r\n layoutThinLightBorderHeader(): any {\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 1 || i === node.table.body.length-1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; },\r\n }\r\n }\r\n\r\n layoutThinLightBorderHeaderHoldings(): any {\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n hLineColor: (i, node) => {\r\n if (i === 2 || i === node.table.body.length-1) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; },\r\n }\r\n }\r\n\r\n layoutThinLightBorder(): any {\r\n return {\r\n hLineWidth: (i, node) => { return 1; },\r\n vLineWidth: (i, node) => { return 1; },\r\n //hLineColor: function(i, node) { return 'lightgray';},\r\n hLineColor: (i, node) => {\r\n if (i === node.table.body.length) { return this.userCompany.colorSecondary; }\r\n else { return 'lightgray'; }\r\n },\r\n vLineColor: (i, node) => { return 'lightgray'; },\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class BulkDownloadService {\r\n\r\n q: ng.IQService;\r\n http: ng.IHttpService;\r\n window: any;\r\n\r\n static $inject = ['$q', '$window', '$http'];\r\n\r\n constructor($q, $window, $http) {\r\n this.q = $q;\r\n this.http = $http;\r\n this.window = $window;\r\n }\r\n\r\n downloadItems = function(items: any[], zipFilename: string) : ng.IPromise {\r\n let zip = new JSZip();\r\n let http = this.http;\r\n let window = this.window;\r\n\r\n var fileDownloads = [];\r\n angular.forEach(items, function (item) {\r\n fileDownloads.push(\r\n http.get(item.uri, { responseType: 'arraybuffer' })\r\n .then(result => {\r\n let filename = item.name;\r\n\r\n // If the item has a pretty filename then use it as the filename\r\n if (item.prettyFileName && item.prettyFileName !== '') {\r\n filename = item.prettyFileName\r\n }\r\n\r\n console.info('Zipping ' + filename);\r\n zip.file(filename, result.data, { binary: true });\r\n })\r\n .catch(response => {\r\n console.error('Error downloading file from ' + item.uri, response.status, response.data);\r\n }));\r\n });\r\n\r\n let deferred = this.q.defer();\r\n\r\n return this.q.all(fileDownloads)\r\n .then(() => {\r\n console.info('Generating zip file');\r\n zip.generateAsync({ type: \"blob\" })\r\n .then(blob => {\r\n window.saveAs(blob, zipFilename);\r\n\r\n deferred.resolve();\r\n\r\n return deferred.promise;\r\n })\r\n .catch(response => {\r\n console.error('Error saving zip file', response.status, response.data);\r\n\r\n deferred.reject(response);\r\n\r\n return deferred.promise;\r\n })\r\n });\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class HelpService extends BaseService {\r\n getFAQs(): ng.IPromise {\r\n return this.get(\"/dataService/api/Faqs\");\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class NewsService extends BaseService {\r\n getNews(): ng.IPromise {\r\n return this.get(\"/dataService/api/News\");\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export interface UserCompany {\r\n companyName: string;\r\n companyImage: string;\r\n companyPdfImage: string;\r\n contactEmail: string;\r\n contactPhone: string;\r\n disclaimerEmail?: string;\r\n disclaimerWeb?: string;\r\n footerEmail?: string;\r\n footerWeb?: string;\r\n footerPDF?: string;\r\n faviconImage?: string;\r\n enableFeature?:boolean;\r\n enableWholesaleClientsResearch: boolean;\r\n\r\n colorPrimary?: string;\r\n colorPrimaryDarker?: string;\r\n colorSecondary?: string;\r\n colorTertiary?: string;\r\n colorLink?: string;\r\n }\r\n export class UserCompanyService extends BaseService {\r\n userCompany: UserCompany = null;\r\n isGettingData: boolean;\r\n isFaviconSet: boolean;\r\n isThemeSet: boolean;\r\n\r\n private waitForGettingData(): ng.IPromise {\r\n var deferred = this.q.defer();\r\n\r\n var check = () => {\r\n setTimeout(() => {\r\n if(!this.isGettingData){\r\n deferred.resolve(true);\r\n }else{\r\n check();\r\n }\r\n }, 300)\r\n } \r\n\r\n check()\r\n\r\n return deferred.promise;\r\n }\r\n\r\n setFavicon() {\r\n if(this.userCompany && this.userCompany.faviconImage && !this.isFaviconSet){\r\n $(\"#favicon\").attr(\"href\",this.userCompany.faviconImage);\r\n $(\"#favicon-shortcut\").attr(\"href\",this.userCompany.faviconImage);\r\n this.isFaviconSet = true;\r\n }\r\n }\r\n\r\n setTheme(){\r\n if(this.userCompany.colorPrimary && this.userCompany.colorPrimaryDarker && this.userCompany.colorTertiary && this.userCompany.colorSecondary && !this.isThemeSet){\r\n document.documentElement.style.setProperty('--color-primary', this.userCompany.colorPrimary );\r\n document.documentElement.style.setProperty('--color-primary-darker', this.userCompany.colorPrimaryDarker);\r\n document.documentElement.style.setProperty('--color-tertiary', this.userCompany.colorTertiary);\r\n document.documentElement.style.setProperty('--color-secondary', this.userCompany.colorSecondary);\r\n cssVars({\r\n variables: {\r\n '--color-primary': this.userCompany.colorPrimary,\r\n '--color-primary-darker': this.userCompany.colorPrimaryDarker,\r\n '--color-tertiary': this.userCompany.colorTertiary,\r\n '--color-secondary': this.userCompany.colorSecondary,\r\n }\r\n });\r\n this.isThemeSet = true;\r\n\r\n } \r\n }\r\n\r\n getUserCompany(): ng.IPromise {\r\n //provide a fallback company so that the portal does not fail if the API is down\r\n var fallbackCompany: UserCompany = {\r\n companyName: \"Canaccord Genuity\",\r\n companyPdfImage: \"/assets/content/CG WM Digital Black-01.svg\",\r\n companyPdfImage: \"/assets/content/CG WM Digital Black-01.svg\",\r\n contactEmail: \"CGAU-CGA@cgf.com\",\r\n contactPhone: \"1300 582 256\",\r\n enableWholesaleClientsResearch: false,\r\n }\r\n var deferred = this.q.defer(); // Type the deferred to get better 'intellisense' support\r\n if(this.isGettingData){\r\n this.waitForGettingData().then(() => {\r\n deferred.resolve(this.userCompany);\r\n })\r\n }else{\r\n if(this.userCompany === null){\r\n \r\n this.isGettingData = true\r\n var promise = this.get(\"/dataService/api/userCompany\")\r\n promise.then((data) => {\r\n this.userCompany = data;\r\n this.isGettingData = false\r\n this.setFavicon()\r\n this.setTheme()\r\n deferred.resolve(this.userCompany);\r\n }, (err) => {\r\n this.isGettingData = false\r\n this.setFavicon()\r\n this.setTheme()\r\n deferred.resolve(fallbackCompany);\r\n });\r\n }else{\r\n this.isGettingData = false\r\n this.setFavicon()\r\n deferred.resolve(this.userCompany);\r\n }\r\n }\r\n return deferred.promise;\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class RecaptchaVerifyService extends BaseService {\r\n // Confirm the response token received from Google Recaptcha is valid\r\n // This is posted to a server side controller so as not to expose the Recaptcha secret\r\n siteVerify(response: string): ng.IHttpPromise {\r\n let rv = new RecaptchaVerify();\r\n rv.remoteip = '';\r\n rv.response = response;\r\n var absoluteUrl = this.baseUrl + \"/dataService/api/recaptcha\";\r\n\r\n return this.post(\"/dataService/api/recaptcha\", rv); \r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ConfigurationService extends BaseService {\r\n\r\n getValueByKey(key: string): ng.IHttpPromise {\r\n return this.get(\"/dataService/odata/appconfigurations('\" + key + \"')\");\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class BannerService extends BaseService {\r\n\r\n getCurrent(): ng.IHttpPromise {\r\n return this.get(\"/dataService/odata/banners?$filter=publishDate lt \" + new Date().toJSON() + \"&$orderby=publishDate desc&$top=1\");\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class ChangeRequest {\r\n id: number;\r\n accountId: string;\r\n changeRequestType: string;\r\n requestDate: Date;\r\n originalData: string;\r\n modifiedData: string;\r\n\r\n changeRequestTypeDescription: string;\r\n isApproved: boolean = false;\r\n isRejected: boolean = false;\r\n approvalStatusDescription: string;\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ChangeRequestService extends BaseService {\r\n getChangeRequests() {\r\n return this.get(\"/dataService/odata/changeRequests\");\r\n }\r\n\r\n getChangeRequestsForApproval() {\r\n return this.get(\"/dataService/odata/changeRequests/ChangeRequestService.GetChangeRequestsForApproval\");\r\n }\r\n\r\n approveChangeRequest(changeRequestId: number, verificationCode: string) {\r\n return this.post('/dataService/odata/changeRequests(' + changeRequestId + ')/ChangeRequestService.ApproveChangeRequest', { smsToken: verificationCode });\r\n };\r\n\r\n rejectChangeRequest(changeRequestId: number) {\r\n return this.post('/dataService/odata/changeRequests(' + changeRequestId + ')/ChangeRequestService.RejectChangeRequest', null);\r\n };\r\n\r\n areAllAccountApproversRegistered(accountCode: string) {\r\n return this.get(\"/dataService/api/portfolios/\" + accountCode + \"/AreAllAccountApproversRegistered\");\r\n };\r\n\r\n getAccountApproversCount(accountCode: string) {\r\n return this.get(\"/dataService/api/portfolios/\" + accountCode + \"/GetAccountApproversCount\");\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class Feed {\r\n id: string;\r\n title: string;\r\n contentSnippet: string;\r\n content: string;\r\n feedTitle: string;\r\n publishedDate: Date;\r\n publication: string;\r\n author: string;\r\n link: string;\r\n imageLink: string;\r\n categories: Array;\r\n }\r\n\r\n export class ResearchFeedService extends BaseService {\r\n \r\n getAllPrivateWealthResearch() {\r\n return this.get(\"/dataService/api/ResearchArticles/AllPrivateWealthResearch\");\r\n }\r\n\r\n getAllStrategyAndEconomics() {\r\n return this.get(\"/dataService/api/ResearchArticles/AllStrategyAndEconomics\");\r\n }\r\n\r\n getFeaturedStrategyAndEconomics() {\r\n return this.get(\"/dataService/api/ResearchArticles/FeaturedStrategyAndEconomics\");\r\n }\r\n\r\n getTop3StrategyAndEconomics() {\r\n return this.get(\"/dataService/api/ResearchArticles/Top3StrategyAndEconomics\");\r\n }\r\n\r\n getTop3PrivateWealthResearch() {\r\n return this.get(\"/dataService/api/ResearchArticles/Top3PrivateWealthResearch\");\r\n }\r\n\r\n getLatestMorningMarket() {\r\n return this.get(\"/dataService/api/ResearchArticles/LatestMorningMarket\");\r\n }\r\n\r\n getAllQuantitativeAnalysis() {\r\n return this.get(\"/dataService/api/ResearchArticles/AllQuantitativeAnalysis\");\r\n }\r\n\r\n getFeaturedQuantitativeAnalysis() {\r\n return this.get(\"/dataService/api/ResearchArticles/FeaturedQuantitativeAnalysis\");\r\n }\r\n\r\n getFeaturedPrivateWealthResearch() {\r\n return this.get(\"/dataService/api/ResearchArticles/FeaturedPrivateWealthResearch\");\r\n }\r\n\r\n getTop3QuantitativeAnalysis() {\r\n return this.get(\"/dataService/api/ResearchArticles/Top3QuantitativeAnalysis\");\r\n }\r\n\r\n getArticle(articleId: string) {\r\n return this.get(\"/dataService/api/ResearchArticles/GetArticle?articleId=\"+articleId);\r\n }\r\n\r\n getLatestFeedItemForCategory(feedItems: Feed[], category: string) {\r\n console.log(feedItems);\r\n if (feedItems === null || feedItems === undefined) {\r\n return null;\r\n }\r\n\r\n let filteredItems = feedItems.filter(item => item.publication.toLowerCase() === category.toLowerCase());\r\n\r\n return this.orderFeedItemsByPublishedDateDescending(filteredItems)[0];\r\n }\r\n\r\n getLatestFeedItemExcludingCategories(feedItems: Feed[], categories: string[], index: number) {\r\n if (feedItems === null || feedItems === undefined) {\r\n return null;\r\n }\r\n\r\n let filteredItems = feedItems.filter(item => !item.categories.some(c => categories.indexOf(c) != -1));\r\n\r\n if (filteredItems.length <= index) {\r\n return null;\r\n }\r\n\r\n return this.orderFeedItemsByPublishedDateDescending(filteredItems)[index];\r\n }\r\n\r\n orderFeedItemsByPublishedDateDescending(feedItems: Feed[]) {\r\n if (feedItems === null || feedItems === undefined) {\r\n return null;\r\n }\r\n\r\n return feedItems.sort(function (a, b) {\r\n return moment(b.publishedDate).toDate().getTime() - moment(a.publishedDate).toDate().getTime();\r\n })\r\n }\r\n }\r\n}\r\n","var myServiceModule = angular.module(\"app.services\", []);\r\nmyServiceModule.value(\"version\", \"1.0.0\"); \r\nmyServiceModule.service('selectionService', Patersons.SelectionService);\r\nmyServiceModule.service('tokenService', Patersons.TokenService);\r\nmyServiceModule.service('sessionService', Patersons.SessionService);\r\nmyServiceModule.service('bearerInjector', Patersons.BearerInjector);\r\nmyServiceModule.service('identityService', Patersons.IdentityService);\r\nmyServiceModule.service('analysisService', Patersons.AnalysisService);\r\nmyServiceModule.service('clientConfigService', Patersons.ClientConfigService);\r\nmyServiceModule.service('portfolioService', Patersons.PortfolioService);\r\nmyServiceModule.service('myDetailsService', Patersons.MyDetailsService);\r\nmyServiceModule.service('recaptchaVerifyService', Patersons.RecaptchaVerifyService);\r\nmyServiceModule.service('configurationService', Patersons.ConfigurationService);\r\nmyServiceModule.service('bannerService', Patersons.BannerService);\r\nmyServiceModule.service('reportService', Patersons.ReportService);\r\nmyServiceModule.service('reportDownloadService', Patersons.ReportDownloadService);\r\nmyServiceModule.service('navigationService', Patersons.NavigationService);\r\nmyServiceModule.service('bulkDownloadService', Patersons.BulkDownloadService);\r\nmyServiceModule.service('helpService', Patersons.HelpService);\r\nmyServiceModule.service('newsService', Patersons.NewsService);\r\nmyServiceModule.service('userCompanyService', Patersons.UserCompanyService);\r\nmyServiceModule.service('changeRequestService', Patersons.ChangeRequestService);\r\nmyServiceModule.service('morningStarService', Patersons.MorningStarService);\r\nmyServiceModule.service('researchFeedService', Patersons.ResearchFeedService);\r\nmyServiceModule.service('pdfBuilderService', Patersons.PDFBuilderService);\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class MorningStarXrayPortfolio {\r\n holdingAllocation: Array;\r\n apiOptions: string = '{type: 3}';\r\n benchmark: MorningStarXrayIdentifier;\r\n constructor() {\r\n this.holdingAllocation = new Array();\r\n this.benchmark = new MorningStarXrayIdentifier('EUCA000620', 'MSID', 0); // the morningstar MSID they gave us...it will probably change\r\n }\r\n }\r\n export class MorningStarXrayIdentifier {\r\n Identifier: string;\r\n IdentifierType: string;\r\n Amount: number;\r\n constructor($identifier, $type, $amount) {\r\n this.Identifier = $identifier;\r\n this.IdentifierType = $type;\r\n this.Amount = $amount;\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class Investor {\r\n id: number;\r\n userId: number;\r\n accoladeOptions: AccoladeOptions;\r\n subscriptions: ResearchSubscription[];\r\n }\r\n export class AccoladeOptions {\r\n id: number;\r\n userId: number;\r\n hasElectronicQuarterlyReports: boolean;\r\n hasElectronicTaxReports: boolean;\r\n } \r\n export class ResearchSubscription {\r\n name: string;\r\n id: string;\r\n isSubscribed: boolean;\r\n updatedAt: Date;\r\n } \r\n\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class OrderRequest {\r\n id: number; \r\n portfolioId: number; \r\n requestDateTime: Date;\r\n securityCode: string;\r\n orderAction: string;\r\n volume: string;\r\n price: string; \r\n buyAtMarketRate: boolean;\r\n orderNumber: number; \r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class User {\r\n firstName: string;\r\n lastName: string;\r\n email: string;\r\n email2: string;\r\n password: string;\r\n password2: string;\r\n recaptchaResponse: string;\r\n }\r\n\r\n export class Profile {\r\n firstName: string;\r\n lastName: string;\r\n phoneNumber: string;\r\n isPhoneNumberVerified: boolean;\r\n email: string;\r\n isEmailAddressVerified: boolean;\r\n accountCodes: Array;\r\n }\r\n\r\n export class ProfileAddress {\r\n addressLine1: string;\r\n addressLine2: string;\r\n addressLine3: string;\r\n addressLine4: string;\r\n postcode: string;\r\n country: string;\r\n\r\n get address(): string{\r\n return [this.addressLine1, this.addressLine2, this.addressLine3, this.addressLine4, this.postcode, this.country].filter(Boolean).join(\"\\n\");\r\n }\r\n }\r\n\r\n export class PhoneDetails {\r\n mobilePhoneNumber: string;\r\n }\r\n\r\n export class ForgottenPanDetails {\r\n email: string;\r\n dob: string;\r\n }\r\n\r\n export class ForgottenPasswordDetails {\r\n pan: string;\r\n email: string;\r\n smsCode: string;\r\n }\r\n\r\n export class CreateAccount {\r\n url: string;\r\n }\r\n\r\n export class TaxFileNumber {\r\n number: string;\r\n }\r\n\r\n export class PasswordResetDetails {\r\n email: string;\r\n code: string;\r\n password: string;\r\n password2: string;\r\n }\r\n\r\n export class SetPasswordDetails {\r\n password: string;\r\n password2: string;\r\n }\r\n\r\n export class ChangePasswordDetails {\r\n currentPassword: string;\r\n newPassword: string;\r\n newPassword2: string;\r\n }\r\n\r\n export class ChangeEmailDetails {\r\n newEmail: string;\r\n }\r\n\r\n export class SkipMobileDetails {\r\n skipMobileRegistration: boolean;\r\n\r\n constructor(){\r\n this.skipMobileRegistration = true;\r\n }\r\n }\r\n\r\n export class PhoneConfirmationDetails {\r\n mobilePhoneNumber: string;\r\n code: string;\r\n }\r\n\r\n\r\n export class EmailConfirmation {\r\n userId: string;\r\n code: string;\r\n }\r\n\r\n export class ClientAdviser {\r\n Firstname: string;\r\n Surname: string;\r\n Telephone: string;\r\n Email: string;\r\n Description: string;\r\n HeadshotSmall: string;\r\n HeadshotLarge: string;\r\n constructor(firstname: string, surname: string, telephone: string, email: string, description: string, headshotLarge: string, headshotSmall: string) {\r\n this.Firstname = firstname;\r\n this.Surname = surname;\r\n this.Telephone = telephone;\r\n this.Email = email;\r\n this.Description = description;\r\n this.HeadshotLarge = headshotLarge;\r\n this.HeadshotSmall = headshotSmall;\r\n }\r\n }\r\n\r\n export class RecaptchaVerify {\r\n response: string;\r\n remoteip: string;\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class UserPreferences {\r\n pan: string = '';\r\n skipMobileRegistration: boolean = false;\r\n\r\n public static load(pan: string): UserPreferences {\r\n let prefsString: string = localStorage.getItem(UserPreferences.preferenceKeyName(pan));\r\n let prefs: UserPreferences = JSON.parse(prefsString) as UserPreferences || new UserPreferences();\r\n prefs.pan = pan;\r\n return prefs;\r\n }\r\n\r\n public save(): void {\r\n let prefsString: string = JSON.stringify(this, this.jsonReplacer);\r\n localStorage.setItem(UserPreferences.preferenceKeyName(this.pan), prefsString);\r\n }\r\n\r\n private static preferenceKeyName(pan: string): string {\r\n return `Patersons.Preferences.${pan}`;\r\n }\r\n\r\n private jsonReplacer(key, value): any {\r\n if (key == 'pan') {\r\n return undefined;\r\n } else {\r\n return value;\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class WatchlistItem {\r\n id: number; \r\n watchlistId: number; \r\n isin: string; \r\n\r\n constructor(watchlistId: number, isin: string) { \r\n this.isin = isin; \r\n this.watchlistId = watchlistId; \r\n }\r\n } \r\n export class Watchlist {\r\n name: string;\r\n description: string;\r\n id: number;\r\n relatedInvestorId: number;\r\n watchlistItems: Array;\r\n \r\n constructor(watchlistId?: number, name?: string, description?: string) {\r\n this.id = watchlistId;\r\n this.name = name;\r\n this.description = description;\r\n this.watchlistItems = new Array();\r\n }\r\n } \r\n export class Security {\r\n securityCode: string;\r\n isin: string;\r\n securityDescription: string;\r\n exchange: string;\r\n securityType: number;\r\n }\r\n export enum SelectListType {\r\n portfolio = 1,\r\n model = 2,\r\n watchlist = 3\r\n }\r\n export class WatchlistSelectListDescriptor {\r\n itemType: SelectListType;\r\n id: string;\r\n label: string;\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class Account {\r\n id: number;\r\n accountType: string;\r\n accountId: string;\r\n accountName: string;\r\n adviserCode: string;\r\n adviserName: string;\r\n totalCost: number;\r\n totalHoldingsValue: number;\r\n totalEstimatedAnnualIncome: number;\r\n totalHoldingsProfit: number;\r\n totalMovementToday: number;\r\n totalMovementPercentage: number;\r\n homePhoneNumber: string;\r\n workPhoneNumber: string;\r\n mobilePhoneNumber: string;\r\n email: string;\r\n emailContractNotes: string;\r\n pricesQuotedAt: any;\r\n registrationAddress: Address;\r\n postalAddress: Address;\r\n accountAddresses: AccountAddresses;\r\n residentialOrBusinessAddress: Address;\r\n creditBankAccount: BankAccountDetail;\r\n debitBankAccount: BankAccountDetail;\r\n holdings: Array;\r\n cashDeposits: Array;\r\n termDeposits: Array\r\n emailAddresses: Array;\r\n orderRequests: Array;\r\n confirmationNotes: Array;\r\n marketOrders: Array;\r\n reports: Array;\r\n isChessManaged: boolean;\r\n isAccolade: boolean;\r\n designation: string;\r\n bankingDetails: BankingDetails;\r\n hasTaxFileNumber: boolean;\r\n headerLoaded: boolean = false;\r\n summaryLoaded: boolean = false;\r\n summaryError: boolean = false;\r\n headerError: boolean = false;\r\n addressLine1: string;\r\n addressLine2: string;\r\n addressLine3: string;\r\n addressLine4: string;\r\n postcode: string;\r\n country: string;\r\n isAuthorisedAgentAccount: boolean = false;\r\n }\r\n export class AccountAddresses {\r\n residentialOrBusinessAddress: Address;\r\n registrationAddress: Address;\r\n postalAddress: Address;\r\n }\r\n\r\n export class BankingDetails {\r\n creditBankAccount: BankAccountDetail;\r\n debitBankAccount: BankAccountDetail;\r\n }\r\n\r\n\r\n // NOTE: In the UI templates, these are referred to as 'Contract Notes'.\r\n export class ConfirmationNote {\r\n id: number;\r\n investorPortfolioId: number;\r\n conNumber: string;\r\n conDate: Date;\r\n securityCode: string;\r\n securityDescription: string;\r\n type: string;\r\n units: number;\r\n currencyCode: string;\r\n nett: number;\r\n isSelected: boolean;\r\n uri: string;\r\n prettyFileName: string;\r\n }\r\n\r\n export class Holding {\r\n\r\n constructor(marketValue?: number, totalCost?: number, assetCategory?: string, isin?: string, securityName?: string) {\r\n this.marketValue = marketValue;\r\n this.totalCost = totalCost;\r\n this.assetCategory = assetCategory;\r\n this.isin = isin;\r\n this.securityName = securityName;\r\n }\r\n id: number;\r\n securityName: string;\r\n assetCategory: string;\r\n companyName: string;\r\n securityCode: string;\r\n isin: string;\r\n quantity: number;\r\n totalCost: number;\r\n averageCost: number;\r\n isInternational: boolean;\r\n lastPrice: number;\r\n exchange: string;\r\n marketValue: number;\r\n profitOrLoss: number;\r\n dividendPerShare: number;\r\n assetAllocationDomesticCash: number;\r\n assetAllocationDomesticEquity: number;\r\n assetAllocationDomesticFixedInterest: number;\r\n assetAllocationDomesticProperty: number;\r\n assetAllocationInternationalCash: number;\r\n assetAllocationOther: number;\r\n assetAllocationInternationalEquity: number;\r\n assetAllocationInternationalFixedInterest: number;\r\n assetAllocationInternationalProperty: number;\r\n frankedAmount: number;\r\n income: number;\r\n yield: number;\r\n priceToEarnings: number;\r\n asOf: Date;\r\n }\r\n\r\n export class Sector {\r\n sectorName: string;\r\n count: number;\r\n }\r\n export class BankAccountDetail {\r\n id: number;\r\n accountName: string;\r\n accountBSB: string;\r\n accountNumber: string;\r\n depositDividends: boolean;\r\n isChessManaged: boolean;\r\n cardType: string;\r\n serviceType: string;\r\n smsToken: string;\r\n }\r\n\r\n export class CashDeposit {\r\n id: number;\r\n instituteCode: string;\r\n accountName: string;\r\n balance: number;\r\n interestRate: number;\r\n type: string;\r\n }\r\n\r\n export class TermDeposit {\r\n accountCode: string;\r\n balance: number;\r\n rate: number;\r\n maturityDate: Date;\r\n provider: string;\r\n hasData(): boolean {\r\n return ((typeof this.accountCode != 'undefined' && this.accountCode) ||\r\n (typeof this.balance != 'undefined' && this.balance) ||\r\n (typeof this.rate != 'undefined' && this.rate) ||\r\n (typeof this.maturityDate != 'undefined' && this.maturityDate) ||\r\n (typeof this.provider != 'undefined' && this.provider)\r\n ) as any;\r\n }\r\n }\r\n\r\n export class Quote {\r\n securityCode: string;\r\n exchange: string;\r\n askPrice: number;\r\n askVolume: number;\r\n bidCount: number;\r\n bidPrice: number;\r\n bidVolume: number;\r\n totalVolume: number;\r\n totalValue: number;\r\n highPrice: number;\r\n lastPrice: number;\r\n lowPrice: number;\r\n matchPrice: number;\r\n matchVolume: number;\r\n marketValue: number;\r\n marketVolume: number;\r\n movement: number;\r\n openPrice: number;\r\n quotationBasisCode: string;\r\n tradingStatus: string;\r\n tradeCount: number;\r\n tradeDateTime: Date;\r\n updateDateTime: Date;\r\n previousClosePrice: number;\r\n\r\n }\r\n\r\n export class Address {\r\n id: number;\r\n address1: string;\r\n address2: string;\r\n address3: string;\r\n address4: string;\r\n city: string;\r\n stateCode: string;\r\n country: string;\r\n postCode: string;\r\n type: string;\r\n smsToken: string;\r\n }\r\n\r\n export class EmailAddress {\r\n\r\n constructor(id?: number, emailAddressType?: string, email?: string ) {\r\n this.id = id;\r\n this.email = email;\r\n this.emailAddressType = emailAddressType;\r\n }\r\n\r\n id: number;\r\n email: string;\r\n emailAddressType: string;\r\n smsToken: string;\r\n }\r\n\r\n\r\n export class Portfolio {\r\n Name: string;\r\n RiskProfile: string;\r\n Holdings: Array;\r\n constructor() {\r\n this.Holdings = new Array();\r\n }\r\n }\r\n\r\n export class SelectedAccountTotal {\r\n cashBalanceTotal: number;\r\n equityTotalCostTotal: number;\r\n equityMarketValueTotal: number;\r\n equityProfitLossTotal: number;\r\n equityEstimatedIncomeTotal: number;\r\n\r\n constructor() {\r\n this.cashBalanceTotal = 0;\r\n this.equityTotalCostTotal = 0;\r\n this.equityMarketValueTotal = 0;\r\n this.equityProfitLossTotal = 0\r\n this.equityEstimatedIncomeTotal = 0;\r\n }\r\n }\r\n\r\n export class Banner {\r\n imageUrl: string;\r\n contentTitle: string;\r\n contentDescription: string;\r\n buttonText: string;\r\n buttonUrl: string;\r\n isHidden: boolean;\r\n }\r\n\r\n export interface News {\r\n imageUrl: string;\r\n title: string;\r\n content: string;\r\n link: string;\r\n openInNewTab: boolean;\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface CallbackScope extends ng.IScope {\r\n events: any;\r\n\r\n }\r\n\r\n export class CallbackCtrl {\r\n\r\n scope: Patersons.CallbackScope;\r\n location: angular.ILocationService;\r\n window: ng.IWindowService;\r\n http: ng.IHttpService;\r\n tokenService: TokenService;\r\n identityService: IdentityService;\r\n state: angular.ui.IStateService;\r\n $analytics; \r\n\r\n static $inject = ['$scope', '$location', '$window', '$state', '$http', 'tokenService', 'applicationInsightsService', 'identityService', '$analytics'];\r\n\r\n constructor($scope, $location, $window, $state, $http, tokenService, applicationInsightsService, identityService, $analytics) {\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.http = $http;\r\n this.tokenService = tokenService;\r\n this.identityService = identityService;\r\n this.state = $state;\r\n this.$analytics = $analytics\r\n var url: string = this.location.url();\r\n\r\n var querystring = url.substring(url.lastIndexOf('#'), url.length);\r\n this.scope.events = this;\r\n console.log(querystring);\r\n var promise = this.tokenService.tokenManager.processTokenCallbackAsync(querystring);\r\n\r\n promise.then(value => {\r\n\r\n // The following sets the unique id for app insights to the sub\r\n var uuidKey = \"$$appInsights__uuid\";\r\n var uuid = applicationInsightsService._localStorage.get(uuidKey);\r\n if (uuid != tokenService.tokenManager.profile.sub) {\r\n var uuid = applicationInsightsService._localStorage.set(uuidKey, tokenService.tokenManager.profile.sub);\r\n }\r\n\r\n $scope.events.navigateOnSuccess();\r\n },\r\n (reason) => {\r\n alert('An error has occurred: ' + (reason && reason.message || \"Unknown error\"));\r\n this.tokenService.tokenManager.removeToken();\r\n //this.tokenService.tokenManager.redirectForLogout();\r\n window.location = \"/identity/connect/endsession\" as any;\r\n });\r\n }\r\n\r\n navigateOnSuccess() {\r\n var redirect_to = '/dashboard';\r\n var redirect_uri = window.localStorage.getItem('$psl.redirect_uri');\r\n if (redirect_uri) {\r\n window.localStorage.removeItem('$psl.redirect_uri');\r\n if(redirect_uri.indexOf(\"confirmPassword\") === -1){\r\n redirect_to = redirect_uri;\r\n }\r\n }\r\n if (this.tokenService.tokenManager.profile) {\r\n var profile = this.tokenService.tokenManager.profile;\r\n \r\n //let prefs: UserPreferences = UserPreferences.load(profile.preferred_username);\r\n this.$analytics.setUsername(profile.preferred_username);\r\n\r\n var trackLoginSuccess = function(callback){\r\n if(window['google_tag_manager']){\r\n var dataLayer = window[\"dataLayer\"] || [];\r\n dataLayer.push({\r\n 'event': 'interaction',\r\n 'target': 'Login',\r\n 'action': 'Login Success',\r\n 'userId': profile.preferred_username,\r\n 'eventCallback' : () => {\r\n callback()\r\n },\r\n 'eventTimeout' : 1500\r\n });\r\n }else{\r\n callback()\r\n }\r\n }\r\n trackLoginSuccess(() => {\r\n this.identityService.getSkipMobileRegistration().\r\n then((skipMobile) => {\r\n if (skipMobile === true) {\r\n console.log(skipMobile);\r\n this.window.location.href = redirect_to;\r\n return false;\r\n } else {\r\n // check if phone number is verifyed\r\n this.identityService.getIsPhoneNumberVerifyed().\r\n then((phone_number_verified: boolean) => {\r\n // if phone is veryfied\r\n if (phone_number_verified === true){\r\n console.log(profile);\r\n // go to dashboard\r\n this.window.location.href = redirect_to;\r\n return false;\r\n }\r\n else {\r\n // else\r\n this.identityService.saveSkipMobileRegistration(new SkipMobileDetails()).\r\n then(() => {\r\n this.window.location.href = '/registerMobile';\r\n }).\r\n catch(() => {\r\n this.window.location.href = '/registerMobile';\r\n });\r\n }\r\n });\r\n }\r\n }).\r\n catch(response => {\r\n this.window.location.href = redirect_to;\r\n return false;\r\n });\r\n })\r\n } else {\r\n this.window.location.href = redirect_to;\r\n return false;\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface NavbarScope extends ng.IScope {\r\n id: string;\r\n editMode: boolean;\r\n events: any;\r\n isLoggedIn: boolean;\r\n isNavCollapsed: boolean;\r\n profile: UserProfile;\r\n changeRequestCount: number;\r\n adviserList: Array;\r\n userCompany: UserCompany;\r\n themeRGB: any;\r\n }\r\n\r\n export class NavbarCtrl {\r\n scope: Patersons.NavbarScope;\r\n rootScope: ng.IRootScopeService;\r\n location;\r\n window;\r\n stateParams;\r\n http: ng.IHttpService;\r\n sessionService: Patersons.SessionService;\r\n clientConfigService: Patersons.ClientConfigService;\r\n userCompanyService: Patersons.UserCompanyService;\r\n static $inject = ['$scope', '$rootScope', '$location', '$window', '$stateParams', '$http', 'sessionService', 'clientConfigService', 'userCompanyService'];\r\n\r\n constructor($scope, $rootScope, $location, $window, $stateParams, $http, sessionService, clientConfigService,userCompanyService) {\r\n this.scope = $scope;\r\n this.rootScope = $rootScope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.sessionService = sessionService;\r\n this.clientConfigService = clientConfigService;\r\n this.userCompanyService = userCompanyService;\r\n\r\n this.scope.editMode = false;\r\n this.scope.events = this;\r\n this.scope.isLoggedIn = this.sessionService.isLoggedIn();\r\n this.scope.isNavCollapsed = true;\r\n this.scope.adviserList = [];\r\n console.log('adviserList');\r\n console.log(this.scope.adviserList);\r\n \r\n if (this.scope.isLoggedIn) {\r\n //console.log('loadAdviserData');\r\n this.scope.profile = this.sessionService.getCurrentUserProfile();\r\n this.loadAdviserData();\r\n this.loadPendingChangeRequestCount();\r\n this.load();\r\n \r\n }\r\n else{\r\n\r\n this.scope.adviserList = [];\r\n }\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n this.scope.themeRGB = this.hexToRgb(company.colorSecondary);\r\n })\r\n this.rootScope.$on('changeRequestActioned', function (event: ng.IAngularEvent, data: any) {\r\n $scope.changeRequestCount -= 1;\r\n });\r\n\r\n console.log('Navbar load');\r\n }\r\n hexToRgb(hex) {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result ? {\r\n r: parseInt(result[1], 16),\r\n g: parseInt(result[2], 16),\r\n b: parseInt(result[3], 16)\r\n } : null;\r\n }\r\n load(){\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n initComponent('component-autocomplete-top', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteHeader').then(function () {\r\n console.log('Done loading autocomplete.');\r\n morningstar.asterix.instanceRegistry.find('ecAutocompleteHeader').on('parameterChanged:latestSelectedSecurity', function (newVal) {\r\n if(newVal.secId){\r\n window['openAutocompleteResult'](newVal) //declared in autocomplete config\r\n morningstar.asterix.instanceRegistry.get('ecAutocompleteHeader').setParameter('search', '');\r\n }\r\n });\r\n });\r\n initComponent('component-autocomplete-top-2', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteHeader2').then(function () {\r\n console.log('Done loading autocomplete.');\r\n morningstar.asterix.instanceRegistry.find('ecAutocompleteHeader2').on('parameterChanged:latestSelectedSecurity', function (newVal) {\r\n if(newVal.secId){\r\n window['openAutocompleteResult'](newVal) //declared in autocomplete config\r\n morningstar.asterix.instanceRegistry.get('ecAutocompleteHeader2').setParameter('search', '');\r\n }\r\n });\r\n });\r\n initComponent('component-autocomplete-top-3', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteHeader3').then(function () {\r\n console.log('Done loading autocomplete.');\r\n morningstar.asterix.instanceRegistry.find('ecAutocompleteHeader3').on('parameterChanged:latestSelectedSecurity', function (newVal) {\r\n if(newVal.secId){\r\n window['openAutocompleteResult'](newVal) //declared in autocomplete config\r\n morningstar.asterix.instanceRegistry.get('ecAutocompleteHeader3').setParameter('search', '');\r\n }\r\n });\r\n });\r\n\r\n });\r\n }\r\n\r\n login() {\r\n this.sessionService.login();\r\n }\r\n\r\n logout() {\r\n this.sessionService.logout();\r\n }\r\n\r\n loadAdviserData() {\r\n console.log('loadAdviserData');\r\n var promise = this.clientConfigService.getAdviser();\r\n promise.then((result) => {\r\n //this.scope.$apply(() => {\r\n console.log('Loaded advisers');\r\n console.log(result);\r\n this.scope.adviserList = result;\r\n //});\r\n },\r\n (reason) => {\r\n this.clientConfigService.errorHandler = reason.data;\r\n }\r\n )\r\n }\r\n\r\n loadPendingChangeRequestCount() {\r\n console.log('loadPendingChangeRequestCount');\r\n var promise = this.clientConfigService.getChangeRequestCount();\r\n promise.then((result) => {\r\n //this.scope.$apply(() => {\r\n console.log('Loaded change requests');\r\n console.log(result);\r\n this.scope.changeRequestCount = result;\r\n //});\r\n },\r\n (reason) => {\r\n this.clientConfigService.errorHandler = reason.data;\r\n }\r\n )\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface FooterScope extends ng.IScope {\r\n events: any;\r\n isLoggedIn: boolean;\r\n profile: Patersons.UserProfile;\r\n userCompany: UserCompany;\r\n freezeWindow: Patersons.FreezeWindow;\r\n }\r\n\r\n export class FooterCtrl {\r\n scope: FooterScope;\r\n sessionService: Patersons.SessionService;\r\n reportService: Patersons.ReportService;\r\n userCompanyService: Patersons.UserCompanyService;\r\n static $inject = ['$scope', 'sessionService', 'userCompanyService', 'reportService'];\r\n\r\n constructor($scope, sessionService, userCompanyService, reportService) {\r\n this.scope = $scope;\r\n this.userCompanyService = userCompanyService;\r\n this.sessionService = sessionService;\r\n this.reportService = reportService;\r\n\r\n this.scope.events = this;\r\n this.scope.isLoggedIn = this.sessionService.isLoggedIn();\r\n if (this.scope.isLoggedIn) {\r\n this.scope.profile = this.sessionService.getCurrentUserProfile();\r\n this.checkFreezeWindow();\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n }\r\n\r\n checkFreezeWindow(){\r\n this.reportService.checkFreezeWindow().then((freezeWindow) => {\r\n this.scope.freezeWindow = freezeWindow;\r\n });\r\n }\r\n\r\n login() {\r\n this.sessionService.login();\r\n }\r\n\r\n logout() {\r\n this.sessionService.logout();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class LandingCtrl {\r\n\r\n scope: Patersons.NavbarScope;\r\n location;\r\n window;\r\n stateParams;\r\n http: ng.IHttpService;\r\n tokenService: Patersons.TokenService;\r\n\r\n static $inject = ['$scope', '$location', '$window', '$state', '$stateParams', '$http', 'tokenService'];\r\n\r\n constructor($scope, $location, $window, $state, $stateParams, $http, tokenService) {\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.tokenService = tokenService;\r\n\r\n this.scope.editMode = false;\r\n this.scope.events = this;\r\n\r\n if (this.tokenService.tokenManager) {\r\n if (this.tokenService.tokenManager.expired) {\r\n this.tokenService.tokenManager.redirectForToken();\r\n }\r\n else {\r\n $state.go(\"dashboard\"); \r\n }\r\n }\r\n else {\r\n $state.go(\"dashboard\"); \r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class AbstractController {\r\n baseUrl: string;\r\n rootScope: any;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n http: ng.IHttpService;\r\n log: ng.ILogService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope) {\r\n\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.rootScope = $rootScope;\r\n this.log = $log;\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n var dictionary: any = JSON.parse(model);\r\n this.baseUrl = dictionary['hostPath'];\r\n var userId = dictionary['userId'];\r\n }\r\n redirect(url: string) {\r\n this.location.url(url);\r\n this.window.location.href = url;\r\n this.window.location.reload();\r\n }\r\n errorHandler(msg, Url) {\r\n msg = msg || \"Unexpected Error\";\r\n var self = this;\r\n\r\n return function (response) {\r\n if (response.data.exceptionMessage) {\r\n this.log.error(response.data.exceptionMessage);\r\n }\r\n this.rootScope.$emit('error', { error: msg, url: Url });\r\n throw (response.data.errors || response.data.message || msg);\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class IdentityBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.deactivateAll();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ForgottenPanScope extends ng.IScope {\r\n email: string;\r\n dob: string;\r\n forgottenPanForm: ng.IFormController;\r\n isTriggered: boolean;\r\n errorHandler: any;\r\n events: Patersons.ForgottenPanCtrl;\r\n isBusy: boolean;\r\n }\r\n\r\n export class ForgottenPanCtrl extends IdentityBaseCtrl {\r\n scope: Patersons.ForgottenPanScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n http: ng.IHttpService;\r\n identityService: Patersons.IdentityService;\r\n tokenService: TokenService;\r\n response;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'identityService', 'tokenService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, identityService, tokenService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.identityService = identityService;\r\n this.tokenService = tokenService;\r\n\r\n this.scope.isBusy = false;\r\n\r\n this.scope.events = this;\r\n this.scope.isTriggered = false;\r\n }\r\n\r\n save() {\r\n this.scope.isTriggered = false;\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.forgottenPanForm.$invalid) {\r\n return;\r\n } else {\r\n let dto: ForgottenPanDetails = new ForgottenPanDetails();\r\n dto.email = this.scope.email;\r\n dto.dob = moment.utc(this.scope.dob, \"DD/MM/YYYY\").toISOString();\r\n\r\n this.scope.isBusy = true;\r\n\r\n this.identityService.triggerForgottenPan(dto)\r\n .then((result) => {\r\n this.scope.isTriggered = true;\r\n this.returnToLoginScreenIn(30);\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n }\r\n\r\n returnToLoginScreenIn(nSeconds: number) {\r\n return new Promise(() => setTimeout(() => this.tokenService.tokenManager.redirectForToken(), nSeconds * 1000));\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ForgottenPasswordScope extends ng.IScope { \r\n forgottenPasswordDetails: Patersons.ForgottenPasswordDetails; \r\n forgottenPasswordForm: ng.IFormController; \r\n isTriggered: boolean; \r\n validationMessage: string;\r\n isSmsRequired: boolean;\r\n errorHandler: any; \r\n events: Patersons.ForgottenPasswordCtrl; \r\n isBusy: boolean;\r\n userCompany: UserCompany\r\n }\r\n \r\n export class ForgottenPasswordCtrl {\r\n\r\n scope: Patersons.ForgottenPasswordScope;\r\n location: ng.ILocationService;\r\n log: ng.ILogService;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n http: ng.IHttpService; \r\n identityService: Patersons.IdentityService;\r\n tokenService: TokenService; \r\n response;\r\n userCompanyService: UserCompanyService\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', 'identityService', 'tokenService', 'userCompanyService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, identityService, tokenService, userCompanyService) {\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http; \r\n this.log = $log;\r\n this.identityService = identityService; \r\n this.tokenService = tokenService; \r\n this.userCompanyService = userCompanyService\r\n\r\n this.scope.isBusy = false;\r\n\r\n this.scope.isSmsRequired = false;\r\n this.scope.events = this; \r\n this.scope.isTriggered = false; \r\n\r\n\r\n \r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n } \r\n\r\n save() {\r\n this.scope.isTriggered = false;\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n //if (this.response) {\r\n // this.verifyResponse(this.response).then((result) => {\r\n // Once the token has been verified we can then complete the rest of the process\r\n //if (result && result.data && result.data.success == \"true\") {\r\n if (this.scope.forgottenPasswordForm.$invalid) {\r\n return;\r\n }\r\n else {\r\n\r\n this.scope.isBusy = true;\r\n this.identityService.triggerForgottenPassword(this.scope.forgottenPasswordDetails)\r\n .then((result) => {\r\n this.state.go('confirmPassword');\r\n },\r\n (reason) => {\r\n this.log.warn(reason);\r\n if (reason.status == '403') {\r\n this.scope.isSmsRequired = true;\r\n }\r\n if (reason.status == '400') {\r\n this.scope.validationMessage = reason.data.Message; \r\n }\r\n \r\n }\r\n ).\r\n finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n // }\r\n // });\r\n //}\r\n }\r\n\r\n setResponse = function (response) { \r\n this.response = response; \r\n }\r\n\r\n setWidgetId = function (widgetId) {\r\n console.info('Created widget ID: %s', widgetId);\r\n this.scope.widgetId = widgetId;\r\n };\r\n\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export interface TwoFactorAuthenticationScope extends ng.IScope {\r\n twoFactorAuthForm: ng.IFormController;\r\n events: Patersons.TwoFactorAuthenticationCtrl;\r\n isError: boolean;\r\n isSubmitted: boolean;\r\n informationMessage: string;\r\n errorMessage: string;\r\n verificationCode: string;\r\n isSendingCode: boolean;\r\n isBusy: boolean;\r\n nameOfPdf: string;\r\n linkToPdf: string;\r\n }\r\n\r\n export abstract class TwoFactorAuthenticationCtrl {\r\n scope: Patersons.TwoFactorAuthenticationScope;\r\n modalInstance: any;\r\n identityService: IdentityService;\r\n\r\n static $inject = ['$scope', '$uibModalInstance', 'identityService'];\r\n\r\n constructor($scope, $uibModalInstance, identityService) {\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.modalInstance = $uibModalInstance;\r\n this.identityService = identityService;\r\n\r\n this.scope.isError = false;\r\n this.scope.isSubmitted = false;\r\n this.scope.informationMessage = null;\r\n this.scope.errorMessage = null;\r\n\r\n this.scope.isSendingCode = false;\r\n this.scope.isBusy = false;\r\n\r\n this.sendVerificationCode();\r\n }\r\n\r\n sendVerificationCode() {\r\n this.scope.isSendingCode = true;\r\n this.scope.isSubmitted = false;\r\n this.scope.informationMessage = \"Sending verification code...\";\r\n this.scope.errorMessage = null;\r\n\r\n this.identityService.request2FAToken()\r\n .then((result) => {\r\n this.scope.isError = false;\r\n this.scope.informationMessage = \"A code has been sent via SMS to the mobile number registered on this profile. Please enter this code below to verify your identity.\";\r\n },\r\n (reason) => {\r\n this.scope.isError = true;\r\n this.scope.informationMessage = null;\r\n this.scope.errorMessage = \"Failed to send verification code. Please request a new code.\";\r\n })\r\n .finally(() => {\r\n this.scope.isSendingCode = false;\r\n });\r\n }\r\n\r\n submit() {\r\n this.scope.isSubmitted = true;\r\n this.modalInstance.close();\r\n }\r\n\r\n cancel() {\r\n this.scope.isSubmitted = false;\r\n this.modalInstance.dismiss();\r\n }\r\n\r\n handleErrorResponse(reason) {\r\n if (reason.status === 403) {\r\n this.showForbiddenMessage();\r\n }\r\n else {\r\n this.modalInstance.close(false);\r\n }\r\n }\r\n\r\n showForbiddenMessage() {\r\n this.scope.isError = true;\r\n this.scope.informationMessage = null;\r\n this.scope.errorMessage = \"The code you have entered is incorrect. Please try again, or click “Resend Code”. \";\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class BankDetailsChangeRequestCtrl extends TwoFactorAuthenticationCtrl {\r\n portfolioService: PortfolioService;\r\n accountId: string;\r\n bankAccountDetail: BankAccountDetail;\r\n saveAll: boolean;\r\n\r\n static $inject = ['$scope', '$uibModalInstance', 'identityService', 'portfolioService', 'account', 'bankAccountDetail', 'saveAll'];\r\n\r\n constructor($scope, $uibModalInstance, identityService, portfolioService, account, bankAccountDetail, saveAll) {\r\n super($scope, $uibModalInstance, identityService)\r\n\r\n this.portfolioService = portfolioService;\r\n\r\n this.accountId = account.accountId;\r\n this.bankAccountDetail = bankAccountDetail;\r\n this.saveAll = saveAll;\r\n\r\n this.scope.nameOfPdf = \"Banking and Electronic Consent\"\r\n this.scope.linkToPdf = \"https://www.canaccordgenuity.com/494d20/globalassets/wealth-management-australia/documents/forms/banking-and-electronic-consent-form-pershing.pdf\";\r\n }\r\n\r\n submit() {\r\n this.scope.isSubmitted = true;\r\n\r\n if (this.scope.twoFactorAuthForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n this.bankAccountDetail.smsToken = this.scope.verificationCode;\r\n if(this.saveAll){\r\n this.portfolioService.updateAllBankDetails(this.accountId, this.bankAccountDetail)\r\n .then((result) => {\r\n this.modalInstance.close(true);\r\n },\r\n (reason) => {\r\n this.handleErrorResponse(reason);\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }else{\r\n \r\n this.portfolioService.updateBankDetails(this.accountId, this.bankAccountDetail)\r\n .then((result) => {\r\n this.modalInstance.close(true);\r\n },\r\n (reason) => {\r\n this.handleErrorResponse(reason);\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n } \r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class SensitiveEmailAddressChangeRequestCtrl extends TwoFactorAuthenticationCtrl {\r\n portfolioService: PortfolioService;\r\n accountId: string;\r\n emailAddresses: EmailAddress[];\r\n\r\n static $inject = ['$scope', '$uibModalInstance', 'identityService', 'portfolioService', 'account', 'emailAddresses'];\r\n\r\n constructor($scope, $uibModalInstance, identityService, portfolioService, account, emailAddresses) {\r\n super($scope, $uibModalInstance, identityService)\r\n\r\n this.portfolioService = portfolioService;\r\n\r\n this.accountId = account.accountId;\r\n this.emailAddresses = emailAddresses;\r\n this.scope.nameOfPdf = \"Change of Account Details\"\r\n this.scope.linkToPdf = \"https://www.canaccordgenuity.com/4a460f/globalassets/wealth-management-australia/documents/forms/change-of-address-details-form\";\r\n }\r\n\r\n submit() {\r\n this.scope.isSubmitted = true;\r\n\r\n if (this.scope.twoFactorAuthForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.updateEmailAddress(0);\r\n }\r\n\r\n private updateEmailAddress(index: number) {\r\n if (index >= this.emailAddresses.length) {\r\n this.modalInstance.close(true);\r\n\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n this.emailAddresses[index].smsToken = this.scope.verificationCode;\r\n\r\n this.portfolioService.updateSensitiveEmailAddress(this.accountId, this.emailAddresses[index])\r\n .then((result) => {\r\n this.updateEmailAddress(index + 1);\r\n },\r\n (reason) => {\r\n this.handleErrorResponse(reason);\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class SensitiveAddressChangeRequestCtrl extends TwoFactorAuthenticationCtrl {\r\n portfolioService: PortfolioService;\r\n accountId: string;\r\n address: Address;\r\n\r\n static $inject = ['$scope', '$uibModalInstance', 'identityService', 'portfolioService', 'account', 'address'];\r\n\r\n constructor($scope, $uibModalInstance, identityService, portfolioService, account, address) {\r\n super($scope, $uibModalInstance, identityService)\r\n\r\n this.portfolioService = portfolioService;\r\n\r\n this.accountId = account.accountId;\r\n this.address = address;\r\n this.scope.nameOfPdf = \"Change of Account Details\"\r\n this.scope.linkToPdf = \"https://www.canaccordgenuity.com/4a460f/globalassets/wealth-management-australia/documents/forms/change-of-address-details-form\";\r\n }\r\n\r\n submit() {\r\n this.scope.isSubmitted = true;\r\n\r\n if (this.scope.twoFactorAuthForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n this.address.smsToken = this.scope.verificationCode;\r\n\r\n this.portfolioService.updateRegistrationAddressDetails(this.accountId, this.address)\r\n .then((result) => {\r\n this.modalInstance.close(true);\r\n },\r\n (reason) => {\r\n this.handleErrorResponse(reason);\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class ApproveChangeRequestCtrl extends TwoFactorAuthenticationCtrl {\r\n changeRequestService: ChangeRequestService;\r\n changeRequestId: number;\r\n\r\n static $inject = ['$scope', '$uibModalInstance', 'identityService', 'changeRequestService', 'changeRequestId'];\r\n\r\n constructor($scope, $uibModalInstance, identityService, changeRequestService, changeRequestId) {\r\n super($scope, $uibModalInstance, identityService)\r\n\r\n this.changeRequestService = changeRequestService;\r\n\r\n this.changeRequestId = changeRequestId;\r\n }\r\n\r\n submit() {\r\n this.scope.isSubmitted = true;\r\n\r\n if (this.scope.twoFactorAuthForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n\r\n this.changeRequestService.approveChangeRequest(this.changeRequestId, this.scope.verificationCode)\r\n .then((result) => {\r\n this.modalInstance.close(true);\r\n },\r\n (reason) => {\r\n this.handleErrorResponse(reason);\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class AnalysisBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.activateSection('analysis');\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface WatchlistScope extends ng.IScope {\r\n watchlists: Array;\r\n newWatchlist: Watchlist;\r\n watchlistForm: ng.IFormController;\r\n isEdit: boolean;\r\n events: WatchlistsCtrl;\r\n isLoading: boolean;\r\n secIds: string;\r\n isBusy: boolean;\r\n isError: boolean;\r\n hasData: boolean;\r\n }\r\n\r\n export class WatchlistsCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.WatchlistScope;\r\n analysisService: Patersons.AnalysisService;\r\n selectionService: Patersons.SelectionService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'analysisService', 'selectionService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, analysisService, selectionService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.analysisService = analysisService;\r\n this.selectionService = selectionService;\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n\r\n if (this.state.params['add']) {\r\n this.selectionService.selectedWatchlistSecIds = this.state.params['add'];\r\n $location.url($location.path());\r\n }else if (this.selectionService.selectedWatchlistSecIds) {\r\n this.scope.secIds = this.selectionService.selectedWatchlistSecIds;\r\n this.selectionService.selectedWatchlistSecIds = null;\r\n }\r\n\r\n this.scope.isBusy = false;\r\n\r\n this.scope.isEdit = false;\r\n\r\n this.scope.watchlists = new Array();\r\n this.getWatchlists();\r\n }\r\n\r\n onDeleteWatchlist = function(value) {\r\n if (confirm('Are you sure you want to delete watchlist?')) {\r\n this.scope.deleteWatchlist(value);\r\n }\r\n };\r\n\r\n listWatchlists(): string {\r\n return this.scope.watchlists.map(w => w.name.toLowerCase()).join(\"|\");\r\n }\r\n\r\n deleteWatchlist(watchlistId: number) {\r\n if(confirm(\"Are you sure you wish to delete this watchlist?\")){\r\n var promise: ng.IHttpPromise = this.analysisService.deleteWatchlist(watchlistId);\r\n promise.then((result) => {\r\n this.getWatchlists();\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n },\r\n (reason) => { // errro handling\r\n //this.analysisService.errorHandler = reason.data;\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n }\r\n );\r\n }\r\n }\r\n\r\n getWatchlists() {\r\n this.scope.isLoading = true;\r\n var promise = this.analysisService.getWatchlists();\r\n promise.then((result) => {\r\n this.scope.isLoading = false;\r\n this.scope.watchlists = result;\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n },\r\n (reason) => { // error handling\r\n //this.analysisService.errorHandler = reason.data;\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n }\r\n );\r\n }\r\n\r\n prepareNewWatchlist() {\r\n this.scope.isEdit = true;\r\n this.scope.newWatchlist = new Watchlist();\r\n }\r\n\r\n addWatchlist() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.watchlistForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n this.scope.isLoading = true;\r\n this.analysisService.postWatchlist(this.scope.newWatchlist).then((result) => {\r\n this.scope.isLoading = false;\r\n this.scope.isEdit = false\r\n this.getWatchlists();\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n },\r\n (reason) => { // error handling\r\n //this.analysisService.errorHandler = reason.data;\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n }\r\n ).finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n\r\n cancelAddWatchlist(): void {\r\n this.scope.isEdit = false;\r\n this.scope.watchlistForm.$setPristine();\r\n this.scope.watchlistForm.$setUntouched();\r\n }\r\n\r\n loadWatchlist(watchlistId: number) {\r\n var newSecIds = [];\r\n if (this.scope.secIds !== undefined || this.scope.secIds != null) {\r\n var newItems = this.scope.secIds.split(',');\r\n for (var i = 0; i < newItems.length; i++) {\r\n newSecIds.push(newItems[i]);\r\n }\r\n\r\n\r\n var promise = this.analysisService.getAWatchlist(watchlistId);\r\n promise.then((watchlist: Watchlist) => {\r\n\r\n for (var i = 0; i < newSecIds.length; i++) {\r\n watchlist.watchlistItems.push(newItems[i]);\r\n }\r\n\r\n var unique = watchlist.watchlistItems.filter(function(elem, index, self) {\r\n return index == self.indexOf(elem);\r\n })\r\n watchlist.watchlistItems = unique;\r\n this.analysisService.patchWatchlist(watchlist).then(() => {\r\n this.state.go(\"watchlistView\", {\r\n \"watchlistId\": watchlistId\r\n });\r\n });\r\n\r\n });\r\n }else{\r\n this.state.go(\"watchlistView\", {\r\n \"watchlistId\": watchlistId\r\n });\r\n }\r\n\r\n }\r\n }\r\n}\r\n","'use strict';\r\ndeclare var sharedWatchListConfig: any;\r\n\r\nmodule Patersons {\r\n\r\n export interface WatchlistSALScope extends ng.IScope {\r\n\r\n events: AbstractController;\r\n\r\n name: string;\r\n\r\n watchlistId: number;\r\n relatedWatchlist: Watchlist;\r\n }\r\n\r\n export class WatchlistItemCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.WatchlistSALScope;\r\n analysisService: Patersons.AnalysisService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'analysisService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, analysisService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.analysisService = analysisService;\r\n\r\n this.scope.watchlistId = $stateParams['watchlistId'];\r\n\r\n this.load();\r\n }\r\n showAllWatchlists(){\r\n this.state.go(\"watchlist\", {}, {reload: true});\r\n }\r\n load() {\r\n let tickers = [];\r\n if (this.state.params['watchlistId']) {\r\n this.analysisService.getAWatchlist(this.state.params['watchlistId'])\r\n .then((watchlist: Watchlist) => {\r\n this.scope.relatedWatchlist = watchlist;\r\n this.scope.name = watchlist.name;\r\n var unique = watchlist.watchlistItems.filter(function (elem, index, self) {\r\n return index == self.indexOf(elem);\r\n })\r\n watchlist.watchlistItems = unique;\r\n tickers = watchlist.watchlistItems;\r\n this.initializeMorningstar(tickers);\r\n }).catch(err => {\r\n this.state.go('watchlist')\r\n alert('Watchlist not found.')\r\n })\r\n } else if (this.state.params['secIds']) {\r\n tickers = this.state.params['secIds'].split(\"|\");\r\n this.initializeMorningstar(tickers);\r\n } else {\r\n this.state.go(\"watchlist\");\r\n }\r\n }\r\n updateWatchlistFromTickers(tickers: string[]) {\r\n this.scope.relatedWatchlist.watchlistItems = tickers.map(function (item) {\r\n return item;\r\n })\r\n var unique = this.scope.relatedWatchlist.watchlistItems.filter(function (elem, index, self) {\r\n return index == self.indexOf(elem);\r\n })\r\n this.scope.relatedWatchlist.watchlistItems = unique;\r\n return this.analysisService.patchWatchlist(this.scope.relatedWatchlist);\r\n }\r\n openAsHeatmap(){\r\n if (this.scope.watchlistId){\r\n window.open(this.state.href(\"heatmap\", { watchlistId: this.scope.watchlistId }), \"_parent\")\r\n // this.state.go(\"heatmap\", {watchlistId: this.scope.watchlistId}, {reload: true});\r\n }\r\n }\r\n initializeMorningstar(tickers) {\r\n let self = this;\r\n\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n\r\n initComponent('component-watchlist', 'ecWatchList-container', 'ec-watch-list', 'ecWatchList').then(function () {\r\n\r\n var watchlistInstance = morningstar.asterix.instanceRegistry.get('ecWatchList');\r\n //set default watchlist items\r\n watchlistInstance.setParameter('tickers', tickers);\r\n initComponent('component-autocomp-watchlist', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteWatchlist').then(function () {\r\n\r\n //connect watchlist to autocomplete search\r\n morningstar.asterix.instanceRegistry.find('ecAutocompleteWatchlist').on('parameterChanged:latestSelectedSecurity', function (newVal) {\r\n let tickersTemp = morningstar.asterix.instanceRegistry.get('ecWatchList').getParameter('tickers');\r\n\r\n //make sure there is no duplicate\r\n if (newVal.secId && !tickersTemp.includes(newVal.secId)) {\r\n tickersTemp.push(newVal.secId);\r\n morningstar.asterix.instanceRegistry.get('ecWatchList').setParameter('tickers', tickersTemp);\r\n self.updateWatchlistFromTickers(morningstar.asterix.instanceRegistry.get('ecWatchList').getParameter('tickers'));\r\n morningstar.asterix.instanceRegistry.get('ecAutocompleteWatchlist').setParameter('search', '');\r\n }\r\n });\r\n morningstar.asterix.instanceRegistry.get('ecWatchList.actionBar.actionRemove').on('click', function (event) {\r\n event.preventDefault();\r\n var watchlist = morningstar.asterix.instanceRegistry.find('ecWatchList');\r\n var toBeRemove = watchlist.getParameter('selectedItemKeys');\r\n var tempList = watchlist.getParameter('tickers').slice().filter(function (el) { return toBeRemove.indexOf(el) < 0; });\r\n watchlist.setParameter('tickers', tempList);\r\n self.updateWatchlistFromTickers(tempList).then(() => {\r\n if(tempList.length == 0){\r\n self.state.reload();\r\n }\r\n })\r\n });\r\n\r\n });\r\n });\r\n\r\n });\r\n\r\n }\r\n }\r\n\r\n\r\n}\r\n","'use strict';\r\nmodule Patersons {\r\n\r\n export interface MarketHeatmapScope extends ng.IScope {\r\n events: Patersons.MarketHeatmapCtrl;\r\n }\r\n\r\n export class MarketHeatmapCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.MarketHeatmapScope;\r\n analysisService: Patersons.AnalysisService;\r\n morningStarService: Patersons.MorningStarService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService', 'analysisService', 'morningStarService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService, analysisService, morningStarService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.rootScope = $rootScope;\r\n this.analysisService = analysisService;\r\n this.morningStarService = morningStarService;\r\n this.load();\r\n\r\n }\r\n transformWatchlistToMorningStarWatchlist(watchlists: Watchlist[]){\r\n // due to a request to only show stock tickers that are not of type Fund (holdingtypeId = 2),\r\n // we need to query the M* API to determine if a particular ticker is infact a fund or not\r\n // and use that information to show/hide the tickers from the heatmap component.\r\n return new Promise(resolveAll => {\r\n var mWatchlists = []\r\n Promise.all(watchlists.map((watchlist) => {\r\n return new Promise(resolveEach => {\r\n let mWatchlist = {\r\n name: watchlist.name,\r\n data: [],\r\n id: \"m\" + watchlist.id\r\n }\r\n Promise.all(watchlist.watchlistItems.map((ticker) => {\r\n return new Promise(resolveTicker => {\r\n this.morningStarService.getMorningStarDataForSecurityId(ticker).then((res) => {\r\n if(res){\r\n let holdingTypeId = res.holdingTypeId;\r\n if(holdingTypeId != 2){\r\n mWatchlist.data.push({ticker: ticker})\r\n }\r\n }\r\n resolveTicker()\r\n })\r\n })\r\n })).then(() => {\r\n mWatchlists.push(mWatchlist)\r\n resolveEach();\r\n })\r\n })\r\n })).then(() => {\r\n resolveAll(mWatchlists)\r\n })\r\n })\r\n\r\n // This is kept incase we dont need to check each ticker\r\n // return watchlists.map(function (watchlist) {\r\n // return {\r\n // name: watchlist.name,\r\n // data: watchlist.watchlistItems.map(function (isin) {\r\n // return {\r\n // ticker: isin\r\n // }\r\n // }),\r\n // id: \"m\" + watchlist.id\r\n // }\r\n // })\r\n }\r\n load(){\r\n let self = this;\r\n this.analysisService.getWatchlists().then(function (watchlists: Watchlist[]){\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n self.transformWatchlistToMorningStarWatchlist(watchlists).then((mWatchlists: any[]) => {\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.selectionlist.watchList = mWatchlists\r\n if (self.state.params['watchlistId']) {\r\n try {\r\n\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.selectionlist.active = \"m\"+self.state.params['watchlistId']\r\n //need to nullify the 'index' value as it takes precedent over the tickerList in the config\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.index = null;\r\n let tickers = [];\r\n mWatchlists.filter(item => {\r\n return item.id == \"m\" + self.state.params['watchlistId'];\r\n })[0].data.forEach(ticker => {\r\n tickers.push(ticker.ticker)\r\n })\r\n\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.tickerList = tickers\r\n } catch (error) {\r\n self.state.go('heatmap', {}, { inherit: false, reload: true})\r\n alert('Could not load heatmap from watchlist')\r\n return;\r\n }\r\n }else{\r\n // need to reset to default values due to manilupating the configuration at runtime above.\r\n // possibly look into a more elegant way to handle this\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.selectionlist.active = 4;\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.index = \"146.10.XJO\";\r\n loaderConfig.configuration.overrides.components.marketsHeatmap.settings.tickerList = null;\r\n }\r\n initComponent(\r\n \"component-heatmap\",\r\n \"heatmap-container\",\r\n \"markets-components-heatmap\",\r\n \"marketsHeatmap\"\r\n );\r\n })\r\n });\r\n })\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface MarketChartScope extends ng.IScope {\r\n events: Patersons.MarketChartCtrl;\r\n isLoading: boolean;\r\n isCompare: boolean;\r\n }\r\n\r\n\r\n export class MarketChartCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.MarketChartScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.log.info('market chartCtrl loading...')\r\n var tickers = [];\r\n var compareTickers = []\r\n var mainTicker = '';\r\n if (this.state.params['secIds'] != undefined && this.state.params['secIds'] != null) {\r\n tickers = this.state.params['secIds'].split('|');\r\n if (tickers.length > 1) {\r\n compareTickers = tickers.slice(1);\r\n }\r\n this.scope.isCompare = true;\r\n mainTicker = tickers[0];\r\n }\r\n\r\n rootMorningstarPromise().then(function (morningstarPromise) {\r\n console.log('initializing component');\r\n if(mainTicker){\r\n loaderConfig.configuration.overrides.components.advanceChart_compare.settings.mainTicker = mainTicker;\r\n loaderConfig.configuration.overrides.components.advanceChart_compare.settings.compareTickers = compareTickers;\r\n initComponent('component-container', 'chart-container', 'markets-components-svgchart', 'advanceChart_compare').then(function () {\r\n console.log(\"done loading advance chart\");\r\n });\r\n }else{\r\n initComponent('component-container', 'chart-container', 'markets-components-svgchart', 'advanceChart').then(function () {\r\n console.log(\"done loading advance chart\");\r\n });\r\n }\r\n\r\n });\r\n }\r\n }\r\n}\r\n","\r\n'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface StockCompareScope extends ng.IScope {\r\n events: Patersons.StockCompareCtrl;\r\n }\r\n\r\n export class StockCompareCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.StockCompareScope;\r\n rootScope: any;\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.state = $state;\r\n\r\n this.load();\r\n\r\n\r\n }\r\n load(){\r\n var isinData = this.state.params['secIds']\r\n ? this.state.params['secIds']\r\n : \"\";\r\n\r\n var self = this;\r\n\r\n rootMorningstarPromise().then(function (\r\n promiseChain\r\n ) {\r\n console.log(\"initializing component\");\r\n initComponent(\r\n \"component-investcomp\",\r\n \"ecinvestment-container\",\r\n \"ec-investment-compare\",\r\n \"ecStockCompare\"\r\n ).then(function () {\r\n morningstar.asterix.instanceRegistry\r\n .get(\"ecStockCompare\")\r\n .setParameter(\"securityIds\", isinData); // pipe separated list of IDs\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface FundCompareScope extends ng.IScope {\r\n events: Patersons.FundCompareCtrl;\r\n }\r\n\r\n export class FundCompareCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.FundCompareScope;\r\n rootScope: any;\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.state = $state;\r\n\r\n this.load();\r\n\r\n\r\n }\r\n load(){\r\n var isinData = this.state.params['secIds']\r\n ? this.state.params['secIds']\r\n : \"\";\r\n\r\n var self = this;\r\n\r\n rootMorningstarPromise().then(function (\r\n promiseChain\r\n ) {\r\n console.log(\"initializing component\");\r\n initComponent(\r\n \"component-investcomp\",\r\n \"ecinvestment-container\",\r\n \"ec-investment-compare\",\r\n \"ecFundCompare\"\r\n ).then(function () {\r\n morningstar.asterix.instanceRegistry\r\n .get(\"ecFundCompare\")\r\n .setParameter(\"securityIds\", isinData); // pipe separated list of IDs\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ETFCompareScope extends ng.IScope {\r\n events: Patersons.ETFCompareCtrl;\r\n }\r\n\r\n export class ETFCompareCtrl extends AnalysisBaseCtrl {\r\n scope: Patersons.ETFCompareScope;\r\n rootScope: any;\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.state = $state;\r\n\r\n this.load();\r\n\r\n\r\n }\r\n load(){\r\n var isinData = this.state.params['secIds']\r\n ? this.state.params['secIds']\r\n : \"\";\r\n\r\n var self = this;\r\n\r\n rootMorningstarPromise().then(function (\r\n promiseChain\r\n ) {\r\n console.log(\"initializing component\");\r\n initComponent(\r\n \"component-investcomp\",\r\n \"ecinvestment-container\",\r\n \"ec-investment-compare\",\r\n \"ecETFCompare\"\r\n ).then(function () {\r\n morningstar.asterix.instanceRegistry\r\n .get(\"ecETFCompare\")\r\n .setParameter(\"securityIds\", isinData); // pipe separated list of IDs\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nvar analysisModule = angular.module(\"app.analysisModule\", []);\r\n\r\nanalysisModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function (\r\n $stateProvider: ng.ui.IStateProvider,\r\n $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.analysisModule config...');\r\n\r\n var wholesaleClientChecker = ['sessionService', '$q', '$state', 'userCompanyService', function (sessionService, $q, $state,userCompanyService) {\r\n var deferred = $q.defer();\r\n userCompanyService.getUserCompany().then((company) => {\r\n if (sessionService.getCurrentUserProfile().wholesaleclient === 'True' && !company.enableWholesaleClientsResearch) {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n })\r\n return deferred.promise;\r\n }]\r\n\r\n $stateProvider\r\n .state(\"watchlist\",\r\n {\r\n url: \"/watchlists?add\",\r\n templateUrl: \"assets/templates/Analysis/watchlists.html\",\r\n controller: 'watchlistsCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Watchlists\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state(\"watchlistView\",\r\n {\r\n url: \"/watchlists/view?watchlistId?secIds\",\r\n templateUrl: \"assets/templates/Analysis/watchlistItem.html\",\r\n controller: 'watchlistItemCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Watchlists\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state(\"heatmap\",\r\n {\r\n url: \"/heatmap?watchlistId\",\r\n templateUrl: \"assets/templates/Analysis/marketHeatmap.html\",\r\n controller: 'marketHeatmapCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Market Heatmap\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state(\"charts\",\r\n {\r\n url: \"/charts?secIds\",\r\n templateUrl: \"assets/templates/Analysis/marketCharts.html\",\r\n controller: 'marketChartCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Charting Tools\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state(\"stockCompare\",\r\n {\r\n url: \"/stockCompare?secIds\",\r\n templateUrl: \"assets/templates/Analysis/stockCompare.html\",\r\n controller: 'stockCompareCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Equities Comparison\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n // .state(\"fundCompare\",\r\n // {\r\n // url: \"/fundCompare?secIds\",\r\n // templateUrl: \"assets/templates/Analysis/fundCompare.html\",\r\n // controller: 'fundCompareCtrl',\r\n // resolve: {\r\n // wholesaleClientCheck: wholesaleClientChecker,\r\n // impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n // var deferred = $q.defer();\r\n // if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n // $state.go('dashboard');\r\n // deferred.reject();\r\n // } else {\r\n // deferred.resolve();\r\n // }\r\n // return deferred.promise;\r\n // }]\r\n // }\r\n // })\r\n // .state(\"etfCompare\",\r\n // {\r\n // url: \"/etfCompare?secIds\",\r\n // templateUrl: \"assets/templates/Analysis/etfCompare.html\",\r\n // controller: 'etfCompareCtrl',\r\n // resolve: {\r\n // wholesaleClientCheck: wholesaleClientChecker,\r\n // impersonatorCheck: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n // var deferred = $q.defer();\r\n // if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n // $state.go('dashboard');\r\n // deferred.reject();\r\n // } else {\r\n // deferred.resolve();\r\n // }\r\n // return deferred.promise;\r\n // }]\r\n // }\r\n // })\r\n }]);\r\n\r\nanalysisModule.controller('analysisBaseCtrl', Patersons.AnalysisBaseCtrl);\r\nanalysisModule.controller('watchlistsCtrl', Patersons.WatchlistsCtrl);\r\nanalysisModule.controller('watchlistItemCtrl', Patersons.WatchlistItemCtrl);\r\nanalysisModule.controller('marketHeatmapCtrl', Patersons.MarketHeatmapCtrl);\r\nanalysisModule.controller('marketChartCtrl', Patersons.MarketChartCtrl);\r\nanalysisModule.controller('stockCompareCtrl', Patersons.StockCompareCtrl);\r\nanalysisModule.controller('fundCompareCtrl', Patersons.FundCompareCtrl);\r\nanalysisModule.controller('etfCompareCtrl', Patersons.ETFCompareCtrl);\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ClientAdviserScope extends ng.IScope {\r\n selectedAccountId: string;\r\n adviserList: Array;\r\n adviserLabel: string;\r\n selectedAdviser: Patersons.ClientAdviser;\r\n selectedAdviserId: string;\r\n events: Patersons.ClientAdviserViewCtrl;\r\n parentController: AbstractController;\r\n isLoading: boolean;\r\n isLoggedIn: boolean;\r\n ShowFullImage;\r\n }\r\n export class ClientAdviserViewCtrl extends AbstractController {\r\n scope: Patersons.ClientAdviserScope;\r\n clientConfigService: Patersons.ClientConfigService;\r\n tokenService: Patersons.TokenService;\r\n \r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'tokenService', 'clientConfigService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, tokenService, clientConfigService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.tokenService = tokenService;\r\n this.clientConfigService = clientConfigService;\r\n\r\n if (this.tokenService.tokenManager && !this.tokenService.tokenManager.expired) {\r\n this.getAdviserData();\r\n\r\n this.scope.ShowFullImage = function (url: string) {\r\n $('.imagepreview').attr('src', url);\r\n $('#imagemodal').modal('show');\r\n };\r\n }\r\n }\r\n getAdviserData() {\r\n this.scope.isLoading = true;\r\n var promise = this.clientConfigService.getAdviser();\r\n promise.then((result) => {\r\n this.scope.isLoading = false;\r\n this.scope.adviserList = result;\r\n if (this.scope.adviserList.length > 1) {\r\n this.scope.adviserLabel = \"Meet your Advisers\";\r\n } else if (this.scope.adviserList.length == 1) {\r\n this.scope.adviserLabel = \"Meet your Adviser\";\r\n } else if (this.scope.adviserLabel.length == 0) {\r\n this.scope.adviserLabel = \"\";\r\n }\r\n if (this.tokenService.tokenManager) {\r\n this.scope.isLoggedIn = !this.tokenService.tokenManager.expired;\r\n }\r\n },\r\n (reason) => {\r\n this.scope.isLoading = false;\r\n this.clientConfigService.errorHandler = reason.data;\r\n }\r\n );\r\n return null;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class FAQ {\r\n title: string;\r\n content: string;\r\n }\r\n\r\n export interface HelpScope {\r\n faqList: Array;\r\n hasData: boolean;\r\n userCompany: UserCompany;\r\n }\r\n\r\n export class HelpViewCtrl extends AbstractController {\r\n scope: Patersons.HelpScope;\r\n helpService: Patersons.HelpService\r\n navigationService: Patersons.NavigationService\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'helpService', 'navigationService', 'userCompanyService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, helpService, navigationService, userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.helpService = helpService;\r\n this.navigationService = navigationService;\r\n\r\n this.navigationService.deactivateAll();\r\n this.load();\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n\r\n load() {\r\n \r\n this.helpService.getFAQs()\r\n .then((result) => {\r\n if (result) {\r\n this.scope.faqList = result.faqs;\r\n }\r\n this.scope.hasData = this.scope.faqList != null && this.scope.faqList.length > 0;\r\n this.log.info(\"Loaded Help List\");\r\n }, (error) =>{ // error handling\r\n this.scope.hasData = false;\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class MyDetailsBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.deactivateAll();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface AccoladeOptionsScope extends ng.IScope {\r\n accoladeOptionsForm: ng.IFormController;\r\n parentController: AbstractController;\r\n events: Patersons.AccoladeOptionsViewCtrl;\r\n isError: boolean;\r\n hasData: boolean;\r\n accoladeOptions: AccoladeOptions;\r\n isSubmitted: boolean;\r\n isLoading: boolean;\r\n enableQuarterlyAccoladeReports: boolean;\r\n enableAnnualAccoladeReports: boolean;\r\n hasAccoladeAccounts: boolean;\r\n isBusy: boolean;\r\n userCompany: UserCompany;\r\n }\r\n\r\n export class AccoladeOptionsViewCtrl extends MyDetailsBaseCtrl {\r\n portfolioService: Patersons.PortfolioService;\r\n scope: Patersons.AccoladeOptionsScope;\r\n myDetailsService: Patersons.MyDetailsService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'myDetailsService', 'portfolioService', 'navigationService', 'userCompanyService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, myDetailsService, portfolioService, navigationService, userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.myDetailsService = myDetailsService;\r\n this.portfolioService = portfolioService;\r\n this.scope.parentController = this;\r\n this.scope.events = this;\r\n this.scope.isError = false;\r\n this.scope.isSubmitted = false;\r\n this.scope.isLoading = false;\r\n this.scope.isBusy = false;\r\n this.getAccoladeOptions();\r\n\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n\r\n onSave() {\r\n this.scope.isBusy = true;\r\n\r\n var promise = this.myDetailsService.updateAccoladeOptions(this.scope.accoladeOptions);\r\n promise.then(\r\n (result: AccoladeOptions) => {\r\n console.info('myDetailsService.updateAccoladeOptions');\r\n console.info(result);\r\n this.scope.isSubmitted = true;\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n this.updateAccoladeOptions(result);\r\n }, (reason) => {\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n this.scope.isSubmitted = false;\r\n }\r\n )\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n\r\n onCancel() {\r\n // reload ourselves if cancelled to get the original settings\r\n this.redirect(\"/accoladeOptions\");\r\n }\r\n\r\n getAccoladeOptions() {\r\n this.scope.isLoading = true;\r\n\r\n let accoladeCheckPromise: Promise = this.portfolioService.getCombinedPortfolioData();\r\n accoladeCheckPromise.then(\r\n (accounts: Account[]) => {\r\n if (accounts.every(account => account.accountType == \"Standard\")) {\r\n this.scope.hasAccoladeAccounts = false;\r\n this.scope.isLoading = false;\r\n } else {\r\n this.scope.hasAccoladeAccounts = true;\r\n var optionsPromise: ng.IHttpPromise = this.myDetailsService.getAccoladeOptions();\r\n optionsPromise.then(\r\n (result: AccoladeOptions) => {\r\n this.log.info(\"Accolade Opts: result = \" + JSON.stringify(result));\r\n this.updateAccoladeOptions(result);\r\n },\r\n (reason) => {\r\n this.scope.isError = true;\r\n this.scope.isSubmitted = false;\r\n this.myDetailsService.errorHandler = reason.data;\r\n })\r\n .finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n }, (reason) => {\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n });\r\n\r\n return null;\r\n }\r\n\r\n updateAccoladeOptions(options: AccoladeOptions): void {\r\n console.info('updateAccoladeOptions');\r\n console.info(options);\r\n this.scope.accoladeOptions = options;\r\n this.scope.enableAnnualAccoladeReports = !this.scope.accoladeOptions.hasElectronicTaxReports;\r\n this.scope.enableQuarterlyAccoladeReports = !this.scope.accoladeOptions.hasElectronicQuarterlyReports;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ResearchSubscriptionsScope extends ng.IScope {\r\n researchSubscriptionsForm: ng.IFormController;\r\n parentController: AbstractController;\r\n events: Patersons.ResearchSubscriptionsViewCtrl;\r\n hasChanged: boolean;\r\n isLoading: boolean;\r\n isSubmitted: boolean;\r\n isSaving: boolean;\r\n isError: boolean;\r\n subscribedPublications: SubscribedResearchPublication[]\r\n isAustralianInvestorSubscribed: boolean;\r\n isMorningMarketSubscribed: boolean;\r\n isWeeklyMarketWrapSubscribed: boolean;\r\n }\r\n\r\n export class ResearchSubscriptionsViewCtrl extends MyDetailsBaseCtrl {\r\n scope: Patersons.ResearchSubscriptionsScope;\r\n myDetailsService: Patersons.MyDetailsService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'myDetailsService','navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, myDetailsService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.myDetailsService = myDetailsService;\r\n this.scope.parentController = this;\r\n this.scope.events = this;\r\n this.scope.hasChanged = false;\r\n this.scope.isSubmitted = false;\r\n this.scope.isError = false;\r\n this.scope.isLoading = false;\r\n this.getResearchSubscriptions();\r\n }\r\n\r\n setChanged(){\r\n this.scope.hasChanged = true;\r\n }\r\n\r\n onSave() {\r\n this.scope.isError = false;\r\n this.scope.isSubmitted = false;\r\n this.scope.isSaving = true;\r\n this.myDetailsService.updateResearchSubscriptions(this.scope.subscribedPublications)\r\n .then((result) => {\r\n this.scope.isSubmitted = result.status == 200;\r\n },\r\n (reason) => { // error handling\r\n this.scope.isError = true;\r\n this.myDetailsService.errorHandler = reason.data;\r\n }).finally(() => {\r\n this.scope.isSaving = false;\r\n this.scope.hasChanged = false;\r\n });\r\n }\r\n\r\n getResearchSubscriptions() {\r\n this.scope.isLoading = true;\r\n\r\n\r\n this.myDetailsService.getResearchSubscriptions()\r\n .then((result) => {\r\n var data: any= result;\r\n this.scope.subscribedPublications = data\r\n \r\n this.scope.isLoading = false;\r\n },\r\n (reason) => { // error handling\r\n this.scope.isError = true;\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n \r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class AccountBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.deactivateAll();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface BankDetailsScope extends ng.IScope {\r\n directDebitForm: ng.IFormController;\r\n directCreditForm: ng.IFormController;\r\n parentController: AbstractController;\r\n accounts: Array;\r\n selectedAccount: Account;\r\n events: Patersons.BankDetailsViewCtrl;\r\n date: Date;\r\n isLoading: boolean;\r\n url: String;\r\n isSubmitted: boolean;\r\n submissionFailed: boolean;\r\n phoneNumberIsVerified: boolean;\r\n allApproversRegistered: boolean;\r\n submissionFailedVerifyPhoneNumber: boolean;\r\n submissionFailedNotAllApproversRegistered: boolean;\r\n hasApprovers: boolean;\r\n hasAcceptedTandCs: boolean;\r\n hasApplyAllChecked:boolean;\r\n disableCreditUpdate: boolean;\r\n isSensitive: boolean;\r\n scrollDuration: number;\r\n errorHandler: any;\r\n userCompany: UserCompany;\r\n }\r\n\r\n export class BankDetailsViewCtrl extends AccountBaseCtrl {\r\n scope: Patersons.BankDetailsScope;\r\n portfolioService: Patersons.PortfolioService;\r\n tokenService: Patersons.TokenService;\r\n identityService: Patersons.IdentityService;\r\n changeRequestService: Patersons.ChangeRequestService;\r\n modal: any;\r\n document: any;\r\n static $inject = ['$scope', '$uibModal', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$document', 'portfolioService', 'tokenService', 'changeRequestService', 'navigationService', 'identityService', 'userCompanyService'];\r\n\r\n constructor($scope, $uibModal, $log, $location, $window, $state, $stateParams, $http, $rootScope, $document, portfolioService, tokenService, changeRequestService, navigationService, identityService, userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.portfolioService = portfolioService;\r\n this.tokenService = tokenService;\r\n this.changeRequestService = changeRequestService;\r\n this.identityService = identityService;\r\n this.scope.parentController = this;\r\n this.scope.events = this;\r\n this.scope.isSubmitted = false;\r\n this.scope.submissionFailed = false;\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n this.scope.submissionFailedNotAllApproversRegistered = false;\r\n this.scope.phoneNumberIsVerified = false;\r\n this.scope.allApproversRegistered = false;\r\n this.scope.hasApprovers = false;\r\n\r\n this.scope.hasAcceptedTandCs = false;\r\n this.scope.hasApplyAllChecked = false;\r\n this.scope.disableCreditUpdate = false;\r\n\r\n var accountId = $stateParams.accountId;\r\n this.modal = $uibModal;\r\n this.document = $document;\r\n this.scope.scrollDuration = 700;\r\n this.scope.isSensitive = true;\r\n\r\n this.load()\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n\r\n setSelectedAccount(accountId: string) {\r\n this.scope.hasApplyAllChecked = false;\r\n this.scope.hasAcceptedTandCs = false;\r\n this.scope.disableCreditUpdate = false;\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n\r\n if (this.scope.selectedAccount) {\r\n this.scope.disableCreditUpdate = this.isCashManagementAccount(this.scope.selectedAccount.bankingDetails.creditBankAccount) &&\r\n (!this.scope.selectedAccount.isChessManaged || this.scope.selectedAccount.bankingDetails.creditBankAccount.depositDividends);\r\n }\r\n\r\n this.scope.isSubmitted = false;\r\n this.scope.submissionFailed = false;\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n this.scope.submissionFailedNotAllApproversRegistered = false;\r\n\r\n this.checkAllApproversRegistered();\r\n this.checkHasApprovers();\r\n };\r\n\r\n private isCashManagementAccount(bankAccountDetail: BankAccountDetail) {\r\n return bankAccountDetail.serviceType === 'MM';\r\n }\r\n\r\n deselectDepositDividends() {\r\n if (this.scope.selectedAccount.isChessManaged) {\r\n this.scope.selectedAccount.bankingDetails.creditBankAccount.depositDividends = false;\r\n }\r\n }\r\n\r\n checkAllApproversRegistered() {\r\n if (!this.scope.selectedAccount) {\r\n return;\r\n }\r\n\r\n this.changeRequestService.areAllAccountApproversRegistered(this.scope.selectedAccount.accountId)\r\n .then((result : boolean) => {\r\n this.scope.allApproversRegistered = result;\r\n },\r\n (reason) => { // error handling\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n checkHasApprovers() {\r\n if (!this.scope.selectedAccount) {\r\n return;\r\n }\r\n\r\n this.changeRequestService.getAccountApproversCount(this.scope.selectedAccount.accountId)\r\n .then((result: number) => {\r\n this.scope.hasApprovers = result > 0;\r\n },\r\n (reason) => { // error handling\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n load() {\r\n this.identityService.getIsPhoneNumberVerifyed().\r\n then((phone_number_verified: boolean) => {\r\n this.scope.phoneNumberIsVerified = phone_number_verified;\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.accounts = result;\r\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\r\n this.setSelectedAccount(this.scope.accounts[0].accountId);\r\n }\r\n });\r\n });\r\n\r\n /*if (this.tokenService.tokenManager.profile.phone_number_verified === 'true') {\r\n this.scope.phoneNumberIsVerified = true;\r\n }\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.accounts = result;\r\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\r\n this.setSelectedAccount(this.scope.accounts[0].accountId);\r\n }\r\n });*/\r\n }\r\n\r\n canSubmitChangeRequest() {\r\n if (!this.scope.phoneNumberIsVerified) {\r\n this.scope.submissionFailedVerifyPhoneNumber = true;\r\n }\r\n\r\n if (!this.scope.allApproversRegistered) {\r\n this.scope.submissionFailedNotAllApproversRegistered = true;\r\n }\r\n\r\n if (this.scope.submissionFailedVerifyPhoneNumber || this.scope.submissionFailedNotAllApproversRegistered) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n saveDirectDebitForm() {\r\n this.scope.selectedAccount.bankingDetails.debitBankAccount.cardType = \"Debit Card\";\r\n return this.saveForm(this.scope.directDebitForm, this.scope.selectedAccount, this.scope.selectedAccount.bankingDetails.debitBankAccount, false);\r\n }\r\n\r\n updatehasAcceptedTandCs(){\r\n if (!this.scope.hasApplyAllChecked) {\r\n this.scope.hasAcceptedTandCs = false;\r\n }\r\n };\r\n\r\n\r\n saveDirectCreditForm() {\r\n \r\n if(this.scope.hasApplyAllChecked && this.scope.hasAcceptedTandCs ){\r\n return this.saveForm(this.scope.directCreditForm, this.scope.selectedAccount, this.scope.selectedAccount.bankingDetails.creditBankAccount, true);\r\n\r\n }\r\n\r\n this.scope.selectedAccount.bankingDetails.creditBankAccount.cardType = \"Credit Card\";\r\n return this.saveForm(this.scope.directCreditForm, this.scope.selectedAccount, this.scope.selectedAccount.bankingDetails.creditBankAccount, false);\r\n }\r\n\r\n saveForm(form: ng.IFormController, account: Account, bankAccountDetail: BankAccountDetail, saveAll: boolean) {\r\n this.scope.submissionFailed = false;\r\n this.scope.isSensitive = true;\r\n\r\n if (form.$invalid || account == undefined) {\r\n return;\r\n }\r\n\r\n if (!this.canSubmitChangeRequest()) {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n return;\r\n }\r\n\r\n var modalPopup = this.modal.open({\r\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\r\n controller: BankDetailsChangeRequestCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n resolve: {\r\n account: account,\r\n bankAccountDetail: bankAccountDetail,\r\n saveAll: saveAll\r\n }\r\n });\r\n\r\n modalPopup.result\r\n .then((result) => {\r\n if (result === true) {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isSubmitted = true;\r\n }\r\n else {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.submissionFailed = true;\r\n }\r\n },\r\n (reason) => { // error handling\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ContactInfoScope extends ng.IScope {\r\n phoneNumberForm: ng.IFormController;\r\n accountEmailAddressForm: ng.IFormController;\r\n contractEmailAddressForm: ng.IFormController;\r\n postalAddressForm: ng.IFormController;\r\n registrationAddressForm: ng.IFormController;\r\n residentialAddressForm: ng.IFormController;\r\n parentController: AbstractController;\r\n accounts: Array;\r\n selectedAccount: Account;\r\n events: Patersons.ContactInfoViewCtrl;\r\n date: Date;\r\n isLoading: boolean;\r\n url: String;\r\n errorHandler: any;\r\n isSubmitted: boolean;\r\n phoneNumberIsVerified: boolean;\r\n allApproversRegistered: boolean;\r\n submissionFailedVerifyPhoneNumber: boolean;\r\n submissionFailedNotAllApproversRegistered: boolean;\r\n hasApprovers: boolean;\r\n isSensitive: boolean;\r\n scrollDuration: number;\r\n emailTags: Array;\r\n contractEmailTags: Array;\r\n sensitiveEmailAddressesDirty: boolean;\r\n userCompany: UserCompany;\r\n applyToAll: boolean;\r\n }\r\n\r\n const AccountEmail = \"AccountEmail\";\r\n const ContractNoteEmail = \"ContractNoteEmail\";\r\n\r\n export class ContactInfoViewCtrl extends AccountBaseCtrl {\r\n scope: Patersons.ContactInfoScope;\r\n myDetailsService: Patersons.MyDetailsService;\r\n portfolioService: Patersons.PortfolioService;\r\n tokenService: Patersons.TokenService;\r\n identityService: Patersons.IdentityService;\r\n changeRequestService: Patersons.ChangeRequestService;\r\n modal: any;\r\n document: any;\r\n nextEmailId: number;\r\n\r\n static $inject = ['$scope', '$uibModal', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$document', 'myDetailsService', 'portfolioService', 'tokenService', 'changeRequestService', 'navigationService','identityService', 'userCompanyService'];\r\n\r\n constructor($scope, $uibModal, $log, $location, $window, $state, $stateParams, $http, $rootScope, $document, myDetailsService, portfolioService, tokenService, changeRequestService, navigationService, identityService, userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.myDetailsService = myDetailsService;\r\n this.portfolioService = portfolioService;\r\n this.tokenService = tokenService;\r\n this.identityService = identityService;\r\n this.changeRequestService = changeRequestService;\r\n this.scope.parentController = this;\r\n this.scope.events = this;\r\n this.scope.isSubmitted = false;\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n this.scope.submissionFailedNotAllApproversRegistered = false;\r\n this.scope.phoneNumberIsVerified = false;\r\n this.scope.allApproversRegistered = false;\r\n this.scope.hasApprovers = false;\r\n var accountId = $stateParams.accountId;\r\n this.modal = $uibModal;\r\n\r\n this.scope.emailTags = [];\r\n this.scope.contractEmailTags = [];\r\n\r\n this.document = $document;\r\n this.scope.scrollDuration = 700;\r\n this.load();\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n\r\n setSelectedAccount(accountId: string) {\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n\r\n if (this.setSelectedAccount == null) {\r\n return;\r\n }\r\n\r\n if (this.scope.selectedAccount.email) {\r\n this.scope.emailTags = this.scope.selectedAccount.email.split(\";\").join(\",\").split(\",\").map((e) => { return { text: e.toLowerCase() }; });\r\n }\r\n else {\r\n this.scope.emailTags = [];\r\n }\r\n if (this.scope.selectedAccount.emailContractNotes) {\r\n this.scope.contractEmailTags = this.scope.selectedAccount.emailContractNotes.split(\";\").join(\",\").split(\",\").map((e) => { return { text: e.toLowerCase() }; });\r\n }\r\n else {\r\n this.scope.contractEmailTags = [];\r\n }\r\n this.scope.sensitiveEmailAddressesDirty = false;\r\n this.scope.isSubmitted = false;\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n this.scope.submissionFailedNotAllApproversRegistered = false;\r\n\r\n this.checkAllApproversRegistered();\r\n this.checkHasApprovers();\r\n };\r\n\r\n checkAllApproversRegistered() {\r\n if (!this.scope.selectedAccount) {\r\n return;\r\n }\r\n\r\n this.changeRequestService.areAllAccountApproversRegistered(this.scope.selectedAccount.accountId)\r\n .then((result: boolean) => {\r\n this.scope.allApproversRegistered = result;\r\n });\r\n }\r\n\r\n checkHasApprovers() {\r\n if (!this.scope.selectedAccount) {\r\n return;\r\n }\r\n\r\n this.changeRequestService.getAccountApproversCount(this.scope.selectedAccount.accountId)\r\n .then((result: number) => {\r\n this.scope.hasApprovers = result > 0;\r\n }, (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n load() {\r\n this.identityService.getIsPhoneNumberVerifyed().\r\n then((phone_number_verified: boolean) => {\r\n this.scope.phoneNumberIsVerified = phone_number_verified;\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.accounts = result;\r\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\r\n this.setSelectedAccount(this.scope.accounts[0].accountId);\r\n }\r\n }, (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n\r\n /*if (this.tokenService.tokenManager.profile.phone_number_verified === 'true') {\r\n this.scope.phoneNumberIsVerified = true;\r\n }\r\n\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.accounts = result;\r\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\r\n\r\n this.setSelectedAccount(this.scope.accounts[0].accountId);\r\n }\r\n }, (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isLoading = false;\r\n });*/\r\n }\r\n\r\n canSubmitChangeRequest() {\r\n this.hideAllNotifications();\r\n\r\n if (!this.scope.phoneNumberIsVerified) {\r\n this.scope.submissionFailedVerifyPhoneNumber = true;\r\n }\r\n\r\n if (!this.scope.allApproversRegistered) {\r\n this.scope.submissionFailedNotAllApproversRegistered = true;\r\n }\r\n\r\n if (this.scope.submissionFailedVerifyPhoneNumber || this.scope.submissionFailedNotAllApproversRegistered) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n setAllAddressFields(address: Address) {\r\n if(!this.scope.selectedAccount.isAuthorisedAgentAccount){\r\n this.scope.selectedAccount.accountAddresses.postalAddress = Object.assign({}, address, {type: \"Postal\"});\r\n this.scope.selectedAccount.accountAddresses.residentialOrBusinessAddress = Object.assign({}, address, {type: \"ResidentialOrBusiness\"});\r\n }\r\n if(!(this.scope.selectedAccount.isAuthorisedAgentAccount || this.scope.selectedAccount.accountType == 'Accolade')){\r\n this.scope.selectedAccount.accountAddresses.registrationAddress = Object.assign({}, address, {type: \"Registration\"});\r\n }\r\n\r\n }\r\n\r\n applyToAll(addressForm, invalid){\r\n if(!invalid){\r\n if(confirm(\"This will apply your residential address to all sections of this form and submit your changes to us for processing\")){\r\n this.setAllAddressFields(addressForm)\r\n return Promise.resolve()\r\n .then(() => {\r\n return this.saveRegistrationAddress();\r\n })\r\n .then(() => {\r\n return this.savePostalAddress();\r\n })\r\n .then(() => {\r\n return this.saveResidentialAddress();\r\n })\r\n }\r\n }\r\n }\r\n\r\n savePostalAddress() {\r\n return new Promise((resolve, reject) => {\r\n if(this.scope.selectedAccount.isAuthorisedAgentAccount){\r\n return resolve()\r\n }\r\n this.scope.$broadcast('show-errors-check-validity');\r\n this.scope.isSensitive = false;\r\n \r\n if (this.scope.postalAddressForm.$invalid) {\r\n return resolve()\r\n }\r\n \r\n var promises = [];\r\n promises.push(\r\n this.portfolioService.updatePostalAddressDetails(\r\n this.scope.selectedAccount.accountId,\r\n this.scope.selectedAccount.accountAddresses.postalAddress));\r\n \r\n this.executePromises(promises).then(() => {\r\n return resolve()\r\n }, (reason) => {\r\n return reject()\r\n });\r\n })\r\n }\r\n\r\n saveResidentialAddress() {\r\n return new Promise((resolve, reject) => {\r\n if(this.scope.selectedAccount.isAuthorisedAgentAccount){\r\n return resolve()\r\n }\r\n this.scope.$broadcast('show-errors-check-validity');\r\n this.scope.isSensitive = false;\r\n \r\n if (this.scope.residentialAddressForm.$invalid) {\r\n return resolve()\r\n }\r\n \r\n var promises = [];\r\n promises.push(\r\n this.portfolioService.updateResidentialAddressDetails(\r\n this.scope.selectedAccount.accountId,\r\n this.scope.selectedAccount.accountAddresses.residentialOrBusinessAddress));\r\n \r\n this.executePromises(promises).then(() => {\r\n return resolve()\r\n }, (reason) => {\r\n return reject()\r\n });\r\n });\r\n }\r\n\r\n saveRegistrationAddress() {\r\n return new Promise((resolve, reject) => {\r\n if(this.scope.selectedAccount.isAuthorisedAgentAccount || this.scope.selectedAccount.accountType == 'Accolade'){\r\n return resolve();\r\n }\r\n this.scope.$broadcast('show-errors-check-validity');\r\n this.scope.isSensitive = true;\r\n \r\n if (this.scope.registrationAddressForm.$invalid) {\r\n return resolve();\r\n }\r\n \r\n if (!this.canSubmitChangeRequest()) {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n return reject();\r\n }\r\n \r\n var modalPopup = this.modal.open({\r\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\r\n controller: SensitiveAddressChangeRequestCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n resolve: {\r\n account: this.scope.selectedAccount,\r\n address: this.scope.selectedAccount.accountAddresses.registrationAddress\r\n }\r\n });\r\n \r\n modalPopup.result\r\n .then((result) => {\r\n if (result === true) {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isSubmitted = true;\r\n return resolve();\r\n }\r\n else {\r\n this.scope.errorHandler.Message = 'Error saving registration address details';\r\n return reject()\r\n }\r\n }, (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isLoading = false;\r\n return reject()\r\n });\r\n });\r\n }\r\n\r\n // non sensitive\r\n saveAccountEmailAddressForm() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n this.scope.isSensitive = true;\r\n\r\n if (this.scope.accountEmailAddressForm.$invalid) {\r\n return;\r\n }\r\n\r\n /*if (!this.canSubmitChangeRequest()) {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n return;\r\n }*/\r\n\r\n /*var sensitiveEmailAddresses: Array = [\r\n new EmailAddress(0, ContractNoteEmail, this.scope.contractEmailTags.map((tag) => { return tag.text }).join(','))\r\n ];*/\r\n\r\n var nonSensitiveEmailAddresses: Array = [\r\n new EmailAddress(1, AccountEmail, this.scope.emailTags.map((tag) => { return tag.text }).join(','))\r\n ];\r\n\r\n // if the list of contract notes email addresses has changed or one of the email addresses has been deleted\r\n /*if (sensitiveEmailAddresses.length > 0 && this.scope.sensitiveEmailAddressesDirty) {\r\n var modalPopup = this.modal.open({\r\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\r\n controller: SensitiveEmailAddressChangeRequestCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n resolve: {\r\n account: this.scope.selectedAccount,\r\n emailAddresses: function() { return sensitiveEmailAddresses }\r\n }\r\n });\r\n\r\n modalPopup.result\r\n .then((result) => {\r\n if (result === true) {\r\n var promises = [];\r\n\r\n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\r\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\r\n }\r\n\r\n this.executePromises(promises);\r\n\r\n this.scope.isSubmitted = true;\r\n this.scope.sensitiveEmailAddressesDirty = false;\r\n }\r\n else {\r\n this.scope.errorHandler.Message = 'Error saving email address details';\r\n }\r\n });\r\n }\r\n else {*/\r\n var promises = [];\r\n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\r\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\r\n }\r\n this.executePromises(promises);\r\n this.scope.isSubmitted = true;\r\n //}\r\n }\r\n\r\n // sensitive\r\n saveContractEmailAddressForm() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n this.scope.isSensitive = true;\r\n\r\n if (this.scope.contractEmailAddressForm.$invalid) {\r\n return;\r\n }\r\n\r\n if (!this.canSubmitChangeRequest()) {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n return;\r\n }\r\n\r\n var sensitiveEmailAddresses: Array = [\r\n new EmailAddress(0, ContractNoteEmail, this.scope.contractEmailTags.map((tag) => { return tag.text }).join(','))\r\n ];\r\n\r\n /*var nonSensitiveEmailAddresses: Array = [\r\n new EmailAddress(1, AccountEmail, this.scope.emailTags.map((tag) => { return tag.text }).join(','))\r\n ];*/\r\n\r\n // if the list of contract notes email addresses has changed or one of the email addresses has been deleted\r\n if (sensitiveEmailAddresses.length > 0 && this.scope.sensitiveEmailAddressesDirty) {\r\n var modalPopup = this.modal.open({\r\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\r\n controller: SensitiveEmailAddressChangeRequestCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n resolve: {\r\n account: this.scope.selectedAccount,\r\n emailAddresses: function() { return sensitiveEmailAddresses }\r\n }\r\n });\r\n\r\n modalPopup.result\r\n .then((result) => {\r\n if (result === true) {\r\n /*var promises = [];\r\n\r\n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\r\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\r\n }\r\n\r\n this.executePromises(promises);\r\n */\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isSubmitted = true;\r\n this.scope.sensitiveEmailAddressesDirty = false;\r\n }\r\n else {\r\n this.scope.errorHandler.Message = 'Error saving email address details';\r\n }\r\n }, (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n /*else {\r\n var promises = [];\r\n for (var i = 0; i < nonSensitiveEmailAddresses.length; i++) {\r\n promises.push(this.portfolioService.updateEmailAddress(this.scope.selectedAccount.accountId, nonSensitiveEmailAddresses[i]));\r\n }\r\n this.executePromises(promises);\r\n this.scope.isSubmitted = true;\r\n }*/\r\n }\r\n\r\n savePhoneNumberForm() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n this.scope.isSensitive = false;\r\n\r\n if (this.scope.phoneNumberForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isLoading = true;\r\n var promises = [];\r\n\r\n promises.push(this.portfolioService.updatePhoneNumbers(this.scope.selectedAccount.accountId, this.scope.selectedAccount));\r\n\r\n return this.executePromises(promises);\r\n }\r\n\r\n hideAllNotifications(){\r\n this.scope.isSubmitted = false;\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n this.scope.submissionFailedNotAllApproversRegistered = false;\r\n }\r\n\r\n executePromises(promises) {\r\n let numDone = 0;\r\n const checkAllDone = () => {\r\n if (numDone === promises.length) {\r\n return true;\r\n }\r\n }\r\n return new Promise((resolve, reject) => {\r\n this.hideAllNotifications();\r\n for (var i = 0; i < promises.length; i++) {\r\n promises[i].then((result) => {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isSubmitted = true;\r\n this.scope.isLoading = false;\r\n numDone++;\r\n if(checkAllDone()){\r\n resolve()\r\n }\r\n return;\r\n },\r\n (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isLoading = false;\r\n numDone++;\r\n if(checkAllDone()){\r\n resolve()\r\n }\r\n });\r\n }\r\n })\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface TaxFileNumberScope extends ng.IScope {\r\n taxFileNumberForm: ng.IFormController;\r\n parentController: AbstractController;\r\n accounts: Array;\r\n selectedAccount: Account;\r\n taxFileNumber: string;\r\n taxFileNumberType: string;\r\n events: Patersons.TaxFileNumberViewCtrl;\r\n date: Date;\r\n isLoading: boolean;\r\n url: String;\r\n errorHandler: any;\r\n isSubmitted: boolean;\r\n isBusy: boolean;\r\n scrollDuration: number;\r\n }\r\n\r\n export class TaxFileNumberViewCtrl extends AccountBaseCtrl {\r\n scope: Patersons.TaxFileNumberScope;\r\n portfolioService: Patersons.PortfolioService;\r\n document: any;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$document', 'portfolioService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $document, portfolioService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.taxFileNumber = '';\r\n this.portfolioService = portfolioService;\r\n this.scope.parentController = this;\r\n this.scope.isSubmitted = false;\r\n this.scope.isBusy = false;\r\n this.scope.events = this;\r\n\r\n this.document = $document;\r\n this.scope.scrollDuration = 700;\r\n\r\n this.load();\r\n\r\n }\r\n\r\n setSelectedAccount(accountId: string) {\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n };\r\n\r\n load() {\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.accounts = result;\r\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\r\n this.scope.selectedAccount = this.scope.accounts[0];\r\n }\r\n },(reason) => {\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n saveTaxFileNumber() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.taxFileNumberForm.$invalid) {\r\n return;\r\n }\r\n\r\n if (this.scope.selectedAccount === undefined) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n\r\n var promise: ng.IHttpPromise = this.portfolioService.updateTaxFileNumber(this.scope.selectedAccount.accountId, this.scope.taxFileNumber, this.scope.taxFileNumberType);\r\n promise.then((result) => {\r\n var scrollPlaceholder = angular.element(document.getElementById('scrollPlaceholder'));\r\n this.document.scrollToElement(scrollPlaceholder, 0, this.scope.scrollDuration);\r\n this.scope.isSubmitted = true;\r\n return;\r\n },\r\n (reason) => { // error handling\r\n this.scope.errorHandler = reason.data;\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nvar accountDetailsModule = angular.module(\"app.accountDetailsModule\", []);\r\n\r\n\r\naccountDetailsModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function ($stateProvider: ng.ui.IStateProvider,\r\n $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.myDetailsModule config...');\r\n\r\n $stateProvider\r\n .state(\"contactInfo\",\r\n {\r\n url: \"/contactInfo\",\r\n templateUrl: \"assets/templates/accountDetails/contactInfo.html\",\r\n controller: 'contactInfoViewCtrl',\r\n resolve:{\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Account Contact Information\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"bankDetails\",\r\n {\r\n url: \"/bankDetails\",\r\n templateUrl: \"assets/templates/accountDetails/bankDetails.html\",\r\n controller: 'bankDetailsViewCtrl',\r\n resolve:{\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Account Banking Details\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"taxFileNumber\",\r\n {\r\n url: \"/taxFileNumber\",\r\n templateUrl: \"assets/templates/accountDetails/taxFileNumber.html\",\r\n controller: 'taxFileNumberViewCtrl',\r\n resolve:{\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Account Tax File Number\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n }]);\r\n\r\n\r\naccountDetailsModule.controller('accountBaseCtrl', Patersons.AccountBaseCtrl);\r\naccountDetailsModule.controller('contactInfoViewCtrl', Patersons.ContactInfoViewCtrl);\r\naccountDetailsModule.controller('bankDetailsViewCtrl', Patersons.BankDetailsViewCtrl);\r\naccountDetailsModule.controller('taxFileNumberViewCtrl', Patersons.TaxFileNumberViewCtrl);\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class ResearchBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.activateSection('research');\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface StrategyScope extends ng.IScope {\r\n morningMarket: Feed;\r\n //weeklyMarketWrap: Feed;\r\n modelPortfolioUpdate: Feed;\r\n australianInvestor: Feed;\r\n otherFeatured1: Feed;\r\n otherFeatured2: Feed;\r\n otherFeatured3: Feed;\r\n\r\n feedList: Feed[];\r\n\r\n events: Patersons.StrategyCtrl;\r\n }\r\n\r\n export class StrategyCtrl extends ResearchBaseCtrl {\r\n\r\n scope: Patersons.StrategyScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n stateParams: angular.ui.IStateProvider;\r\n state: angular.ui.IStateService;\r\n http: ng.IHttpService;\r\n researchFeedService: ResearchFeedService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.researchFeedService = researchFeedService;\r\n\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.researchFeedService.getFeaturedStrategyAndEconomics()\r\n .then(result => {\r\n let feedItems: Feed[] = result;\r\n this.scope.morningMarket = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Morning Market');\r\n //this.scope.weeklyMarketWrap = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Weekly Market Wrap');\r\n this.scope.modelPortfolioUpdate = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Model Portfolio Update');\r\n this.scope.australianInvestor = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Australian Investor');\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n\r\n this.researchFeedService.getTop3StrategyAndEconomics()\r\n .then(result => {\r\n let feedItems: Feed[] = result;\r\n\r\n if (feedItems === null || feedItems === undefined) {\r\n return;\r\n }\r\n\r\n this.scope.otherFeatured1 = feedItems.length >= 1 ? feedItems[0] : null;\r\n this.scope.otherFeatured2 = feedItems.length >= 2 ? feedItems[1] : null;\r\n this.scope.otherFeatured3 = feedItems.length >= 3 ? feedItems[2] : null;\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n\r\n this.researchFeedService.getAllStrategyAndEconomics()\r\n .then(result => {\r\n this.scope.feedList = result;\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface PrivateWealthScope extends ng.IScope {\r\n morningMarket: Feed;\r\n //weeklyMarketWrap: Feed;\r\n modelPortfolioUpdate: Feed;\r\n modelPortfolio: Feed;\r\n sectorStrategy: Feed;\r\n australianInvestor: Feed;\r\n fixedInterestSecurities: Feed;\r\n momentumMonitor: Feed;\r\n qualityInvesting: Feed;\r\n marketStrategy: Feed;\r\n highYieldStocks: Feed;\r\n \r\n otherFeatured1: Feed;\r\n otherFeatured2: Feed;\r\n otherFeatured3: Feed;\r\n feedList: Feed[];\r\n\r\n events: Patersons.PrivateWealthCtrl;\r\n }\r\n\r\n export class PrivateWealthCtrl extends ResearchBaseCtrl {\r\n\r\n scope: Patersons.PrivateWealthScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n stateParams: angular.ui.IStateProvider;\r\n state: angular.ui.IStateService;\r\n http: ng.IHttpService;\r\n researchFeedService: ResearchFeedService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.researchFeedService = researchFeedService;\r\n\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.researchFeedService.getFeaturedPrivateWealthResearch()\r\n .then(result => {\r\n let feedItems: Feed[] = result;\r\n this.scope.modelPortfolioUpdate = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Model Portfolio Update');\r\n this.scope.modelPortfolio = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Model Portfolio');\r\n this.scope.sectorStrategy = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Sector Strategy');\r\n this.scope.australianInvestor = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Australian Investor');\r\n \r\n this.scope.momentumMonitor = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Momentum Monitor');\r\n this.scope.qualityInvesting = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Investment Strategy');\r\n this.scope.highYieldStocks = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'High Yield Stocks');\r\n this.scope.fixedInterestSecurities = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Fixed Interest Securities');\r\n this.scope.marketStrategy = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Market Strategy');\r\n \r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n\r\n\r\n this.researchFeedService.getTop3PrivateWealthResearch()\r\n .then(result => {\r\n let feedItems: Feed[] = result;\r\n\r\n if (feedItems === null || feedItems === undefined) {\r\n return;\r\n }\r\n\r\n this.scope.otherFeatured1 = feedItems.length >= 1 ? feedItems[0] : null;\r\n this.scope.otherFeatured2 = feedItems.length >= 2 ? feedItems[1] : null;\r\n this.scope.otherFeatured3 = feedItems.length >= 3 ? feedItems[2] : null;\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n\r\n this.researchFeedService.getAllPrivateWealthResearch()\r\n .then(result => {\r\n this.scope.feedList = result;\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n }\r\n }\r\n}\r\n","declare var DOMPurify: any;\r\n'use strict';\r\nmodule Patersons {\r\n\r\n export interface ArticleScope extends ng.IScope {\r\n events: Patersons.ArticleCtrl;\r\n article: Feed;\r\n section: string;\r\n isError: boolean;\r\n }\r\n\r\n export class ArticleCtrl extends ResearchBaseCtrl {\r\n\r\n scope: Patersons.ArticleScope;\r\n $analytics: any;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n stateParams: angular.ui.IStateProvider;\r\n state: angular.ui.IStateService;\r\n http: ng.IHttpService;\r\n sce: ng.ISCEService;\r\n researchFeedService: ResearchFeedService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$sce', 'researchFeedService', 'navigationService', '$analytics','article'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $sce, researchFeedService, navigationService, $analytics, article) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.researchFeedService = researchFeedService;\r\n this.sce = $sce;\r\n this.$analytics = $analytics;\r\n this.scope.events = this;\r\n this.scope.isError = false;\r\n\r\n\r\n this.load(article);\r\n }\r\n\r\n load(article) {\r\n this.scope.section = this.stateParams['section'];\r\n console.log(this.scope.section);\r\n if(article){\r\n console.log(article);\r\n this.scope.article = article;\r\n\r\n this.$analytics.eventTrack('article view', { \r\n category: 'Research Article', \r\n label: article.title + \" - \" + window.location.href\r\n });\r\n\r\n this.scope.isError = false;\r\n }else{\r\n this.scope.isError = true;\r\n }\r\n }\r\n\r\n toTrustedHTML(html){\r\n return this.sce.trustAsHtml(html);\r\n }\r\n\r\n sanitizeHTMLforView(html){\r\n var clean = DOMPurify.sanitize(html, {FORBID_TAGS: ['style', 'class'], ADD_ATTR: ['allow', 'allowfullscreen', 'frameborder', 'scrolling'], ADD_TAGS: ['iframe']});\r\n return clean;\r\n\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface QuantitativeAnalysisScope extends ng.IScope {\r\n momentumMonitor: Feed;\r\n qualityInvesting: Feed;\r\n highYieldStocks: Feed;\r\n otherFeatured1: Feed;\r\n otherFeatured2: Feed;\r\n otherFeatured3: Feed;\r\n feedList: Feed[];\r\n\r\n events: Patersons.QuantitativeAnalysisCtrl;\r\n }\r\n\r\n export class QuantitativeAnalysisCtrl extends ResearchBaseCtrl {\r\n\r\n scope: Patersons.QuantitativeAnalysisScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n stateParams: angular.ui.IStateProvider;\r\n state: angular.ui.IStateService;\r\n http: ng.IHttpService;\r\n researchFeedService: ResearchFeedService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.researchFeedService = researchFeedService;\r\n\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n\r\n getArticleUrl(feedItem: Feed) {\r\n return this.location.absUrl()+'&articleId='+feedItem.id;\r\n }\r\n\r\n load() {\r\n this.researchFeedService.getFeaturedQuantitativeAnalysis()\r\n .then(result => {\r\n console.log(result);\r\n let feedItems: Feed[] = result;\r\n\r\n this.scope.momentumMonitor = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Momentum Monitor');\r\n this.scope.qualityInvesting = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'Quality Investing');\r\n this.scope.highYieldStocks = this.researchFeedService.getLatestFeedItemForCategory(feedItems, 'High Yield Stocks');\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n\r\n this.researchFeedService.getTop3QuantitativeAnalysis()\r\n .then(result => {\r\n console.log(result);\r\n let feedItems: Feed[] = result;\r\n\r\n if (feedItems === null || feedItems === undefined) {\r\n return;\r\n }\r\n\r\n this.scope.otherFeatured1 = feedItems.length >= 1 ? feedItems[0] : null;\r\n this.scope.otherFeatured2 = feedItems.length >= 2 ? feedItems[1] : null;\r\n this.scope.otherFeatured3 = feedItems.length >= 3 ? feedItems[2] : null;\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n\r\n this.researchFeedService.getAllQuantitativeAnalysis()\r\n .then(result => {\r\n this.scope.feedList = result;\r\n }, (error) => { // error handling\r\n console.log('Data is not availabe');\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\ndeclare var loadMarketComponent: any;\r\n\r\nmodule Patersons {\r\n\r\n\r\n export interface CompanyResearchScope extends ng.IScope {\r\n events: Patersons.CompanyResearchCtrl;\r\n isLoading: boolean;\r\n }\r\n\r\n export class CompanyResearchCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.CompanyResearchScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n }\r\n }\r\n}\r\n","'use strict';\r\nmodule Patersons {\r\n\r\n export interface EquitiesResearchScope extends ng.IScope {\r\n events: EquitiesResearchCtrl;\r\n\r\n }\r\n\r\n export class EquitiesResearchCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.EquitiesResearchScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n load(){\r\n let self = this;\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n initComponent('component-stockScreener', 'ecScreener-container', 'ec-screener', 'ecScreener_stock').then(function () {\r\n console.log(\"Loaded screener\");\r\n });\r\n });\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface RecentResearchScope extends ng.IScope {\r\n events: RecentResearchCtrl;\r\n reverse: boolean;\r\n predicate: string;\r\n\r\n hasData: boolean;\r\n isLoading: boolean;\r\n\r\n items: any[];\r\n filteredItems: any[];\r\n\r\n itemsPerPage: number;\r\n currentPage: number;\r\n\r\n selectedCode: string;\r\n selectedDate: Date;\r\n selectedAnalysts: string;\r\n selectedRecommendation: string;\r\n }\r\n export abstract class RecentResearchCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.RecentResearchScope;\r\n morningStarService: Patersons.MorningStarService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService', 'morningStarService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService, morningStarService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope; \r\n this.scope.events = this;\r\n this.scope.reverse = true;\r\n this.morningStarService = morningStarService;\r\n this.scope.hasData = false;\r\n \r\n this.scope.predicate = \"dateWritten\";\r\n this.scope.selectedCode = \"\";\r\n this.scope.selectedDate = new Date();\r\n this.scope.selectedAnalysts = \"\";\r\n this.scope.selectedRecommendation = \"\";\r\n this.scope.currentPage = 1;\r\n this.scope.itemsPerPage = 15;\r\n this.load();\r\n }\r\n load() {\r\n this.scope.isLoading = true;\r\n this.morningStarService.getRecentResearch(true).then((data) => {\r\n this.scope.$apply(() => {\r\n this.scope.hasData = true;\r\n this.scope.isLoading = false;\r\n this.scope.items = data;\r\n this.scope.filteredItems = data;\r\n\r\n });\r\n })\r\n }\r\n \r\n filterArray(array, filters) {\r\n const filterKeys = Object.keys(filters);\r\n return array.filter(item => {\r\n // validates all filter criteria\r\n return filterKeys.every(key => {\r\n // ignores non-function predicates\r\n if (typeof filters[key] !== 'function') return true;\r\n return filters[key](item[key]);\r\n });\r\n });\r\n }\r\n filterItems(){\r\n const filters = {} as any;\r\n if(this.scope.selectedCode){\r\n filters.asxcode = (selectedCode) => selectedCode === this.scope.selectedCode\r\n }\r\n if(this.scope.selectedAnalysts){\r\n filters.author = (author) => author === this.scope.selectedAnalysts\r\n }\r\n if(this.scope.selectedRecommendation){\r\n filters.licenseeRecommendation = (licenseeRecommendation) => licenseeRecommendation === this.scope.selectedRecommendation\r\n }\r\n if(this.scope.selectedDate){\r\n filters.dateWritten = (dateWritten) => new Date(dateWritten) <= this.scope.selectedDate\r\n }\r\n this.scope.filteredItems = this.filterArray(this.scope.items, filters)\r\n\r\n }\r\n onFilterChange(property, value){\r\n this.scope[property] = value;\r\n this.filterItems()\r\n }\r\n order(predicate) {\r\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\r\n this.scope.predicate = predicate;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ASXAnnouncementsScope extends ng.IScope {\r\n events: ASXAnnouncementsCtrl;\r\n hasData: boolean;\r\n isLoading: boolean;\r\n\r\n items: any[];\r\n filteredItems: any[];\r\n\r\n itemsPerPage: number;\r\n currentPage: number;\r\n totalItems: number;\r\n\r\n selectedCode: string;\r\n dateOptions: any;\r\n selectedDate: string;\r\n }\r\n export abstract class ASXAnnouncementsCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.ASXAnnouncementsScope;\r\n morningStarService: Patersons.MorningStarService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService', 'morningStarService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService, morningStarService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.morningStarService = morningStarService;\r\n this.scope.hasData = false;\r\n this.scope.totalItems = 0;\r\n\r\n this.scope.selectedCode = \"\";\r\n this.scope.dateOptions = [\r\n {\r\n key: \"day1\",\r\n value: \"Today\"\r\n },{\r\n key: \"day2\",\r\n value: \"Previous Day\"\r\n },{\r\n key: \"week1\",\r\n value: \"Past week\"\r\n },{\r\n key: \"month1\",\r\n value: \"Past Month\"\r\n },{\r\n key: \"month3\",\r\n value: \"Past 3 Months\"\r\n },{\r\n key: \"month6\",\r\n value: \"Past 6 Months\"\r\n },{\r\n key: \"year1\",\r\n value: \"Past Year\"\r\n }\r\n ]\r\n this.scope.selectedDate = \"day1\";\r\n\r\n this.scope.itemsPerPage = 15;\r\n\r\n this.load(this.scope.selectedCode, this.scope.selectedDate, this.scope.currentPage);\r\n }\r\n onFilterChange = (key, value) => {\r\n this.scope[key] = value;\r\n let selectedCode = this.scope.selectedCode\r\n if(!selectedCode || selectedCode.length <= 5){\r\n this.load(selectedCode, this.scope.selectedDate, this.scope.currentPage);\r\n }\r\n }\r\n load(selectedCode, selectedDate, page) {\r\n this.scope.isLoading = true;\r\n this.morningStarService.getASXAnnouncements(selectedCode, selectedDate, page).then((data) => {\r\n this.scope.$apply(() => {\r\n this.scope.hasData = true;\r\n this.scope.isLoading = false;\r\n if(data.document){\r\n this.scope.items = [].concat(data.document);\r\n if(this.scope.selectedDate === 'day2'){\r\n //show only previous day items\r\n \r\n }\r\n }else{\r\n this.scope.items = [];\r\n }\r\n this.scope.totalItems = +data.resultstotal;\r\n\r\n });\r\n }) \r\n }\r\n }\r\n}\r\n","'use strict';\r\nmodule Patersons {\r\n\r\n export interface ETFResearchScope extends ng.IScope {\r\n events: ETFResearchCtrl;\r\n\r\n }\r\n\r\n export class ETFResearchCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.ETFResearchScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n load() {\r\n let self = this;\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n initComponent('component-etfScreener', 'ecScreener-container', 'ec-screener', 'ecScreener_etf').then(function () {\r\n console.log(\"Loaded screener\");\r\n });\r\n });\r\n }\r\n }\r\n}","'use strict';\r\nmodule Patersons {\r\n\r\n export interface FundResearchScope extends ng.IScope {\r\n events: FundResearchCtrl;\r\n\r\n }\r\n\r\n export class FundResearchCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.FundResearchScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n load() {\r\n let self = this;\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n initComponent('component-fundScreener', 'ecScreener-container', 'ec-screener', 'ecScreener_fund').then(function () {\r\n console.log(\"Loaded screener\");\r\n });\r\n });\r\n }\r\n }\r\n}","'use strict';\r\nmodule Patersons {\r\n\r\n export interface QuickSearchScope extends ng.IScope {\r\n events: QuickSearchCtrl;\r\n\r\n }\r\n\r\n export class QuickSearchCtrl extends ResearchBaseCtrl {\r\n scope: Patersons.QuickSearchScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'researchFeedService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, researchFeedService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n\r\n this.load();\r\n }\r\n load() {\r\n rootMorningstarPromise().then(function (promiseChain) {\r\n console.log('initializing component');\r\n initComponent('component-autocomplete-search', 'ecAutocomplete-container', 'ec-autocomplete', 'ecAutocompleteSearch').then(function () {\r\n console.log('Done loading autocomplete search.');\r\n morningstar.asterix.instanceRegistry.find('ecAutocompleteSearch').on('parameterChanged:latestSelectedSecurity', function (newVal) {\r\n window['openAutocompleteResult'](newVal) //declared in autocomplete config\r\n morningstar.asterix.instanceRegistry.get('ecAutocompleteSearch').setParameter('search', '');\r\n });\r\n });\r\n });\r\n }\r\n }\r\n}","'use strict';\r\n\r\nvar researchModule = angular.module(\"app.researchModule\", []);\r\n\r\n\r\nresearchModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function ($stateProvider: ng.ui.IStateProvider, $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.researchModule config...');\r\n var wholesaleClientChecker = ['sessionService', '$q', '$state', 'userCompanyService', function (sessionService, $q, $state,userCompanyService) {\r\n var deferred = $q.defer();\r\n userCompanyService.getUserCompany().then((company) => {\r\n if (sessionService.getCurrentUserProfile().wholesaleclient === 'True' && !company.enableWholesaleClientsResearch) {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n })\r\n return deferred.promise;\r\n }]\r\n $stateProvider\r\n .state(\"privateWealth\",\r\n {\r\n url: \"/privateWealthResearch?articleId\",\r\n templateUrl: \"assets/templates/Research/privateWealth.html\",\r\n controller: \"privateWealthCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Private Wealth Research\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n // .state(\"strategy\",\r\n // {\r\n // url: \"/strategy?articleId\",\r\n // templateUrl: \"assets/templates/Research/Strategy.html\",\r\n // controller: \"strategyCtrl\",\r\n // resolve: {\r\n // wholesaleClientCheck: wholesaleClientChecker,\r\n // impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n // var deferred = $q.defer();\r\n // if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n // $state.go('dashboard');\r\n // deferred.reject();\r\n // } else {\r\n // deferred.resolve();\r\n // }\r\n // return deferred.promise;\r\n // }]\r\n // }\r\n // })\r\n // .state('quantitativeAnalysis', {\r\n // url: '/quantitativeAnalysis',\r\n // templateUrl: 'assets/templates/research/quantitativeAnalysis.html',\r\n // controller: \"quantitativeAnalysisCtrl\",\r\n // resolve: {\r\n // wholesaleClientCheck: wholesaleClientChecker,\r\n // impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n // var deferred = $q.defer();\r\n // if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n // $state.go('dashboard');\r\n // deferred.reject();\r\n // } else {\r\n // deferred.resolve();\r\n // }\r\n // return deferred.promise;\r\n // }]\r\n // }\r\n // })\r\n .state('article', {\r\n url: '/article/:section/:articleId',\r\n templateUrl: 'assets/templates/research/article.html',\r\n controller: \"articleCtrl\",\r\n resolve: {\r\n //resolve the title a bit differently - get the article first \r\n article: ['$rootScope', '$stateParams','$q','researchFeedService', function ($rootScope, $stateParams, $q, researchFeedService) {\r\n var deferred = $q.defer();\r\n researchFeedService.getArticle($stateParams['articleId'])\r\n .then(article => {\r\n if(article.id){\r\n $rootScope.meta = {title: article.title};\r\n deferred.resolve(article);\r\n }else{\r\n $rootScope.meta = {title: \"Article Not Available\"};\r\n deferred.resolve();\r\n }\r\n\r\n },\r\n (reason) => {\r\n $rootScope.meta = {title: \"Article Not Available\"};\r\n deferred.resolve();\r\n });\r\n return deferred.promise;\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('companyResearch', {\r\n url: '/companyResearch',\r\n templateUrl: 'assets/templates/research/companyResearch.html',\r\n controller: 'companyResearchCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Company Research\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('equitiesResearch', {\r\n url: '/equitiesResearch',\r\n templateUrl: 'assets/templates/research/equitiesResearch.html',\r\n controller: 'equitiesResearchCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Equities Research\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('fundResearch', {\r\n url: '/fundResearch',\r\n templateUrl: 'assets/templates/research/fundResearch.html',\r\n controller: 'fundResearchCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Fund Research\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('etfResearch', {\r\n url: '/etfResearch',\r\n templateUrl: 'assets/templates/research/etfResearch.html',\r\n controller: 'etfResearchCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"ETF Research\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('recentResearch', {\r\n url: '/recentResearch',\r\n templateUrl: 'assets/templates/research/recentResearch.html',\r\n controller: 'recentResearchCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Recent Equities Research\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('asxAnnouncements', {\r\n url: '/asxAnnouncements',\r\n templateUrl: 'assets/templates/research/asxAnnouncements.html',\r\n controller: 'asxAnnouncementsCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"ASX Announcements\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n .state('search', {\r\n url: '/search',\r\n templateUrl: 'assets/templates/research/quickSearch.html',\r\n controller: 'quickSearchCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Quick Search\"};\r\n }],\r\n wholesaleClientCheck: wholesaleClientChecker\r\n }\r\n })\r\n }]);\r\n\r\nresearchModule.controller('researchBaseCtrl', Patersons.ResearchBaseCtrl);\r\nresearchModule.controller('strategyCtrl', Patersons.StrategyCtrl);\r\nresearchModule.controller('privateWealthCtrl', Patersons.PrivateWealthCtrl);\r\nresearchModule.controller('quantitativeAnalysisCtrl', Patersons.QuantitativeAnalysisCtrl);\r\nresearchModule.controller('companyResearchCtrl', Patersons.CompanyResearchCtrl);\r\nresearchModule.controller('equitiesResearchCtrl', Patersons.EquitiesResearchCtrl);\r\nresearchModule.controller('fundResearchCtrl', Patersons.FundResearchCtrl);\r\nresearchModule.controller('etfResearchCtrl', Patersons.ETFResearchCtrl);\r\nresearchModule.controller('quickSearchCtrl', Patersons.QuickSearchCtrl);\r\nresearchModule.controller('recentResearchCtrl', Patersons.RecentResearchCtrl);\r\nresearchModule.controller('asxAnnouncementsCtrl', Patersons.ASXAnnouncementsCtrl);\r\n\r\nresearchModule.controller('articleCtrl', Patersons.ArticleCtrl);\r\n","'use strict';\r\n\r\nvar myDetailsModule = angular.module(\"app.myDetailsModule\", []);\r\n\r\n\r\nmyDetailsModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function ($stateProvider: ng.ui.IStateProvider, $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.myDetailsModule config...');\r\n\r\n $stateProvider\r\n .state(\"accoladeOptions\",\r\n {\r\n url: \"/accoladeOptions\",\r\n templateUrl: \"assets/templates/myProfile/accoladeOptions.html\",\r\n controller: 'accoladeOptionsViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Accolade Mailing Options\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"researchSubscriptions\",\r\n {\r\n url: \"/researchSubscriptions\",\r\n templateUrl: \"assets/templates/myProfile/researchSubscriptions.html\",\r\n controller: 'researchSubscriptionsViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Manage Research Subscriptions\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state('profile', {\r\n url: '/profile',\r\n templateUrl: 'assets/templates/myProfile/profile.html',\r\n controller: \"profileCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Profile\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n }]);\r\n\r\nmyDetailsModule.controller('myDetailsBaseCtrl', Patersons.MyDetailsBaseCtrl);\r\nmyDetailsModule.controller('accoladeOptionsViewCtrl', Patersons.AccoladeOptionsViewCtrl);\r\nmyDetailsModule.controller('researchSubscriptionsViewCtrl', Patersons.ResearchSubscriptionsViewCtrl);\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ChangeRequestSubmittedComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/changeRequestSubmitted.component.html';\r\n bindings: any = {\r\n hasApprovers: '<',\r\n isSensitive: '<'\r\n };\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PhoneNotRegisteredComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/phoneNotRegistered.component.html';\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ApproversNotRegisteredComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/approversNotRegistered.component.html';\r\n controller: any = ApproversNotRegisteredController;\r\n }\r\n\r\n export class ApproversNotRegisteredController {\r\n\r\n location:any\r\n userCompany: UserCompany;\r\n\r\n static $inject = ['$location', 'userCompanyService'];\r\n\r\n constructor($location, userCompanyService) {\r\n this.location = $location;\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.userCompany = company;\r\n })\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class SectionHeaderComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/sectionHeader.component.html';\r\n bindings: any = {\r\n title: '@'\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class SpinnerComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/spinner.component.html';\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class AccountSelectComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/accountSelect.component.html';\r\n controller: any = AccountSelectController;\r\n bindings: any = {\r\n accounts: '=',\r\n selectedAccount: '<',\r\n isDisabled: '<',\r\n rememberSelection: '<',\r\n showSelectAccount: '<',\r\n labelText: '@',\r\n onAccountChange: '&'\r\n };\r\n }\r\n\r\n export class AccountSelectController {\r\n selectionService: SelectionService;\r\n private _accounts: Array;\r\n private _selectedAccount: Account;\r\n private useSelectionService: boolean;\r\n rememberSelection: boolean;\r\n onAccountChange: any;\r\n\r\n static $inject = ['selectionService'];\r\n\r\n constructor(selectionService) {\r\n this.selectionService = selectionService;\r\n\r\n if (this.rememberSelection===undefined) {\r\n this.useSelectionService = true;\r\n }\r\n else {\r\n this.useSelectionService = this.rememberSelection;\r\n } \r\n }\r\n\r\n get accounts(): Array {\r\n return this._accounts;\r\n }\r\n\r\n set accounts(value: Array){\r\n this._accounts = value;\r\n\r\n if (!this.useSelectionService) {\r\n return;\r\n }\r\n\r\n if (this.selectionService && this.selectionService.selectedAccountId) {\r\n var account = this.selectionService.getSelectedAccount(this._accounts);\r\n\r\n if (account != null) { \r\n this._selectedAccount = account;\r\n this.onAccountChange({ accountId: this._selectedAccount.accountId });\r\n }\r\n }\r\n }\r\n\r\n get selectedAccount(): Account {\r\n return this._selectedAccount;\r\n }\r\n\r\n set selectedAccount(value: Account) {\r\n this._selectedAccount = value;\r\n\r\n if (!this.useSelectionService) {\r\n return;\r\n }\r\n\r\n if (this.selectionService) {\r\n if (value) {\r\n this.selectionService.selectedAccountId = value.accountId;\r\n }\r\n }\r\n }\r\n\r\n // public $onChanges(changesObj) {\r\n // console.log(\"Accounts Select Changed Obj: \");\r\n // console.log(changesObj);\r\n // }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ActionButtonComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/actionButton.component.html';\r\n bindings: any = {\r\n isDisabled: '<',\r\n isBusy: '<',\r\n text: '@',\r\n onClick: '&'\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PasswordValidationComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/passwordValidation.component.html';\r\n bindings: any = {\r\n password: '<',\r\n onValidation: '<'\r\n };\r\n controller: any = PasswordValidationCtrl\r\n \r\n }\r\n export class PasswordValidationCtrl {\r\n private $ctrl: any;\r\n private password: string;\r\n validUppercase: boolean;\r\n validLowercase: boolean;\r\n validNumber: boolean;\r\n validSpecial: boolean;\r\n valid: boolean;\r\n onValidation: any;\r\n constructor(){\r\n this.$ctrl = this;\r\n this.resetValidation();\r\n }\r\n private resetValidation() {\r\n this.validUppercase = false;\r\n this.validLowercase = false;\r\n this.validNumber = false;\r\n this.validSpecial = false;\r\n this.valid = false;\r\n }\r\n private validate() {\r\n this.resetValidation();\r\n if(this.password){\r\n if(this.password.match(/[A-Z]/g)){\r\n this.validUppercase = true;\r\n }\r\n if(this.password.match(/[a-z]/g)){\r\n this.validLowercase = true;\r\n }\r\n if(this.password.match(/[0-9]/g)){\r\n this.validNumber = true;\r\n }\r\n if(this.password.match(/[#$^+=!*()@%&]/g)){\r\n this.validSpecial = true;\r\n }\r\n if(this.validUppercase &&\r\n this.validLowercase && \r\n this.validNumber && \r\n this.validSpecial) {\r\n this.valid = true;\r\n }\r\n if(this.onValidation){\r\n this.onValidation(this.valid)\r\n }\r\n }\r\n }\r\n private $onChanges(changesObj){\r\n this.validate()\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class DateSelectComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/dateSelect.component.html';\r\n controller: any = DateSelectController;\r\n bindings: any = {\r\n isDisabled: '<',\r\n defaultDate: '<',\r\n date: '<',\r\n labelText: '@',\r\n onDateChange: '&'\r\n };\r\n }\r\n\r\n export class DateSelectController {\r\n isOpened: boolean = false;\r\n selectedDate: Date;\r\n defaultDate: Date;\r\n date: Date;\r\n format: string = \"dd/MM/yyyy\";\r\n onDateChange: any;\r\n\r\n constructor() {\r\n this.isOpened = false;\r\n this.format = \"dd/MM/yyyy\";\r\n\r\n if (this.defaultDate) {\r\n this.selectedDate = this.defaultDate;\r\n } else {\r\n if(this.date){\r\n this.selectedDate = this.date;\r\n }else{\r\n console.log(this.selectedDate)\r\n this.selectedDate = new Date();\r\n }\r\n }\r\n }\r\n public $onChanges(changesObj) {\r\n if(changesObj.date && changesObj.date.currentValue){\r\n this.selectedDate = changesObj.date.currentValue;\r\n }\r\n }\r\n onDateSelect(e, data) {\r\n this.isOpened = false;\r\n this.onDateChange(data)\r\n }\r\n\r\n openCalendar() {\r\n this.isOpened = true;\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class MorningstarErrorComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/morningstarError.component.html';\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ChangePhoneComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/common/components/changePhone.component.html';\r\n controller: any = ChangePhoneCtrl;\r\n bindings: any = {\r\n showCancelButton: '<',\r\n };\r\n }\r\n\r\n export interface ChangePhoneScope extends ng.IScope {\r\n showInfo: boolean;\r\n showCancelButton: boolean;\r\n currentNumber: string;\r\n changePhoneForm: ng.IFormController;\r\n verifyPhoneForm: ng.IFormController;\r\n phoneDetails: Patersons.PhoneDetails;\r\n phoneConfirmationDetails: Patersons.PhoneConfirmationDetails;\r\n errorHandler: any;\r\n isCodeSubmitted: boolean;\r\n events: Patersons.ChangePhoneCtrl;\r\n userCompany: UserCompany;\r\n profile: UserProfile;\r\n }\r\n\r\n export class ChangePhoneCtrl {\r\n scope: Patersons.ChangePhoneScope;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n identityService: Patersons.IdentityService;\r\n tokenService: Patersons.TokenService;\r\n navigationService: Patersons.NavigationService;\r\n sessionService: Patersons.SessionService;\r\n showCancelButton: boolean;\r\n location: angular.ILocationService;\r\n\r\n static $inject = ['$scope', '$location', '$window', '$state', '$stateParams', 'identityService', 'tokenService', 'navigationService', 'userCompanyService', 'sessionService'];\r\n\r\n constructor($scope, $location, $window, $state, $stateParams, identityService, tokenService, navigationService, userCompanyService, sessionService) {\r\n this.scope = $scope;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.identityService = identityService;\r\n this.tokenService = tokenService;\r\n this.navigationService = navigationService;\r\n this.location = $location;\r\n this.sessionService = sessionService;\r\n this.scope.profile = this.sessionService.getCurrentUserProfile();\r\n\r\n this.scope.events = this;\r\n this.scope.showCancelButton = this.showCancelButton;\r\n var userId = $stateParams.userId;\r\n this.scope.isCodeSubmitted = false;\r\n this.scope.phoneDetails = {\r\n mobilePhoneNumber: \"\"\r\n } ;\r\n this.navigationService.deactivateAll();\r\n this.updateUiFromProfile();\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n\r\n updateUiFromProfile() {\r\n //let profile = this.tokenService.tokenManager.profile;\r\n\r\n //if (profile) {\r\n //this.scope.showInfo = (profile.phone_number_verified != \"true\");\r\n //this.scope.currentNumber = profile.phone_number;\r\n // get phone number from backend\r\n var promise = this.identityService.getPhoneNumber();\r\n promise.then((result: any) => {\r\n this.scope.showInfo = (result[\"phoneNumberVerified\"] != true);\r\n this.scope.currentNumber = result[\"phoneNumber\"];\r\n this.scope.phoneDetails = {\r\n mobilePhoneNumber: this.scope.currentNumber\r\n }\r\n console.log(this.scope.currentNumber);\r\n console.info('this.scope.showInfo ' + this.scope.showInfo);\r\n console.info('this.scope.currentNumber ' + this.scope.currentNumber);\r\n }).catch((reason) =>{\r\n this.scope.showInfo = true;\r\n console.error(reason);\r\n });\r\n //} else {\r\n // this.scope.showInfo = true;\r\n //}\r\n }\r\n\r\n changeNumber() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.changePhoneForm.$invalid) {\r\n return;\r\n }\r\n this.identityService.changeMobileNumber(this.scope.phoneDetails)\r\n .then((result) => {\r\n this.scope.isCodeSubmitted = true;\r\n },\r\n (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n confirmCode() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.verifyPhoneForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.phoneConfirmationDetails.mobilePhoneNumber = this.scope.phoneDetails.mobilePhoneNumber;\r\n\r\n this.identityService.confirmMobileNumberChange(this.scope.phoneConfirmationDetails)\r\n .then((result) => {\r\n this.scope.showInfo = false;\r\n this.scope.currentNumber = this.scope.phoneConfirmationDetails.mobilePhoneNumber;\r\n setTimeout(() => {\r\n location.href = '/dashboard';\r\n }, 2000);\r\n // need to avoid that redirect\r\n //this.tokenService.tokenManager.redirectForToken();\r\n },\r\n (reason) => {\r\n this.updateUiFromProfile();\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n cancelRegistration(): void {\r\n location.href = '/dashboard';\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class FeaturedItemComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/research/components/featuredItem.component.html';\r\n bindings: any = {\r\n feedItem: '<',\r\n showImage: '<',\r\n defaultImage: '@',\r\n title: '@'\r\n };\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class feedListComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/research/components/feedList.component.html';\r\n controller: any = FeedListController;\r\n bindings: any = {\r\n feedItems: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class FeedListController {\r\n feedItems: Array;\r\n predicate: string;\r\n reverse: boolean;\r\n\r\n constructor() {\r\n this.predicate = 'publishedDate';\r\n this.reverse = true;\r\n }\r\n\r\n order(predicate: string) {\r\n this.reverse = (this.predicate === predicate) ? !this.reverse : false;\r\n this.predicate = predicate;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class InvestorDocsComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/investorDocs.component.html';\r\n controller: any = InvestorDocsController;\r\n bindings: any = {\r\n report: '<',\r\n isDownloading: '<',\r\n onDownloadFiles: '&'\r\n };\r\n }\r\n\r\n export class InvestorDocsController{\r\n\r\n report: any;\r\n reverse: boolean;\r\n predicate: string;\r\n isSelectAll: boolean;\r\n isDownloading: boolean;\r\n onDownloadFiles;\r\n constructor() {\r\n\r\n\r\n this.predicate = \"date\";\r\n this.reverse = true;\r\n var self = this;\r\n this.report.investorDocs = this.report.investorDocs.map(function(a){\r\n a.date = self.extractDateFromString(a.name);\r\n return a;\r\n })\r\n }\r\n extractDateFromString = function(string){\r\n var months = [\"january\", \"february\", \"march\", \"april\", \"may\", \"june\", \"july\", \"august\", \"september\", \"october\", \"november\", \"december\"];\r\n // Match = 12 January 2019\r\n var regexpFullDate = new RegExp(\"\\\\d{1,2} (\"+ months.join(\"|\") +\") \\\\d{4}\", \"gi\");\r\n var matchFullDate = string.match(regexpFullDate);\r\n // Match 2019'20\r\n var regexpYear = new RegExp(\"\\\\d{4}'\\\\d{2}\");\r\n var matchYear = string.match(regexpYear);\r\n // Match September 2019\r\n var regexpPartialDate = new RegExp(\"(\" + months.join(\"|\") + \") \\\\d{4}\", \"gi\");\r\n var matchPartialDate = string.match(regexpPartialDate);\r\n\r\n var date = null;\r\n if (matchFullDate && matchFullDate[0]){\r\n date = new Date(matchFullDate[0]);\r\n } else if (matchYear && matchYear[0]){\r\n var yearSplit = matchYear[0].split(\"'\");\r\n var year = parseInt(yearSplit[0]) + 1\r\n date = new Date(year.toString());\r\n } else if (matchPartialDate && matchPartialDate[0]){\r\n var dateSplit = matchPartialDate[0].split(\" \");\r\n date = new Date(dateSplit[1], months.indexOf(dateSplit[0].toLowerCase()), 1);\r\n }\r\n return date;\r\n };\r\n selectAll = function (check) {\r\n\r\n this.report.investorDocs.forEach(function (item, index) {\r\n item.isSelected = check;\r\n });\r\n\r\n };\r\n\r\n order = function (predicate) {\r\n this.reverse = (this.predicate === predicate) ? !this.reverse : false;\r\n this.predicate = predicate;\r\n\r\n };\r\n\r\n downloadDocs = function ()\r\n {\r\n let selectedItems = [];\r\n this.report.investorDocs.forEach(function (item, index) {\r\n if (item.isSelected) {\r\n selectedItems.push(item)\r\n }\r\n });\r\n\r\n this.onDownloadFiles({ investorDocs: selectedItems })\r\n }\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ReportTypeSelectComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/reportTypeSelect.component.html';\r\n controller: any = ReportTypeSelectController;\r\n bindings: any = { \r\n isDisabled: '<',\r\n onReportTypeChange: '&'\r\n };\r\n }\r\n export interface ReportTypeSelectScope extends ng.IScope {\r\n events: Patersons.ReportTypeSelectController;\r\n items: any;\r\n menuOpen: boolean\r\n userCompany: UserCompany;\r\n }\r\n export class ReportTypeSelectController {\r\n private $ctrl: any;\r\n scope: Patersons.ReportTypeSelectScope;\r\n state: angular.ui.IStateService;\r\n location: angular.ILocationService;\r\n stateParams: angular.ui.IStateProvider;\r\n userCompanyService: Patersons.UserCompanyService;\r\n key: string;\r\n \r\n static $inject = ['$scope', '$location', '$state', '$stateParams','userCompanyService'];\r\n\r\n constructor($scope, $location, $state, $stateParams,userCompanyService){\r\n this.$ctrl = this;\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.scope.menuOpen = false;\r\n this.userCompanyService = userCompanyService;\r\n\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n \r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class HoldingsDisclaimerComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/holdingsDisclaimer.component.html';\r\n controller = ['userCompanyService', function(userCompanyService) {\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.userCompany = company;\r\n })\r\n }]\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ReportDisclaimerComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/reportDisclaimer.component.html';\r\n controller = ['userCompanyService', function(userCompanyService) {\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.userCompany = company;\r\n })\r\n }]\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class AccountDateRangeFilterComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/accountDateRangeFilter.component.html';\r\n controller: any = AccountDateRangeFilterController;\r\n bindings: any = {\r\n defaultFromDate: '<',\r\n defaultToDate: '<',\r\n accounts: '=',\r\n isBusy: '<',\r\n onApplyFilter: '&'\r\n };\r\n }\r\n\r\n export class AccountDateRangeFilterController {\r\n accounts: Array;\r\n selectedAccount: Account;\r\n accountId: string;\r\n fromDate: Date;\r\n toDate: Date;\r\n defaultFromDate: Date;\r\n defaultToDate: Date;\r\n\r\n onApplyFilter: any;\r\n\r\n constructor() {\r\n if (this.defaultFromDate) {\r\n this.setFromDate(this.defaultFromDate);\r\n }\r\n else {\r\n this.setFromDate(new Date());\r\n }\r\n\r\n if (this.defaultToDate) {\r\n this.setToDate(this.defaultToDate);\r\n }\r\n else {\r\n this.setToDate(new Date());\r\n }\r\n\r\n \r\n }\r\n\r\n setSelectedAccount(accountId: string) {\r\n this.selectedAccount = this.accounts.filter(a => a.accountId == accountId)[0];\r\n console.info('selected account id: ' + this.selectedAccount.accountId);\r\n if(this.selectedAccount && this.fromDate && this.toDate){\r\n this.onApplyFilter({accountId: this.selectedAccount.accountId, fromDate: this.fromDate, toDate: this.toDate})\r\n }\r\n }\r\n\r\n setFromDate(fromDate: Date) {\r\n this.fromDate = fromDate;\r\n console.info('from date: ' + this.fromDate);\r\n if(this.selectedAccount && this.fromDate && this.toDate){\r\n this.onApplyFilter({accountId: this.selectedAccount.accountId, fromDate: this.fromDate, toDate: this.toDate})\r\n }\r\n }\r\n\r\n setToDate(toDate: Date) {\r\n this.toDate = toDate;\r\n console.info('to date: ' + this.toDate);\r\n if(this.selectedAccount && this.fromDate && this.toDate){\r\n this.onApplyFilter({accountId: this.selectedAccount.accountId, fromDate: this.fromDate, toDate: this.toDate})\r\n }\r\n }\r\n\r\n public $onChanges(changesObj) {\r\n console.log(\"Account Date Range Obj: \");\r\n console.log(changesObj);\r\n if(this.accounts && this.accounts[0] && !this.selectedAccount){\r\n this.setSelectedAccount(this.accounts[0].accountId)\r\n }\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PortfolioSummaryComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/portfolioSummary.component.html';\r\n controller: any = PortfolioSummaryController;\r\n bindings: any = {\r\n account: '<',\r\n isDownloadReady: '<',\r\n summaryText: '@',\r\n onDownloadPdfClicked: '&',\r\n onDownloadCsvClicked: '&',\r\n hidePdfOption: '<',\r\n hideCsvOption: '<'\r\n };\r\n }\r\n\r\n export class PortfolioSummaryController {\r\n account: Account;\r\n isDownloadReady: boolean;\r\n summaryText: string;\r\n hidePdfOption: boolean;\r\n hideCsvOption: boolean;\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n // This enum must be kept consistent with the C# enum defined in Patersons.Investors.InvestorApi.Model.\r\n // HACK: The quirk of casting \"Value\" to before assigning it to the enum Value is necessary\r\n // because, when we deserialise the ReportType information from the Web API we get back a string, which\r\n // the transpiled Javascript happily assigns to the target property since it stores no type information.\r\n export enum ReportType {\r\n CapitalTransactions = \"CapitalTransactions\",\r\n QuarterlyReports = \"QuarterlyReports\",\r\n Cash = \"Cash\",\r\n Income = \"Income\",\r\n CapitalGains = \"CapitalGains\",\r\n UnrealisedCapitalGains = \"UnrealisedCapitalGains\",\r\n Performance = \"Performance\",\r\n TaxReports = \"TaxReports\",\r\n Valuation = \"Valuation\",\r\n StandardLedger = \"StandardLedger\",\r\n MarketValue = \"MarketValue\"\r\n }\r\n\r\n export abstract class AbstractReport {\r\n accountNumber: string;\r\n adviser: string;\r\n title: string;\r\n asAtDate: Date;\r\n dateFrom: Date;\r\n dateTo: Date;\r\n creationDateUtc: Date;\r\n reportType: ReportType;\r\n }\r\n\r\n export abstract class AbstractReportController {\r\n shortPaddedDateFormat: string = 'dd MMM yyyy';\r\n mediumDateFormat: string = 'd MMMM yyyy';\r\n fullDateTimeFormat: string = 'd MMMM yyyy h:mm:ssa';\r\n mapAgilityExchangeCodeToMIC(exchangeCode){\r\n switch (exchangeCode) {\r\n\r\n case \"HKE\":\r\n case \"HKG\":\r\n exchangeCode = \"EX$$$$XHKG\"\r\n break;\r\n case \"SGX\":\r\n case \"SES\":\r\n exchangeCode = \"EX$$$$XSES\"\r\n break;\r\n case \"NAS\":\r\n exchangeCode = \"EX$$$$XNAS\"\r\n break;\r\n case \"NYS\":\r\n exchangeCode = \"EX$$$$XNYS\"\r\n break;\r\n case \"AME\":\r\n case \"ASE\":\r\n exchangeCode = \"EX$$$$XASE\"\r\n break;\r\n case \"LSE\":\r\n case \"LON\":\r\n exchangeCode = \"EX$$$$XLON\"\r\n break;\r\n case \"ETR\":\r\n case \"FRA\":\r\n exchangeCode = \"EX$$$$XFRA\"\r\n break;\r\n case \"PAR\":\r\n exchangeCode = \"EX$$$$XPAR\"\r\n break;\r\n case \"ARC\":\r\n case \"ARCX\":\r\n exchangeCode = \"EX$$$$ARCX\"\r\n break;\r\n case \"AMS\":\r\n exchangeCode = \"EX$$$$XAMS\"\r\n break;\r\n case \"MAD\":\r\n case \"MCE\":\r\n exchangeCode = \"EX$$$$XMCE\"\r\n break;\r\n case \"MTA\":\r\n case \"MIL\":\r\n exchangeCode = \"EX$$$$XMIL\"\r\n break;\r\n case \"AXW\":\r\n case \"ASX\":\r\n exchangeCode = \"EX$$$$XASX\";\r\n break;\r\n default:\r\n exchangeCode = \"UNL\";\r\n break;\r\n }\r\n return exchangeCode;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class IncomeReport extends AbstractReport {\r\n transactionTypeCategories: TransactionTypeCategory[];\r\n grandTotal: IncomeReportLineItem;\r\n }\r\n\r\n export class TransactionTypeCategory {\r\n name: string;\r\n subCategories: TransactionTypeSubCategory[];\r\n subtotal: IncomeReportLineItem;\r\n }\r\n\r\n export class TransactionTypeSubCategory {\r\n name: string;\r\n lineItems: IncomeReportLineItem[];\r\n subtotal: IncomeReportLineItem;\r\n }\r\n\r\n export class IncomeReportLineItem {\r\n payDate: Date;\r\n exDate: Date;\r\n code: string;\r\n description: string;\r\n amount: number;\r\n frankingCredits: number;\r\n withholdingTax: number;\r\n gst: number;\r\n transType: string;\r\n subTransType: string;\r\n }\r\n\r\n export class IncomeReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/incomeReport.component.html';\r\n controller: any = IncomeReportController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class IncomeReportController extends AbstractReportController {\r\n report: IncomeReport;\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class CashReport extends AbstractReport {\r\n transactionGroups: CashReportTransactionGroup[];\r\n }\r\n\r\n export class CashReportTransactionGroup {\r\n name: string;\r\n transactions: CashReportLineItem[];\r\n closingBalance: CashReportLineItem;\r\n }\r\n\r\n export class CashReportLineItem {\r\n date: Date;\r\n description: string;\r\n debit: number;\r\n credit: number;\r\n balance: number;\r\n cashSecurityGroupName: string;\r\n }\r\n\r\n export class CashReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/cashReport.component.html';\r\n controller: any = CashReportController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class CashReportController extends AbstractReportController {\r\n report: CashReport;\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class CapitalTransactionStatement extends AbstractReport {\r\n tradeCategories: TradeCategory[];\r\n }\r\n\r\n export class TradeCategory {\r\n name: string;\r\n transactions: CapitalTransaction[];\r\n subtotal: CapitalTransaction;\r\n }\r\n\r\n export class CapitalTransaction {\r\n tradeDate: Date;\r\n settlementDate: Date;\r\n quantity: number;\r\n code: string;\r\n description: string;\r\n unitPrice: number;\r\n grossAmount: number;\r\n brokerage: number;\r\n gst: number;\r\n netAmount: number;\r\n tradeCategory: string;\r\n }\r\n\r\n export class CapitalTransactionStatementComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/capitalTransactionStatement.component.html';\r\n controller: any = CapitalTransactionStatementController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class CapitalTransactionStatementController extends AbstractReportController {\r\n report: CapitalTransactionStatement;\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class StandardLedgerReport extends AbstractReport {\r\n ledgerEntries: LedgerEntry[];\r\n }\r\n\r\n export class LedgerEntry{\r\n account: string;\r\n ledgerDate: Date;\r\n type: string;\r\n currency: string;\r\n balance: number;\r\n amount: number;\r\n reference: string;\r\n description: string;\r\n isOpen: number;\r\n isCancelled: number;\r\n }\r\n\r\n export class StandardLedgerReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/standardLedgerReport.component.html';\r\n controller: any = StandardLedgerReportController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class StandardLedgerReportController extends AbstractReportController {\r\n report: StandardLedgerReport;\r\n }\r\n\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class QuarterlyReportsListReport extends AbstractReport {\r\n investorDocs: QuarterlyReportsListEntry[];\r\n }\r\n\r\n export class QuarterlyReportsListEntry {\r\n accountId: string;\r\n name: string;\r\n type: string;\r\n uri: string;\r\n }\r\n \r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class TaxReportsListReport extends AbstractReport {\r\n investorDocs: TaxReportsListEntry[];\r\n }\r\n\r\n export class TaxReportsListEntry {\r\n accountId: string;\r\n name: string;\r\n type: string;\r\n uri: string;\r\n }\r\n \r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PerformanceReport extends AbstractReport {\r\n openMarketValue: number;\r\n netContributionsWithdrawals: number;\r\n netAssetMovement: number;\r\n income: number;\r\n expenses: number;\r\n managementFees: number;\r\n closedMarketValue: number;\r\n irr: number;\r\n hasData: boolean;\r\n }\r\n\r\n\r\n export class PerformanceReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/performanceReport.component.html';\r\n controller: any = PerformanceReportController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class PerformanceReportController extends AbstractReportController {\r\n report: PerformanceReport;\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PortfolioGraphComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/portfolioGraph.component.html';\r\n controller: any = PortfolioGraphController;\r\n bindings: any = {\r\n\t\t\t\t\taccount: '<',\r\n };\r\n }\r\n\r\n export class PortfolioGraphController {\r\n\t\t\taccount: Account;\r\n\r\n\t\t\tportfolioService: Patersons.PortfolioService;\r\n\r\n\t\t\tassetClassOptions: any;\r\n\t\t\tassetClassData: any;\r\n\t\t\tassetClassLabels: any;\r\n\t\t\tassetClassError: boolean;\r\n\r\n\t\t\tsectorOptions: any;\r\n\t\t\tsectorsError: boolean;\r\n\t\t\tsectorData: any;\r\n\t\t\tsectorLabels: any;\r\n\t\t\t\r\n\t\t\tsummaryLoaded: boolean;\r\n\t\t\tsummaryError: boolean;\r\n\r\n\t\t\tactiveToggle: \"assetClass\" | \"sector\";\r\n\t\t\t\r\n\t\t\tstatic $inject = ['$scope', 'portfolioService']; \r\n\t\t\tconstructor($scope, portfolioService){\r\n\t\t\t\tthis.sectorOptions = {\r\n showLabel: false,\r\n donut: true,\r\n donutWidth: 45\r\n };\r\n\t\t\t\tthis.assetClassOptions = {\r\n showLabel: false,\r\n donut: true,\r\n donutWidth: 45\r\n };\r\n\t\t\t\tthis.portfolioService = portfolioService;\r\n\t\t\t\tthis.activeToggle = \"sector\";\r\n\t\t\t\tthis.getTopSectors();\r\n\t\t\t}\r\n\r\n\t\t\ttoggleActive(toggle: \"assetClass\" | \"sector\") {\r\n\t\t\t\tthis.activeToggle = toggle;\r\n\t\t\t\tthis.getTopSectors();\r\n\r\n\t\t\t}\r\n\r\n\t\t\textractSeriesData(results: Array) {\r\n\t\t\t\tif (results.length == 0) {\r\n\t\t\t\t\tvar emptyData = [100];\r\n\t\t\t\t\tvar emptyLabels = new Array();\r\n\t\t\t\t\temptyLabels.push({ name: \"Unknown\", value: 100 });\r\n\t\t\t\t\temptyLabels.push({ name: \"--\", value: 0 });\r\n\t\t\t\t\temptyLabels.push({ name: \"--\", value: 0 });\r\n\t\t\t\t\temptyLabels.push({ name: \"--\", value: 0 });\r\n\t\t\t\t\temptyLabels.push({ name: \"--\", value: 0 });\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tdata: emptyData,\r\n\t\t\t\t\t\tlabels: emptyLabels\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tvar total: number = 0;\r\n\t\t\t\t\tfor (var i = 0; i < results.length; i++) {\r\n\t\t\t\t\t\ttotal = total + results[i].count;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar seriesData: Array = new Array();\r\n\t\t\t\t\tvar labelData = [];\r\n\t\r\n\t\t\t\t\tfor (var i = 0; i < results.length; i++) {\r\n\t\r\n\t\t\t\t\t\tvar percentage: number = (results[i].count / total) * 100;\r\n\t\t\t\t\t\tvar roundedPercentage = Math.round(percentage * 100000) / 100000;\r\n\t\t\t\t\t\tseriesData.push(roundedPercentage);\r\n\t\r\n\t\t\t\t\t\tvar label: any = {};\r\n\t\t\t\t\t\tlabel.name = results[i].sectorName;\r\n\t\t\t\t\t\tlabel.value = roundedPercentage.toFixed(2);\r\n\t\t\t\t\t\tlabelData.push(label);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconsole.log\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tdata: seriesData,\r\n\t\t\t\t\t\tlabels: labelData\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tgetSectorDataPromise(): any {\r\n\t\t\t\tif (this.account.accountType === 'Standard') {\r\n\t\t\t\t\tswitch (this.activeToggle) {\r\n\t\t\t\t\t\tcase \"assetClass\":\r\n\t\t\t\t\t\t\treturn this.portfolioService.getTopAssetClass(this.account.accountId);\r\n\t\t\t\t\t\tcase \"sector\":\r\n\t\t\t\t\t\t\treturn this.portfolioService.getTopSectors(this.account.accountId);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tswitch (this.activeToggle) {\r\n\t\t\t\t\t\tcase \"assetClass\":\r\n\t\t\t\t\t\t\treturn this.portfolioService.getAccoladeTopAssetClass(this.account.accountId);\r\n\t\t\t\t\t\tcase \"sector\":\r\n\t\t\t\t\t\t\treturn this.portfolioService.getAccoladeTopSectors(this.account.accountId);\r\n\t\t\t\t\t}\r\n\t\t\t\t} \r\n\t\t\t}\r\n\r\n\t\t\tgetTopSectors() {\r\n\r\n\t\t\t\tif(\r\n\t\t\t\t\tthis.activeToggle === \"assetClass\" && this.assetClassData !== undefined ||\r\n\t\t\t\t\tthis.activeToggle === \"sector\" && this.sectorData !== undefined\r\n\t\t\t\t){\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis.summaryLoaded = false;\r\n\t\t\t\tthis.summaryError = false;\r\n\t\t\t\tlet promise = this.getSectorDataPromise()\r\n\t\t\t\tpromise.then((results: Array) => {\r\n\t\t\t\t\tvar data = this.extractSeriesData(results);\r\n\t\t\t\t\tswitch (this.activeToggle) {\r\n\t\t\t\t\t\tcase \"assetClass\":\r\n\t\t\t\t\t\t\tthis.assetClassData = {\r\n\t\t\t\t\t\t\t\tseries: data.data\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tthis.assetClassLabels = data.labels;\r\n\t\t\t\t\t\t\tthis.assetClassError = false;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"sector\":\r\n\t\t\t\t\t\t\tthis.sectorData = {\r\n\t\t\t\t\t\t\t\tseries: data.data\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tthis.sectorLabels = data.labels;\r\n\t\t\t\t\t\t\tthis.sectorsError = false;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tthis.summaryError = false;\r\n\t\t\t\t\tthis.summaryLoaded = true;\r\n\t\t\t\t},\r\n\t\t\t\t\t(reason) => { // error handling\r\n\t\t\t\t\t\tthis.sectorsError = true;\r\n\t\t\t\t\t\tthis.summaryError = true;\r\n\t\t\t\t\t\tthis.summaryLoaded = true;\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class RealisedCapitalGainsReport extends AbstractReport {\r\n assetClasses: RealisedCapitalGainsAssetClass[];\r\n total: RealisedCapitalGain;\r\n //getPdfFile() {\r\n // return null; //not implemented yet\r\n //}\r\n }\r\n\r\n export class RealisedCapitalGainsAssetClass {\r\n name: string;\r\n assets: RealisedCapitalGainsAsset[];\r\n subtotal: RealisedCapitalGain;\r\n }\r\n\r\n export class RealisedCapitalGainsAsset {\r\n name: string;\r\n capitalGains: RealisedCapitalGain[];\r\n subtotal: RealisedCapitalGain;\r\n }\r\n\r\n export class RealisedCapitalGain {\r\n purchaseDate: Date;\r\n saleDate: Date;\r\n quantity: number;\r\n capitalProceeds: number;\r\n totalCost: number;\r\n costPrice: number;\r\n salePrice: number;\r\n reducedCostBase: number;\r\n indexedCostBase: number;\r\n discountedCostBase: number;\r\n capitalLoss: number;\r\n indexedGain: number;\r\n grossDiscountGain: number;\r\n otherGain: number;\r\n }\r\n\r\n export class RealisedCapitalGainsReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/realisedCapitalGainsReport.component.html';\r\n controller: any = RealisedCapitalGainsReportController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class RealisedCapitalGainsReportController extends AbstractReportController {\r\n report: RealisedCapitalGainsReport;\r\n }\r\n\r\n}\r\n\r\n","\"use strict\";\r\n\r\nmodule Patersons {\r\n export class MarketValue {\r\n date: string;\r\n value: number;\r\n grossCost: number;\r\n netCost: number;\r\n }\r\n\r\n export class MarketValueReport extends AbstractReport {\r\n marketValuation: MarketValue[];\r\n }\r\n\r\n export class MarketValueReportComponent implements ng.IComponentOptions {\r\n templateUrl: string =\r\n \"assets/templates/portfolioSummary/components/marketValueReport.component.html\";\r\n controller: any = MarketValueReportController;\r\n bindings: any = {\r\n account: \"<\",\r\n displayTitle: \"@\",\r\n asAt: \"<\"\r\n };\r\n }\r\n export interface MarketValueReportScope extends ng.IScope {\r\n userCompany: UserCompany;\r\n events: Patersons.MarketValueReportController;\r\n\r\n loadedOnce: boolean;\r\n\r\n isMarketValueLoading: boolean;\r\n isMarketValueError: boolean;\r\n hasMarketValueData: boolean;\r\n\r\n marketValueReport: MarketValueReport;\r\n\r\n fromDate: Date;\r\n toDate: Date;\r\n selectedPeriod: string;\r\n\r\n periodFilter: any[];\r\n\r\n chartData: any;\r\n chartLabels: any;\r\n chartSeries: any;\r\n chartOptions: any;\r\n datasetOverride: any;\r\n }\r\n\r\n export class MarketValueReportController extends AbstractReportController {\r\n account: Account;\r\n asAt: Date;\r\n userCompanyService: Patersons.UserCompanyService;\r\n scope: Patersons.MarketValueReportScope;\r\n reportService: Patersons.ReportService;\r\n $rootScope: any;\r\n static $inject = [\r\n \"$scope\",\r\n \"$rootScope\",\r\n \"userCompanyService\",\r\n \"reportService\",\r\n ];\r\n constructor($scope, $rootScope, userCompanyService, reportService) {\r\n super();\r\n this.scope = $scope;\r\n this.$rootScope = $rootScope;\r\n this.scope.events = this;\r\n this.userCompanyService = userCompanyService;\r\n this.reportService = reportService;\r\n this.scope.fromDate = moment(this.asAt).add(-1, \"Y\").toDate();\r\n this.scope.toDate = moment(this.asAt).toDate();\r\n this.scope.selectedPeriod = \"1Y\";\r\n this.scope.periodFilter = [\r\n {\r\n id: \"ALL\",\r\n text: \"All\",\r\n fromDate: moment(this.asAt).add(-100, \"Y\").toDate(),\r\n toDate: moment(this.asAt).toDate(),\r\n unit: undefined\r\n },\r\n {\r\n id: \"5Y\",\r\n text: \"5Y\",\r\n fromDate: moment(this.asAt).add(-5, \"Y\").toDate(),\r\n toDate: moment(this.asAt).toDate(),\r\n unit: \"year\"\r\n },\r\n {\r\n id: \"1Y\",\r\n text: \"1Y\",\r\n fromDate: moment(this.asAt).add(-1, \"Y\").toDate(),\r\n toDate: moment(this.asAt).toDate(),\r\n unit: \"month\"\r\n },\r\n {\r\n id: \"6M\",\r\n text: \"6M\",\r\n fromDate: moment(this.asAt).add(-6, \"M\").toDate(),\r\n toDate: moment(this.asAt).toDate(),\r\n unit: \"month\"\r\n },\r\n {\r\n id: \"1M\",\r\n text: \"1M\",\r\n fromDate: moment(this.asAt).add(-1, \"M\").toDate(),\r\n toDate: moment(this.asAt).toDate(),\r\n unit: \"day\"\r\n },\r\n ];\r\n\r\n this.scope.chartOptions = {\r\n maintainAspectRatio: false,\r\n tooltips: {\r\n mode: \"index\",\r\n intersect: false,\r\n backgroundColor: '#FFF',\r\n titleFontSize: 16,\r\n titleFontColor: '#000',\r\n bodyFontColor: '#000',\r\n xPadding: 10,\r\n yPadding: 10,\r\n caretSize: 0,\r\n caretPadding: 10,\r\n titleSpacing: 4,\r\n cornerRadius: 0,\r\n bodyFontSize: 14,\r\n displayColors: false,\r\n callbacks: {\r\n label: function (tooltipItem, data) {\r\n return tooltipItem.yLabel.toLocaleString(\"en-AU\", {\r\n style: \"currency\",\r\n currency: \"AUD\",\r\n });\r\n },\r\n },\r\n },\r\n elements: {\r\n point: {\r\n radius: 0,\r\n },\r\n line: {\r\n tension: 0,\r\n fill: false,\r\n },\r\n },\r\n scales: {\r\n yAxes: [\r\n {\r\n ticks: {\r\n maxTicksLimit: 6,\r\n callback: function (value, index, values) {\r\n return value.toLocaleString(\"en-AU\", {\r\n style: \"currency\",\r\n currency: \"AUD\",\r\n });\r\n },\r\n },\r\n },\r\n ],\r\n xAxes: [\r\n {\r\n type: \"time\",\r\n time: {\r\n unit: \"month\",\r\n minUnit: \"day\",\r\n tooltipFormat: \"DD MMMM YYYY\", \r\n displayFormats: {\r\n quarter: \"MMM YYYY\",\r\n },\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n\r\n this.scope.datasetOverride = [\r\n {\r\n type: \"LineWithLine\",\r\n },\r\n ];\r\n\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n if (company.enableFeature) {\r\n this.load();\r\n }\r\n });\r\n }\r\n load() {\r\n this.getMarketValueReport();\r\n }\r\n\r\n setFromDate(selectedDate) {\r\n this.scope.fromDate = selectedDate;\r\n this.scope.selectedPeriod = null;\r\n this.getMarketValueReport();\r\n }\r\n\r\n setToDate(selectedDate) {\r\n this.scope.toDate = selectedDate;\r\n this.scope.selectedPeriod = null;\r\n this.getMarketValueReport();\r\n }\r\n\r\n setSelectedPeriod(selectedPeriod) {\r\n this.scope.toDate = selectedPeriod.toDate;\r\n this.scope.fromDate = selectedPeriod.fromDate;\r\n this.scope.selectedPeriod = selectedPeriod.id;\r\n this.scope.chartOptions.scales.xAxes[0].time.unit = selectedPeriod.unit;\r\n this.getMarketValueReport();\r\n }\r\n\r\n buildChartData() {\r\n this.scope.chartSeries = [\"Market Value for \" + this.account.accountId];\r\n\r\n const seriesData = this.scope.marketValueReport.marketValuation.map(\r\n (element) => {\r\n return {\r\n x: moment(element.date).toDate(),\r\n y: element.value,\r\n };\r\n }\r\n );\r\n\r\n if(this.scope.selectedPeriod === \"ALL\"){\r\n if(seriesData.length > 365){\r\n this.scope.chartOptions.scales.xAxes[0].time.unit = \"year\";\r\n }else{\r\n this.scope.chartOptions.scales.xAxes[0].time.unit = \"month\";\r\n }\r\n }\r\n\r\n this.scope.chartData = [seriesData];\r\n }\r\n\r\n getMarketValueReport = function () {\r\n this.scope.isMarketValueError = false;\r\n this.scope.hasMarketValueData = false;\r\n\r\n if (this.account == undefined) {\r\n return;\r\n }\r\n\r\n this.scope.isMarketValueLoading = true;\r\n\r\n this.reportService\r\n .getReport(\r\n ReportType.MarketValue,\r\n this.account.accountId,\r\n this.scope.fromDate,\r\n this.scope.toDate\r\n )\r\n .then(\r\n (result) => {\r\n this.scope.marketValueReport = result as MarketValueReport;\r\n this.buildChartData();\r\n this.scope.hasMarketValueData = true;\r\n this.scope.isMarketValueError = false;\r\n this.scope.loadedOnce = true;\r\n },\r\n (error) => {\r\n // error handling\r\n this.scope.marketValueReport = null;\r\n this.scope.isMarketValueError = true;\r\n this.scope.hasMarketValueData = false;\r\n }\r\n )\r\n .finally(() => {\r\n this.scope.isMarketValueLoading = false;\r\n });\r\n };\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class UnrealisedCapitalGainsReport extends AbstractReport {\r\n assetClasses: UnrealisedCapitalGainsAssetClass[];\r\n total: UnrealisedCapitalGain;\r\n //getPdfFile() {\r\n // return null; //not implemented yet\r\n //}\r\n }\r\n\r\n export class UnrealisedCapitalGainsAssetClass {\r\n name: string;\r\n assets: UnrealisedCapitalGainsAsset[];\r\n subtotal: UnrealisedCapitalGain;\r\n }\r\n\r\n export class UnrealisedCapitalGainsAsset {\r\n name: string;\r\n capitalGains: UnrealisedCapitalGain[];\r\n subtotal: UnrealisedCapitalGain;\r\n }\r\n\r\n export class UnrealisedCapitalGain {\r\n purchaseDate: Date;\r\n quantity: number;\r\n marketValue: number;\r\n totalCost: number;\r\n costPrice: number;\r\n marketPrice: number;\r\n reducedCostBase: number;\r\n indexedCostBase: number;\r\n discountedCostBase: number;\r\n capitalLoss: number;\r\n indexedGain: number;\r\n grossDiscountGain: number;\r\n otherGain: number;\r\n }\r\n\r\n export class UnrealisedCapitalGainsReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/unrealisedCapitalGainsReport.component.html';\r\n controller: any = UnrealisedCapitalGainsReportController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n\r\n export class UnrealisedCapitalGainsReportController extends AbstractReportController {\r\n report: UnrealisedCapitalGainsReport;\r\n }\r\n\r\n}\r\n\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class TermDepositsHoldingsReport {\r\n holdings: TermDeposit[];\r\n total: TermDeposit;\r\n }\r\n \r\n\r\n export class TermDepositsHoldingsReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/termDepositsReport.component.html';\r\n bindings: any = {\r\n report: '<',\r\n predicate: '<',\r\n sortOrder: '<',\r\n searchText: '<',\r\n onOrderChanged: '&'\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class CashHoldingsReport {\r\n holdings: CashHolding[];\r\n total: CashHolding;\r\n }\r\n\r\n export class CashHolding {\r\n instituteCode: string;\r\n accountName: string;\r\n balance: number;\r\n type: string;\r\n\tinterestRate: number;\r\n hasData(): boolean {\r\n return ((typeof this.instituteCode != 'undefined' && this.instituteCode) ||\r\n (typeof this.accountName != 'undefined' && this.accountName) ||\r\n (typeof this.type != 'undefined' && this.type) ||\r\n (typeof this.balance != 'undefined' && this.balance)) as any;\r\n }\r\n }\r\n\r\n export class CashHoldingsReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/cashHoldingsReport.component.html';\r\n bindings: any = {\r\n title: '@',\r\n report: '<',\r\n predicate: '<',\r\n sortOrder: '<',\r\n searchText: '<',\r\n onOrderChanged: '&'\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons { \r\n\r\n export class CashHighInterestHoldingsReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/cashHighInterestHoldingsReport.component.html';\r\n bindings: any = {\r\n title: '@',\r\n report: '<',\r\n predicate: '<',\r\n sortOrder: '<',\r\n searchText: '<',\r\n onOrderChanged: '&'\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n export class EquityHoldingsReport {\r\n holdings: EquityHolding[];\r\n total: EquityHolding;\r\n }\r\n\r\n export class EquityHolding {\r\n securityCode: string;\r\n exchange: string;\r\n companyName: string;\r\n quantity: number;\r\n averageCost: number;\r\n lastPrice: number;\r\n totalCost: number;\r\n marketValue: number;\r\n profitOrLoss: number;\r\n dividendPerShare: number;\r\n frankedAmount: number;\r\n income: number;\r\n yield: number;\r\n priceToEarnings: number;\r\n hasData(): boolean {\r\n return ((typeof this.securityCode != 'undefined' && this.securityCode) ||\r\n (typeof this.companyName != 'undefined' && this.companyName) ||\r\n (typeof this.quantity != 'undefined' && this.quantity) ||\r\n (typeof this.averageCost != 'undefined' && this.averageCost) ||\r\n (typeof this.lastPrice != 'undefined' && this.lastPrice) ||\r\n (typeof this.averageCost != 'undefined' && this.averageCost) ||\r\n (typeof this.totalCost != 'undefined' && this.totalCost) ||\r\n (typeof this.marketValue != 'undefined' && this.marketValue) ||\r\n (typeof this.profitOrLoss != 'undefined' && this.profitOrLoss) ||\r\n (typeof this.dividendPerShare != 'undefined' && this.dividendPerShare) ||\r\n (typeof this.frankedAmount != 'undefined' && this.frankedAmount) ||\r\n (typeof this.income != 'undefined' && this.income) ||\r\n (typeof this.yield != 'undefined' && this.yield) ||\r\n (typeof this.priceToEarnings != 'undefined' && this.priceToEarnings)\r\n ) as any;\r\n }\r\n }\r\n\r\n export class EquityHoldingsReportComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/equityHoldingsReport.component.html';\r\n controller: any = EquityHoldingsReportComponentController;\r\n bindings: any = {\r\n title: '@',\r\n report: '<',\r\n isInternational: '<',\r\n predicate: '<',\r\n sortOrder: '<',\r\n searchText: '<',\r\n onOrderChanged: '&'\r\n };\r\n }\r\n export interface EquityHoldingsReportScope extends ng.IScope {\r\n events: Patersons.EquityHoldingsReportComponentController;\r\n \r\n userCompany: UserCompany;\r\n }\r\n export class EquityHoldingsReportComponentController extends AbstractReportController {\r\n report: EquityHoldingsReport;\r\n morningStarService: Patersons.MorningStarService;\r\n userCompanyService: Patersons.UserCompanyService;\r\n scope: Patersons.EquityHoldingsReportScope;\r\n $rootScope: any;\r\n static $inject = ['$scope', '$rootScope', 'morningStarService','userCompanyService']; \r\n constructor($scope, $rootScope, morningStarService,userCompanyService) {\r\n super();\r\n this.scope = $scope;\r\n this.$rootScope = $rootScope;\r\n this.scope.events = this;\r\n this.morningStarService = morningStarService\r\n this.userCompanyService = userCompanyService;\r\n\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company\r\n if(company.enableFeature){\r\n this.load();\r\n }\r\n })\r\n }\r\n load() {\r\n let codes = [];\r\n this.report.holdings.forEach(report => {\r\n \r\n this.morningStarService.getMorningStarDataForSecurityCode(report.exchange, report.securityCode).then(res => {\r\n if(res){\r\n const elem = $('td:first-child:not(:has(a))').filter(function () {\r\n return $(this).text().trim() === report.securityCode;\r\n }).first();\r\n var openURL = '';\r\n var secId = res.FundShareClassId;\r\n openURL = mapHoldingTypeIdToReportURL(res.holdingTypeId);\r\n\r\n if(openURL){\r\n openURL += '#/' + secId;\r\n elem.html('' + report.securityCode + '');\r\n elem.next().html('' + elem.next().text() + '');\r\n }\r\n }\r\n })\r\n })\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n export class TotalMarketValueComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/totalMarketValue.component.html';\r\n bindings: any = {\r\n marketValue: '@'\r\n };\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class ValuationStatement extends AbstractReport {\r\n nonLoaSecurities: AssetCategory[];\r\n nonLoaUnsettledDividends: UnsettledDividends;\r\n loaSecurities: AssetCategory[];\r\n managedAccounts: {\r\n [key: string]: {\r\n grandTotal: ValuationStatementAsset,\r\n items: AssetCategory[];\r\n }\r\n };\r\n loaUnsettledDividends: UnsettledDividends;\r\n grandTotal: ValuationStatementAsset;\r\n managedAccountsGrandTotal: ValuationStatementAsset;\r\n }\r\n\r\n export class AssetCategory {\r\n categoryName: string;\r\n items: ValuationStatementAsset[];\r\n subtotal: ValuationStatementAsset;\r\n expanded: boolean;\r\n }\r\n\r\n export class ValuationStatementAsset {\r\n categoryName: string;\r\n code: string;\r\n securityName: string;\r\n quantity: number;\r\n costPrice: number;\r\n exchangeCode: string;\r\n price: number;\r\n reducedCostBase: number;\r\n marketPrice: number;\r\n marketValue: number;\r\n profitOrLoss: number;\r\n pctAssets: number;\r\n estIncome: number;\r\n estAnnualIncome: number;\r\n estAnnualGrossIncome: number;\r\n estFrankingCredits: number;\r\n estGrossYield: number;\r\n totalCost: number;\r\n }\r\n\r\n export class UnsettledDividends {\r\n items: UnsettledDividend[];\r\n subtotal: UnsettledDividend;\r\n }\r\n\r\n export class UnsettledDividend {\r\n code: string;\r\n securityCode: string;\r\n securityName: string;\r\n unsettledIncome: number;\r\n exchangeCode:string\r\n }\r\n export class ValuationStatementComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/valuationStatement.component.html';\r\n controller: any = ValuationStatementController;\r\n bindings: any = {\r\n report: '<',\r\n title: '@'\r\n };\r\n }\r\n export interface ValuationStatementScope extends ng.IScope {\r\n \r\n userCompany: UserCompany;\r\n events: Patersons.ValuationStatementController;\r\n \r\n }\r\n const sortFunds = (a, b) => a.code && a.code.localeCompare(b.code, undefined, {numeric: true}); \r\n \r\n const extractManagedFunds = ( items) => {\r\n const managedFunds = items.filter((element) => {\r\n return element.exchangeCode === \"FND\"\r\n }).sort(sortFunds) \r\n \r\n const unlisted = items.filter((element) => {\r\n return element.exchangeCode === \"UNL\"\r\n }).sort(sortFunds)\r\n\r\n const everythingElse = items.filter((element) => {\r\n return [\"FND\", \"UNL\"].indexOf(element.exchangeCode) === -1;\r\n }).sort(sortFunds)\r\n\r\n return [...everythingElse, ...managedFunds, ...unlisted] as typeof items\r\n\r\n }\r\n\r\n export class ValuationStatementController extends AbstractReportController {\r\n report: ValuationStatement;\r\n morningStarService: Patersons.MorningStarService;\r\n userCompanyService: Patersons.UserCompanyService;\r\n scope: Patersons.ValuationStatementScope;\r\n $rootScope: any;\r\n static $inject = ['$scope', '$rootScope', 'morningStarService', 'userCompanyService']; \r\n constructor($scope, $rootScope, morningStarService, userCompanyService){\r\n super();\r\n this.scope = $scope;\r\n this.$rootScope = $rootScope;\r\n this.scope.events = this;\r\n this.morningStarService = morningStarService\r\n this.userCompanyService = userCompanyService;\r\n\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company\r\n if(company.enableFeature){\r\n this.load();\r\n }\r\n })\r\n }\r\n toggleManagedAccount = (key, managedAccountIndex) => {\r\n this.report.managedAccounts[key].items[managedAccountIndex].expanded = !this.report.managedAccounts[key].items[managedAccountIndex].expanded;\r\n }\r\n load(){ \r\n let codes = [];\r\n this.report.nonLoaSecurities.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n code: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n category.items = extractManagedFunds(category.items)\r\n\r\n })\r\n Object.keys(this.report.managedAccounts).forEach(key => {\r\n let sortedItem =this.report.managedAccounts[key].items.sort((a,b) => a.categoryName.localeCompare(b.categoryName));\r\n \r\n var first = \"CG Large Cap Australian Equity Portfolio\";\r\n sortedItem.forEach(function(item,i){\r\n if(item.categoryName === first){\r\n sortedItem.splice(i, 1);\r\n sortedItem.unshift(item);\r\n }\r\n });\r\n \r\n this.report.managedAccounts[key].items = sortedItem;\r\n\r\n this.report.managedAccounts[key].items.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n code: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n category.items = extractManagedFunds(category.items)\r\n })\r\n })\r\n \r\n this.report.loaSecurities.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n code: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n category.items = extractManagedFunds(category.items)\r\n })\r\n this.report.nonLoaUnsettledDividends.items.forEach(unsettledDividend => {\r\n codes.push({\r\n code: unsettledDividend.code,\r\n exchangeCode: unsettledDividend.exchangeCode\r\n })\r\n this.report.nonLoaUnsettledDividends.items = extractManagedFunds(this.report.nonLoaUnsettledDividends.items)\r\n })\r\n this.report.loaUnsettledDividends.items.forEach(unsettledDividend => {\r\n codes.push({\r\n code: unsettledDividend.code,\r\n exchangeCode: unsettledDividend.exchangeCode\r\n })\r\n this.report.loaUnsettledDividends.items = extractManagedFunds(this.report.loaUnsettledDividends.items)\r\n })\r\n codes = codes.filter((value, index, self) => self.indexOf(value) === index);\r\n\r\n codes.forEach(code => {\r\n this.morningStarService.getMorningStarDataForSecurityCode(code.exchangeCode, code.code).then(res => {\r\n if(res){\r\n const elem = $('td:first-child:not(:has(a))').filter(function () {\r\n return $(this).text().trim() === code.code;\r\n }).first();\r\n var openURL = '';\r\n var secId = res.FundShareClassId;\r\n openURL = mapHoldingTypeIdToReportURL(res.holdingTypeId);\r\n\r\n if(openURL){\r\n openURL += '#/' + secId;\r\n elem.html('' + code.code + '');\r\n elem.siblings('.has-data-link').each(function(){\r\n const child = $(this);\r\n child.html('' + child.text() + '')\r\n })\r\n }\r\n }\r\n })\r\n })\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export class PortfolioNavigationComponent implements ng.IComponentOptions {\r\n templateUrl: string = 'assets/templates/portfolioSummary/components/portfolioNavigation.component.html';\r\n controller: any = PortfolioNavigationController;\r\n bindings: any = {\r\n key: '@'\r\n };\r\n }\r\n export interface PortfolioNavigationScope extends ng.IScope {\r\n events: Patersons.PortfolioNavigationController;\r\n items: any;\r\n menuOpen: boolean\r\n userCompany: UserCompany;\r\n }\r\n\r\n export class PortfolioNavigationController {\r\n private $ctrl: any;\r\n scope: Patersons.PortfolioNavigationScope;\r\n state: angular.ui.IStateService;\r\n location: angular.ILocationService;\r\n stateParams: angular.ui.IStateProvider;\r\n userCompanyService: Patersons.UserCompanyService;\r\n key: string;\r\n \r\n static $inject = ['$scope', '$location', '$state', '$stateParams','userCompanyService'];\r\n\r\n constructor($scope, $location, $state, $stateParams,userCompanyService){\r\n this.$ctrl = this;\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.scope.menuOpen = false;\r\n this.userCompanyService = userCompanyService;\r\n\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n this.initOptions();\r\n })\r\n \r\n }\r\n private initOptions() {\r\n const items = [];\r\n items.push({\r\n key: \"holdings\",\r\n title: \"Holdings\",\r\n })\r\n if(this.scope.userCompany.isDefault){\r\n items.push({\r\n key: \"portfolioSnapshot\",\r\n title: \"Snapshot\",\r\n })\r\n items.push({\r\n key: \"portfolioHeatmap\",\r\n title: \"Heatmap\",\r\n })\r\n items.push({\r\n key: \"marketOrders\",\r\n title: \"Orders\",\r\n })\r\n }\r\n\r\n items.push({\r\n key: \"ledger\",\r\n title: \"Ledger\",\r\n })\r\n items.push({\r\n key: \"confirmationNotes\",\r\n title: \"Contract Notes\",\r\n })\r\n items.push({\r\n key: \"report\",\r\n title: \"Accolade Portfolio Service\",\r\n })\r\n this.scope.items = items;\r\n }\r\n private toggleMenu(){\r\n this.scope.menuOpen = !this.scope.menuOpen;\r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class PortfolioBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.deactivateAll();\r\n this.navigationService.activateSection('portfolio');\r\n\r\n if ($location.$$path.indexOf('marketDepth') !== -1)\r\n this.navigationService.activateSection('analysis');\r\n\r\n if ($location.$$path.indexOf('stockReport') !== -1)\r\n this.navigationService.activateSection('research');\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface PlaceOrderRequestScope extends ng.IScope {\r\n orderRequestForm: ng.IFormController;\r\n parentController: AbstractController;\r\n portfolio: Array;\r\n selectedAccount: Account;\r\n selectedAccountId: string;\r\n order: OrderRequest;\r\n events: Patersons.PlaceOrderRequestViewCtrl;\r\n date: Date;\r\n isLoading: boolean;\r\n errorHandler: any;\r\n isSubmitted: boolean;\r\n }\r\n\r\n export class PlaceOrderRequestViewCtrl extends AbstractController {\r\n scope: Patersons.PlaceOrderRequestScope;\r\n portfolioService: Patersons.PortfolioService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, placeOrderRequestService, portfolioService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.portfolioService = portfolioService;\r\n this.scope.parentController = this;\r\n this.scope.events = this;\r\n this.scope.isSubmitted = false;\r\n var accountId = $stateParams.accountId;\r\n this.clearOrderRequestForm();\r\n }\r\n\r\n placeOrderRequest() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.orderRequestForm.$invalid) {\r\n return;\r\n }\r\n var promise: ng.IHttpPromise = this.portfolioService.placeOrderRequest(this.scope.order);\r\n promise.then((result) => {\r\n this.scope.isSubmitted = true;\r\n return;\r\n },\r\n (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n viewOrderRequests() {\r\n this.location.path('/viewOrderRequests');\r\n }\r\n\r\n clearOrderRequestForm() {\r\n this.scope.order = new OrderRequest();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ViewOrderRequestsScope extends ng.IScope {\r\n viewOrderRequestsForm: ng.IFormController;\r\n parentController: AbstractController;\r\n events: Patersons.ViewOrderRequestsViewCtrl;\r\n errorHandler: any;\r\n investorOrders: Array;\r\n isError: boolean;\r\n isSubmitted: boolean;\r\n }\r\n\r\n export class ViewOrderRequestsViewCtrl extends AbstractController {\r\n scope: Patersons.ViewOrderRequestsScope;\r\n portfolioService: Patersons.PortfolioService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.portfolioService = portfolioService;\r\n this.scope.parentController = this;\r\n this.scope.events = this;\r\n this.scope.isError = false;\r\n this.scope.isSubmitted = false;\r\n\r\n this.getOrderRequests();\r\n }\r\n\r\n order = function (predicate) {\r\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\r\n this.scope.predicate = predicate;\r\n };\r\n cancelOrder = function (orderToCancel: OrderRequest) {\r\n this.createCancelOrder(orderToCancel);\r\n };\r\n getOrderRequests() {\r\n var promise: ng.IHttpPromise = this.portfolioService.getOrderRequests();\r\n promise.then(\r\n (result) => {\r\n this.scope.investorOrders = result.data.value;\r\n },\r\n (reason) => {\r\n this.portfolioService.errorHandler = reason.data;\r\n }\r\n );\r\n }\r\n createCancelOrder(order: OrderRequest) {\r\n var cancelOrder : OrderRequest = new OrderRequest();\r\n cancelOrder.orderAction = \"Cancel\";\r\n cancelOrder.portfolioId = order.portfolioId;\r\n cancelOrder.price = order.price;\r\n cancelOrder.securityCode = order.securityCode;\r\n cancelOrder.volume = order.volume;\r\n cancelOrder.requestDateTime = new Date();\r\n cancelOrder.buyAtMarketRate = true;\r\n cancelOrder.orderNumber = order.id;\r\n\r\n var promise: ng.IHttpPromise = this.portfolioService.createCancelOrder(cancelOrder);\r\n promise.then(\r\n (result) => {\r\n this.scope.isSubmitted = result.status == 200;\r\n this.scope.isError = false;\r\n this.getOrderRequests();\r\n },\r\n (reason) => { // error handling\r\n this.scope.isError = true;\r\n this.scope.isSubmitted = false;\r\n }\r\n );\r\n }\r\n\r\n }\r\n}\r\n","'use strict';\r\n\r\ndeclare var Chartist: any;\r\n\r\n\r\nmodule Patersons {\r\n\r\n\r\n export interface DashboardScope extends ng.IScope {\r\n dashboardForm: ng.IFormController;\r\n data: any;\r\n responsiveOptions: any;\r\n events: Patersons.PortfolioDashboardCtrl;\r\n investorPortfolios: Array;\r\n totalCost: number;\r\n totalValue: number;\r\n estimatedAnnualIncome: number;\r\n isLoading: boolean;\r\n isBannerLoading: boolean;\r\n isNewsLoading: boolean;\r\n isMorningMarketLoading: boolean;\r\n hasNotifications: boolean;\r\n notificationText: string;\r\n notificationLink: string;\r\n notificationStateLink: string;\r\n bannerConfig: Banner;\r\n newsConfig: News[];\r\n latestMorningMarket: Feed;\r\n headerError: boolean;\r\n profile: UserProfile;\r\n userCompany: UserCompany;\r\n isLoggedIn: boolean;\r\n }\r\n\r\n export class PortfolioDashboardCtrl extends PortfolioBaseCtrl {\r\n\r\n scope: Patersons.DashboardScope;\r\n portfolioService: Patersons.PortfolioService;\r\n bannerService: Patersons.BannerService;\r\n reportService: Patersons.ReportService;\r\n researchFeedService: Patersons.ResearchFeedService;\r\n selectionService: Patersons.SelectionService;\r\n newsService: Patersons.NewsService;\r\n filter: any;\r\n sessionService: Patersons.SessionService;\r\n\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'bannerService', 'selectionService', 'navigationService', 'reportService', 'newsService', 'researchFeedService', 'sessionService', 'userCompanyService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, bannerService, selectionService, navigationService, reportService, newsService, researchFeedService, sessionService, userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.portfolioService = portfolioService;\r\n this.selectionService = selectionService;\r\n this.navigationService = navigationService;\r\n this.reportService = reportService;\r\n this.researchFeedService = researchFeedService;\r\n this.scope.isLoading = false;\r\n this.bannerService = bannerService;\r\n this.newsService = newsService;\r\n this.filter = $filter; \r\n this.sessionService = sessionService;\r\n\r\n this.scope.events = this;\r\n this.scope.headerError = false;\r\n this.scope.hasNotifications = false;\r\n this.scope.isLoggedIn = this.sessionService.isLoggedIn();\r\n\r\n // this.getBanner();\r\n this.getNews();\r\n // this.getLatestMorningMarket();\r\n this.getPortfolioData();\r\n this.getAccoladeNotifications();\r\n this.navigationService.deactivateAll();\r\n this.navigationService.activateSection('dashboard');\r\n if (this.scope.isLoggedIn) {\r\n //console.log('loadAdviserData');\r\n this.scope.profile = this.sessionService.getCurrentUserProfile();\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n }\r\n }\r\n getAccoladeNotifications(){\r\n var promise = this.reportService.getAllAccoladeNotifications();\r\n promise.then((result) => {\r\n console.log(result);\r\n if(result.length == 1){\r\n this.scope.notificationText = \"A new \" + result[0].type + \" is available. \";\r\n this.scope.hasNotifications = true;\r\n this.scope.notificationLink = result[0].link;\r\n this.scope.notificationStateLink = null;\r\n }else if(result.length > 0){\r\n let firstReportType = result[0].type;\r\n let allSame = result.every(item => {\r\n return item.type == firstReportType\r\n })\r\n if(allSame){\r\n this.scope.notificationText = result.length + \" new \" + firstReportType +\"s are available.\";\r\n }else{\r\n this.scope.notificationText = result.length + \" new Accolade Reports are available.\";\r\n }\r\n\r\n switch (firstReportType) {\r\n case \"Accolade Tax Report\":\r\n this.scope.notificationStateLink = \"report.tax\"\r\n break;\r\n case \"Accolade Quarterly Report\":\r\n this.scope.notificationStateLink = \"report.quarterly\"\r\n break;\r\n case \"Accolade Invoice\":\r\n this.scope.notificationStateLink = \"report.invoices\"\r\n break;\r\n default:\r\n this.scope.notificationStateLink = \"report\";\r\n break;\r\n }\r\n this.scope.hasNotifications = true;\r\n this.scope.notificationLink = null;\r\n }\r\n },\r\n (error) => { // error handling\r\n\r\n console.log(\"processAccoladeNotifications error\");\r\n console.log(error);\r\n })\r\n\r\n }\r\n //https://gist.github.com/bronthulke/cac00b8857c886108069\r\n getFinancialYear(yearsBack) {\r\n var financialYearStart, financialYearEnd;\r\n if (moment().quarter() > 2) {\r\n financialYearStart = moment().month('July').startOf('month'); // this year's July\r\n financialYearEnd = moment().add(1, 'years').month('June').endOf('month'); // next year's June\r\n } else {\r\n financialYearStart = moment().subtract(1, \"years\").month('July').startOf('month'); // last year's July\r\n financialYearEnd = moment().month('June').endOf('month'); // this year's June\r\n };\r\n\r\n if (yearsBack != undefined) {\r\n financialYearStart = financialYearStart.subtract(yearsBack, \"years\");\r\n financialYearEnd = financialYearEnd.subtract(yearsBack, \"years\");\r\n }\r\n\r\n return { \"start\": financialYearStart.startOf('day'), \"end\": financialYearEnd.startOf('day') };\r\n }\r\n acknowledgeNotification(){\r\n var promise = this.reportService.acknowledgeAccoladeNotifications();\r\n promise.then((result) => {\r\n if(this.scope.notificationLink){\r\n this.window.location.href = this.scope.notificationLink;\r\n }else{\r\n if (this.scope.notificationStateLink){\r\n this.state.go(this.scope.notificationStateLink)\r\n }\r\n }\r\n },\r\n (error) => { // error handling\r\n alert(\"Error acknowledging notifications. Please try again\")\r\n console.log(\"acknowledgeNotification error\");\r\n console.log(error);\r\n })\r\n }\r\n\r\n getNews() {\r\n this.scope.isNewsLoading = true;\r\n let newsCampaignParams = {\r\n utm_source: 'client_portal',\r\n utm_medium: 'dashboard_news'\r\n }\r\n let max_news = 4;\r\n var promise: ng.IHttpPromise = this.newsService.getNews();\r\n promise.then((result) => {\r\n if (result) {\r\n let newsConfig: News[] = result['news'];\r\n newsConfig = newsConfig.slice(0,max_news)\r\n newsConfig = newsConfig.map((element, index) => {\r\n if (element.link && element.link.indexOf('http://') !== 0 && element.link.indexOf('https://') !== 0) {\r\n element.link = 'http://' + element.link\r\n \r\n }\r\n let utmQuery = ''\r\n Object.keys(newsCampaignParams).forEach((key, index, all) => {\r\n utmQuery = utmQuery + key + \"=\" + newsCampaignParams[key] + (index !== all.length - 1 ? \"&\" : '')\r\n })\r\n utmQuery = utmQuery + \"&utm_campaign=\" + element.title\r\n if(element.link.indexOf('?') === -1){\r\n element.link = element.link + \"?\" + utmQuery;\r\n }else{\r\n var lastChar = element.link.substr(element.link.length - 1); \r\n if(lastChar == \"&\"){\r\n element.link = element.link + utmQuery;\r\n \r\n }{\r\n element.link = element.link + \"&\" + utmQuery;\r\n }\r\n }\r\n return element;\r\n });\r\n\r\n this.scope.newsConfig = newsConfig;\r\n setTimeout(() => {\r\n $('.clampThis').each(function(index, element) {\r\n $clamp(element, { clamp: 4, useNativeClamp: true });\r\n });\r\n }, 500);\r\n\r\n }\r\n },\r\n (error) => { // error handling\r\n \r\n })\r\n .finally(() => {\r\n this.scope.isNewsLoading = false;\r\n });\r\n }\r\n\r\n\r\n\r\n getLatestMorningMarket() {\r\n this.scope.isMorningMarketLoading = true;\r\n var promise = this.researchFeedService.getLatestMorningMarket();\r\n promise.then((result: Feed) => {\r\n if (result) {\r\n this.scope.latestMorningMarket = result;\r\n }\r\n },\r\n (error) => { // error handling\r\n this.scope.latestMorningMarket = null\r\n })\r\n .finally(() => {\r\n this.scope.isMorningMarketLoading = false;\r\n });\r\n }\r\n\r\n getBanner() {\r\n this.scope.isBannerLoading = true;\r\n var promise: ng.IHttpPromise = this.bannerService.getCurrent();\r\n promise.then((result) => {\r\n if (result && result[0]) {\r\n let bannerConfig: Banner = result[0];\r\n let buttonUrl = bannerConfig.buttonUrl.toLowerCase();\r\n\r\n if (buttonUrl.indexOf('http://') !== 0 && buttonUrl.indexOf('https://') !== 0) {\r\n bannerConfig.buttonUrl = 'http://' + bannerConfig.buttonUrl;\r\n }\r\n\r\n this.scope.bannerConfig = bannerConfig;\r\n }\r\n else {\r\n this.scope.bannerConfig = new Banner();\r\n this.scope.bannerConfig.isHidden = true;\r\n }\r\n },\r\n (error) => { // error handling\r\n this.scope.bannerConfig = new Banner();\r\n this.scope.bannerConfig.isHidden = true;\r\n })\r\n .finally(() => {\r\n this.scope.isBannerLoading = false;\r\n });\r\n }\r\n goToEOFYStatement(accountId){\r\n const previousFY = this.getFinancialYear(1)\r\n this.state.go(\"holdings\", {\r\n accountId: accountId,\r\n autoDownloadPDF: true,\r\n asAt: previousFY.end.toDate()\r\n });\r\n }\r\n getPortfolioData() {\r\n\r\n this.scope.isLoading = true;\r\n console.log(this.scope.isLoading);\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.investorPortfolios = result;\r\n\r\n for (var i = 0; i < this.scope.investorPortfolios.length; i++) {\r\n this.getPortfolioValue(this.scope.investorPortfolios[i]); // error handling: --\r\n }\r\n\r\n this.scope.isLoading = false;\r\n console.log(this.scope.isLoading);\r\n },\r\n (reason) => { // error handling\r\n this.scope.isLoading = false;\r\n this.portfolioService.errorHandler = reason.data;\r\n });\r\n }\r\n\r\n getPortfolioValue(account: Account) {\r\n let promise = this.portfolioService.getPortfolioValue(account);\r\n promise.then((result: any) => {\r\n if (result) {\r\n account.totalMovementToday = result.currentMovementValue;\r\n account.totalMovementPercentage = result.currentMovementPercent;\r\n account.totalHoldingsValue = result.currentValue;\r\n account.headerLoaded = true;\r\n }\r\n },\r\n (error) => { // error handling\r\n account.totalMovementToday = undefined;\r\n account.totalMovementPercentage = undefined;\r\n account.totalHoldingsValue = undefined;\r\n //this.scope.headerError = true;\r\n account.headerLoaded = true;\r\n });\r\n }\r\n\r\n goToPorfolioOverview(accountId: string) {\r\n this.selectionService.selectedAccountId = accountId;\r\n this.state.go(\"viewPortfolio\");\r\n }\r\n\r\n goToHoldings(accountId: string) {\r\n this.selectionService.selectedAccountId = accountId;\r\n this.state.go(\"holdings\");\r\n }\r\n\r\n getAccount(accountId: string): Account {\r\n var accounts: Array = this.scope.investorPortfolios.filter(x => x.accountId == accountId);\r\n\r\n if (accounts) {\r\n return accounts[0];\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\n\r\nmodule Patersons {\r\n export interface PortfolioSnapshotScope extends ng.IScope {\r\n events: PortfolioSnapshotCtrl;\r\n accounts: Array;\r\n isLoading: boolean;\r\n isError: boolean;\r\n hasData: boolean;\r\n selectedAccount: Account;\r\n cachedAccounts: any[]\r\n\r\n\r\n }\r\n export class PortfolioSnapshotCtrl extends PortfolioBaseCtrl {\r\n q: ng.IQService;\r\n scope: Patersons.PortfolioSnapshotScope;\r\n portfolioService: Patersons.PortfolioService;\r\n reportService: Patersons.ReportService;\r\n morningStarService: Patersons.MorningStarService;\r\n static $inject = ['$scope', '$q', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'reportService', 'reportDownloadService', 'portfolioService', 'navigationService', 'morningStarService'];\r\n\r\n constructor($scope, $q, $log, $location, $window, $state, $stateParams, $http, $rootScope, reportService, reportDownloadService, portfolioService, navigationService, morningStarService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.q = $q;\r\n this.scope.events = this;\r\n this.portfolioService = portfolioService;\r\n this.reportService = reportService;\r\n this.scope.accounts = new Array();\r\n this.morningStarService = morningStarService;\r\n this.scope.cachedAccounts = [];\r\n\r\n this.load();\r\n }\r\n load() {\r\n this.scope.isLoading = true;\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result) => {\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result;\r\n if (result[0]) {\r\n console.log(this.scope.selectedAccount)\r\n this.setSelectedAccount(result[0].accountId);\r\n setTimeout(() => {\r\n this.getPortfolioSnapshot();\r\n }, 500);\r\n \r\n }\r\n });\r\n })\r\n .catch((reason) => {\r\n this.scope.$apply(() => {\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n }\r\n setSelectedAccount(accountId: string) {\r\n console.info('Selected Account Id: ' + accountId);\r\n this.scope.hasData = false;\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n }\r\n getPortfolioSnapshot = function () {\r\n // if(this.scope.isLoading){\r\n // return;\r\n // }\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n this.scope.isLoading = true;\r\n \r\n this.loadPortfolioSnapshot();\r\n\r\n }\r\n extractCodesFromReport(report) {\r\n let codes = [];\r\n if (report) {\r\n report.forEach((item) => {\r\n codes.push({\r\n securityCode: item.securityCode,\r\n exchangeCode: item.exchange\r\n })\r\n })\r\n }\r\n return codes;\r\n }\r\n loadPortfolioSnapshot() {\r\n\r\n if (this.scope.selectedAccount.accountType == \"Standard\") {\r\n\r\n\r\n let codes = [];\r\n let cashAccountsPromise = this.portfolioService.getCashAccounts(this.scope.selectedAccount.accountId);\r\n cashAccountsPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let highInterestCashPromise = this.portfolioService.getHighInterestCashAccounts(this.scope.selectedAccount.accountId);\r\n highInterestCashPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let termDepositPromise = this.portfolioService.getTermDeposits(this.scope.selectedAccount.accountId);\r\n termDepositPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let internationalSharesPromise = this.portfolioService.getInternationalSharesForHoldings(this.scope.selectedAccount);\r\n internationalSharesPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let sharesPromise = this.portfolioService.getShares(this.scope.selectedAccount.accountId);\r\n sharesPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n\r\n }, (error) => { // error handling\r\n\r\n });\r\n \r\n let allPromises = this.q.all([\r\n cashAccountsPromise,\r\n highInterestCashPromise,\r\n termDepositPromise,\r\n internationalSharesPromise,\r\n sharesPromise]);\r\n allPromises.then(() => {\r\n this.loadMorningStarSnapshot(this.scope.selectedAccount.accountId, codes);\r\n });\r\n } else {\r\n this.reportService.getReport(ReportType.Valuation, this.scope.selectedAccount.accountId, new Date(), new Date())\r\n .then((report: ValuationStatement) => {\r\n let codes = [];\r\n report.nonLoaSecurities.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n securityCode: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n\r\n })\r\n report.loaSecurities.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n securityCode: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n\r\n })\r\n report.nonLoaUnsettledDividends.items.forEach(unsettledDividend => {\r\n codes.push({\r\n securityCode: unsettledDividend.code,\r\n exchangeCode: unsettledDividend.exchangeCode\r\n })\r\n })\r\n report.loaUnsettledDividends.items.forEach(unsettledDividend => {\r\n codes.push({\r\n securityCode: unsettledDividend.code,\r\n exchangeCode: unsettledDividend.exchangeCode\r\n })\r\n })\r\n this.loadMorningStarSnapshot(this.scope.selectedAccount.accountId, codes);\r\n },\r\n (error) => {\r\n // error handling\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n })\r\n }\r\n }\r\n\r\n loadMorningStarSnapshot(accountId, data: { exchangeCode: string, securityCode: string }[]) {\r\n var tickers = []\r\n //need to filter out funds (holdingTypeId = 2)\r\n Promise.all(data.map((code) => {\r\n return new Promise(resolveTicker => {\r\n this.morningStarService.getMorningStarDataForSecurityCode(code.exchangeCode, code.securityCode).then(res => {\r\n if (res) {\r\n if (res.holdingTypeId != 2) {\r\n tickers.push(res.FundShareClassId)\r\n }\r\n }\r\n resolveTicker()\r\n })\r\n })\r\n })).then(() => {\r\n //load data here\r\n rootMorningstarPromise().then((promiseChain) => {\r\n\r\n initComponent(\r\n 'component-portfolio-snapshot-container', \r\n 'ecWatchList-container', \r\n 'ec-watch-list', \r\n 'ecWatchList'\r\n ).then(() => {\r\n var watchlistInstance = morningstar.asterix.instanceRegistry.get('ecWatchList');\r\n\r\n watchlistInstance.setParameter('showActionBar', false);\r\n watchlistInstance.setParameter('tickers', tickers);\r\n\r\n this.scope.$apply(() => {\r\n this.scope.isLoading = false;\r\n });\r\n\r\n });\r\n })\r\n //the watchlist component takes a few seconds to load the data.\r\n //if there is an event to hook into this will be much better however at present there are no events to hook into that the component exposes. \r\n setTimeout(() => {\r\n \r\n }, 4000);\r\n })\r\n }\r\n }\r\n}","'use strict';\r\n\r\n\r\nmodule Patersons {\r\n export interface PortfolioHeatmapScope extends ng.IScope {\r\n events: PortfolioHeatmapCtrl;\r\n accounts: Array;\r\n isLoading: boolean;\r\n isError: boolean;\r\n hasData: boolean;\r\n selectedAccount: Account;\r\n\r\n cachedAccounts: any[]\r\n\r\n }\r\n export class PortfolioHeatmapCtrl extends PortfolioBaseCtrl {\r\n q: ng.IQService;\r\n\r\n scope: Patersons.PortfolioHeatmapScope;\r\n portfolioService: Patersons.PortfolioService;\r\n reportService: Patersons.ReportService;\r\n morningStarService: Patersons.MorningStarService;\r\n static $inject = ['$scope', '$q', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'reportService', 'reportDownloadService', 'portfolioService', 'navigationService', 'morningStarService'];\r\n\r\n constructor($scope, $q, $log, $location, $window, $state, $stateParams, $http, $rootScope, reportService, reportDownloadService, portfolioService, navigationService, morningStarService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.q = $q;\r\n this.scope.events = this;\r\n this.portfolioService = portfolioService;\r\n this.reportService = reportService;\r\n this.scope.accounts = new Array();\r\n this.morningStarService = morningStarService;\r\n this.scope.cachedAccounts = [];\r\n this.load();\r\n }\r\n load() {\r\n this.scope.isLoading = true;\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result) => {\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result;\r\n this.scope.isLoading = false;\r\n if (result[0]) {\r\n this.setSelectedAccount(result[0].accountId);\r\n setTimeout(() => {\r\n this.getPortfolioHeatmap();\r\n }, 500);\r\n }\r\n });\r\n })\r\n .catch((reason) => {\r\n this.scope.$apply(() => {\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n }\r\n extractCodesFromReport(report) {\r\n let codes = [];\r\n if (report) {\r\n report.forEach((item) => {\r\n codes.push({\r\n securityCode: item.securityCode,\r\n exchangeCode: item.exchange\r\n })\r\n })\r\n }\r\n return codes;\r\n }\r\n setSelectedAccount(accountId: string) {\r\n console.info('Selected Account Id: ' + accountId);\r\n this.scope.hasData = false;\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n }\r\n getPortfolioHeatmap = function () {\r\n // if(this.scope.isLoading){\r\n // return;\r\n // }\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n\r\n this.loadPortfolioHeatmap();\r\n\r\n }\r\n loadPortfolioHeatmap() {\r\n \r\n if (this.scope.selectedAccount.accountType == \"Standard\") {\r\n this.scope.isLoading = true;\r\n\r\n let codes = [];\r\n let cashAccountsPromise = this.portfolioService.getCashAccounts(this.scope.selectedAccount.accountId);\r\n cashAccountsPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let highInterestCashPromise = this.portfolioService.getHighInterestCashAccounts(this.scope.selectedAccount.accountId);\r\n highInterestCashPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let termDepositPromise = this.portfolioService.getTermDeposits(this.scope.selectedAccount.accountId);\r\n termDepositPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let internationalSharesPromise = this.portfolioService.getInternationalSharesForHoldings(this.scope.selectedAccount);\r\n internationalSharesPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n }, (error) => { // error handling\r\n\r\n });\r\n\r\n let sharesPromise = this.portfolioService.getShares(this.scope.selectedAccount.accountId);\r\n sharesPromise.then((result) => {\r\n codes = codes.concat(this.extractCodesFromReport(result));\r\n\r\n }, (error) => { // error handling\r\n\r\n });\r\n \r\n let allPromises = this.q.all([\r\n cashAccountsPromise,\r\n highInterestCashPromise,\r\n termDepositPromise,\r\n internationalSharesPromise,\r\n sharesPromise]);\r\n allPromises.then(() => {\r\n this.loadMorningStarHeatmap(this.scope.selectedAccount.accountId, codes);\r\n });\r\n } else {\r\n this.scope.isLoading = true;\r\n this.reportService.getReport(ReportType.Valuation, this.scope.selectedAccount.accountId, new Date(), new Date())\r\n .then((report: ValuationStatement ) => {\r\n let codes = [];\r\n report.nonLoaSecurities.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n securityCode: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n\r\n })\r\n report.loaSecurities.forEach(category => {\r\n category.items.forEach(item => {\r\n codes.push({\r\n securityCode: item.code,\r\n exchangeCode: item.exchangeCode\r\n })\r\n })\r\n\r\n })\r\n report.nonLoaUnsettledDividends.items.forEach(unsettledDividend => {\r\n codes.push({\r\n securityCode: unsettledDividend.code,\r\n exchangeCode: unsettledDividend.exchangeCode\r\n })\r\n })\r\n report.loaUnsettledDividends.items.forEach(unsettledDividend => {\r\n codes.push({\r\n securityCode: unsettledDividend.code,\r\n exchangeCode: unsettledDividend.exchangeCode\r\n })\r\n })\r\n this.loadMorningStarHeatmap(this.scope.selectedAccount.accountId, codes);\r\n },\r\n (error) => {\r\n // error handling\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n })\r\n }\r\n \r\n }\r\n\r\n loadMorningStarHeatmap(accountId, data: {exchangeCode: string, securityCode: string}[]){\r\n \r\n var tickers = []\r\n //need to filter out funds (holdingTypeId = 2)\r\n Promise.all(data.map((code) => {\r\n return new Promise(resolveTicker => {\r\n this.morningStarService.getMorningStarDataForSecurityCode(code.exchangeCode, code.securityCode).then(res => {\r\n if(res){\r\n if(res.holdingTypeId != 2){\r\n tickers.push(res.FundShareClassId)\r\n }\r\n }\r\n resolveTicker()\r\n })\r\n })\r\n })).then(() => {\r\n //load data here\r\n rootMorningstarPromise().then((promiseChain) => {\r\n // $('#component-portfolio-heatmap-container').append('
');\r\n try {\r\n morningstar.components[\"markets-components-core\"].TickersCache.tickers = {}\r\n } catch (error) {\r\n //silent fail\r\n }\r\n loaderConfig.configuration.overrides.components.portfolioHeatmap.settings.tickerList = tickers\r\n initComponent(\r\n 'component-portfolio-heatmap-container',\r\n \"heatmap-container\",\r\n \"markets-components-heatmap\",\r\n \"portfolioHeatmap\"\r\n ).then(() => {\r\n this.scope.$apply(() => {\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n })\r\n })\r\n \r\n }\r\n }\r\n}","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n\r\n export interface PortfolioViewScope extends ng.IScope {\r\n events: Patersons.PortfolioViewCtrl;\r\n accounts: Array;\r\n selectedAccount: Account;\r\n selectedAccountTotals: SelectedAccountTotal;\r\n accountToCompare: Account;\r\n isLoading: boolean;\r\n }\r\n\r\n\r\n //export class PortfolioViewCtrl extends AbstractController {\r\n export class PortfolioViewCtrl extends PortfolioBaseCtrl {\r\n scope: Patersons.PortfolioViewScope;\r\n q: ng.IQService;\r\n filter: ng.IFilterService;\r\n portfolioService: Patersons.PortfolioService;\r\n\r\n static $inject = ['$scope', '$log', '$q', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'navigationService'];\r\n\r\n constructor($scope, $log, $q, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.q = $q;\r\n this.filter = $filter;\r\n this.portfolioService = portfolioService;\r\n\r\n this.scope.events = this;\r\n this.load();\r\n }\r\n\r\n setSelectedAccount(accountId: string) {\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n this.checkCompareMethod();\r\n }\r\n\r\n setAccountToCompare(accountId: string) {\r\n this.scope.accountToCompare = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n this.checkCompareMethod();\r\n }\r\n\r\n load() {\r\n var promise = this.portfolioService.getCombinedPortfolioData();\r\n promise.then((result: Array) => {\r\n this.scope.accounts = result;\r\n\r\n if (this.scope.accounts != undefined && this.scope.accounts.length > 0) {\r\n this.scope.selectedAccount = this.scope.accounts[0];\r\n this.loadXray();\r\n }\r\n });\r\n }\r\n\r\n loadXray() {\r\n\r\n if (this.scope.selectedAccount == undefined) {\r\n return;\r\n }\r\n\r\n this.loadShares([this.scope.selectedAccount])\r\n .then(() => {\r\n this.mapAccountToPortfolio(this.scope.selectedAccount).then(result => {\r\n console.log(JSON.stringify(result['holdings']));\r\n var xrayComponent = morningstar.asterix.instanceRegistry.get('ecXray')\r\n xrayComponent.setParameter('portfolio', result);\r\n });\r\n\r\n });\r\n }\r\n\r\n loadCompare() {\r\n\r\n this.loadShares([this.scope.selectedAccount, this.scope.accountToCompare])\r\n .then(() => {\r\n this.log.info(\"compare \" + this.scope.selectedAccount.accountId + ' with ' + this.scope.accountToCompare.accountId);\r\n this.mapAccountToPortfolio(this.scope.selectedAccount).then(myPortfolio1 => {\r\n this.mapAccountToPortfolio(this.scope.accountToCompare).then(myPortfolio2 => {\r\n\r\n morningstar.asterix.instanceRegistry.get('ecPortfolioCompare.xrayCurrent').setParameter('portfolio', myPortfolio1);\r\n morningstar.asterix.instanceRegistry.get('ecPortfolioCompare.xrayProposed').setParameter('portfolio', myPortfolio2);\r\n });\r\n });\r\n\r\n\r\n\r\n });\r\n }\r\n\r\n loadShares(accounts: Account[]) {\r\n let q = this.q;\r\n let portfolioService = this.portfolioService;\r\n var getShares = [];\r\n\r\n angular.forEach(accounts, function(account) {\r\n if (account !== undefined && account.holdings === undefined) {\r\n\r\n let promise = null;\r\n if (account.accountType === 'Standard') {\r\n promise = portfolioService.getCombinedShares(account.accountId);\r\n\r\n } else {\r\n promise = portfolioService.getAccoladeHoldings(account.accountId);\r\n }\r\n getShares.push(promise\r\n .then(result => {\r\n console.info('Getting shares for account ' + account.accountId);\r\n\r\n console.log(result);\r\n account.holdings = result;\r\n\r\n })\r\n .catch(response => {\r\n console.error('Error getting shares for account ' + account.accountId, response.status, response.data);\r\n }));\r\n }\r\n });\r\n\r\n let deferred = q.defer();\r\n\r\n return q.all(getShares)\r\n .then(() => {\r\n deferred.resolve();\r\n return deferred.promise;\r\n })\r\n .catch(response => {\r\n console.error('Error loading shares', response.status, response.data);\r\n\r\n deferred.reject(response);\r\n\r\n return deferred.promise;\r\n });\r\n }\r\n\r\n checkCompareMethod() {\r\n if (this.scope.accountToCompare != null) {\r\n this.loadCompare();\r\n }\r\n else {\r\n this.loadXray();\r\n }\r\n }\r\n\r\n createHoldingForAssetAllocation(item: Holding) {\r\n var holdings = [];\r\n if (item.assetAllocationDomesticCash != 0) {\r\n holdings.push(this.createCustomHoldingsForCashAccolade(item.assetAllocationDomesticCash, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationDomesticEquity != 0) {\r\n holdings.push(this.createCustomHoldingsForAustralianEquity(item.assetAllocationDomesticEquity, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationDomesticFixedInterest != 0) {\r\n holdings.push(this.createCustomHoldingsForAUFixedIncome(item.assetAllocationDomesticFixedInterest, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationDomesticProperty != 0) {\r\n\r\n // Add addition checks here for the Exchange Code\r\n if (item.exchange.toLowerCase() === \"nsx\" || item.exchange.toLowerCase() === \"chi-x\") {\r\n holdings.push(this.createCustomHoldingsForProperty(item.marketValue, item.companyName));\r\n }\r\n else {\r\n if (item.exchange.toLowerCase() === \"axw\") {\r\n holdings.push(this.createCustomHoldingsForOther(item.assetAllocationOther, item.companyName));\r\n }\r\n else {\r\n holdings.push(this.createCustomHoldingsForUnlistedProperty(item.marketValue, item.companyName));\r\n }\r\n }\r\n\r\n }\r\n\r\n if (item.assetAllocationInternationalCash != 0) {\r\n holdings.push(this.createCustomHoldingsForCashAccolade(item.assetAllocationInternationalCash, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationInternationalEquity != 0) {\r\n holdings.push(this.createCustomHoldingsForInternationalEquity(item.assetAllocationInternationalEquity, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationInternationalFixedInterest != 0) {\r\n holdings.push(this.createCustomHoldingsForIntlFixedIncome(item.assetAllocationInternationalFixedInterest, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationInternationalProperty != 0) {\r\n holdings.push(this.createCustomHoldingsForInternationalProperty(item.assetAllocationInternationalProperty, item.companyName));\r\n }\r\n\r\n if (item.assetAllocationOther != 0) {\r\n holdings.push(this.createCustomHoldingsForOther(item.assetAllocationOther, item.companyName));\r\n }\r\n\r\n return holdings;\r\n };\r\n\r\n createCustomHoldingsForCashAccolade(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 100,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 100,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForAustralianEquity(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 100,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 100,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForInternationalEquity(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 100,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 100,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForProperty(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 100,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 100,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForUnlistedProperty(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 100,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 100,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForInternationalProperty(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 100,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 100,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForAUFixedIncome(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 100,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 100,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForIntlFixedIncome(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 100,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 100,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForCash(balance, securityName) {\r\n return {\r\n \"identifier\": \"Cash\",\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": \"Cash\",\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 100,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 100,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n createCustomHoldingsForOther(balance, securityName) {\r\n return {\r\n \"identifier\": securityName,\r\n \"identifierType\": \"ISIN\",\r\n \"Name\": securityName,\r\n \"weight\": balance,\r\n \"Proxy\": 1,\r\n \"breakdowns\": {\r\n \"assetAllocation\": [\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"N\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 100\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"L\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 100\r\n }\r\n },\r\n {\r\n \"type\": \"MorningstarAUS10\",\r\n \"salePosition\": \"S\",\r\n \"values\": {\r\n \"1\": 0,\r\n \"2\": 0,\r\n \"3\": 0,\r\n \"4\": 0,\r\n \"5\": 0,\r\n \"6\": 0,\r\n \"7\": 0,\r\n \"8\": 0,\r\n \"9\": 0,\r\n \"10\": 0\r\n }\r\n }\r\n ]\r\n }\r\n }\r\n }\r\n\r\n mapAccountToPortfolio(account: Account) {\r\n\r\n return new Promise((resolve, reject) => {\r\n console.info('mapAccountToPortfolio:');\r\n\r\n console.info(account);\r\n var allHoldings = [];\r\n\r\n var totalAccountValue = 0;\r\n for (var holdingItem of account.holdings) {\r\n totalAccountValue = totalAccountValue + holdingItem.marketValue;\r\n }\r\n if (account.accountType === \"Standard\") {\r\n console.log(\"standard account map account to portfolio\");\r\n var totalCashHoldingsValue = 0;\r\n\r\n for (var i = 0; i < account.holdings.length; i++) {\r\n if (account.holdings[i].isin === \"unknown\") {\r\n\r\n allHoldings.push(this.createCustomHoldingsForOther(account.holdings[i].marketValue, account.holdings[i].companyName));\r\n }\r\n else {\r\n var holding = {\r\n identifier: account.holdings[i].isin,\r\n identifierType: 'ISIN',\r\n weight: account.holdings[i].marketValue\r\n };\r\n\r\n allHoldings.push(holding);\r\n }\r\n }\r\n\r\n // Standard Account Type\r\n // Get Cash Accounts\r\n this.portfolioService.getCashAccounts(account.accountId)\r\n .then(result => {\r\n console.info('Getting cash account for: ' + account.accountId);\r\n console.log(\"Cash: \" + JSON.stringify(result));\r\n\r\n if (result && result.length > 0) { // need to sum up\r\n result.forEach((cashItem) => {\r\n totalAccountValue += cashItem.balance;\r\n totalCashHoldingsValue += cashItem.balance;\r\n });\r\n }\r\n }).then(() => {\r\n // Get High Interest Cash Accounts\r\n this.portfolioService.getHighInterestCashAccounts(account.accountId)\r\n .then(result => {\r\n console.info('Getting High Interest Cash account for: ' + account.accountId);\r\n console.log(\"High Interest Cash: \" + JSON.stringify(result));\r\n\r\n /*if (result.length > 0) {\r\n totalAccountValue = totalAccountValue + result[0].balance;\r\n totalCashHoldingsValue = totalCashHoldingsValue + result[0].balance;\r\n }*/\r\n if (result && result.length > 0) { // need to sum up\r\n result.forEach((cashItem) => {\r\n totalAccountValue += cashItem.balance;\r\n totalCashHoldingsValue += cashItem.balance;\r\n });\r\n }\r\n }).then(() => {\r\n // Get Term Deposits\r\n this.portfolioService.getTermDeposits(account.accountId)\r\n .then(result => {\r\n console.info('Getting Term Deposit account for: ' + account.accountId);\r\n console.log(\"Term Deposit: \" + JSON.stringify(result));\r\n if (result != null && result.length > 0) {\r\n\r\n result.forEach((item) => {\r\n\r\n allHoldings.push(this.createCustomHoldingsForAUFixedIncome(item.balance, item.provider));\r\n });\r\n };\r\n\r\n }).then(() => {\r\n if (totalCashHoldingsValue > 0) {\r\n allHoldings.push(this.createCustomHoldingsForCash(totalCashHoldingsValue, \"Cash\"));\r\n }\r\n\r\n var portfolio = {\r\n name: this.filter(\"accountName\")(account.designation ? account.designation.slice(1,-1) : account.accountName),\r\n totalValue: totalAccountValue,\r\n currencyId: 'AUD',\r\n holdings: allHoldings,\r\n benchmark: {\r\n holdings: [{\r\n identifier: 'XXXXXXXXXX',\r\n identifierType: 'MSID',\r\n weight: 100\r\n }]\r\n }\r\n }\r\n resolve(portfolio);\r\n\r\n });\r\n })\r\n });\r\n }\r\n else {\r\n console.log(account.holdings);\r\n\r\n account.holdings.forEach((item) => {\r\n if (item.isin === \"unknown\") {\r\n //when no isin is present, assign the holdings to categories based on the asset allocation percentage\r\n var assetAllocations = this.createHoldingForAssetAllocation(item);\r\n assetAllocations.forEach((allocation) => {\r\n allHoldings.push(allocation);\r\n });\r\n }\r\n else {\r\n var holding = {\r\n identifier: item.isin,\r\n identifierType: 'ISIN',\r\n weight: item.marketValue\r\n };\r\n allHoldings.push(holding);\r\n }\r\n });\r\n\r\n console.log(JSON.stringify(allHoldings));\r\n\r\n var portfolio = {\r\n name: this.filter(\"accountName\")(account.designation ? account.designation.slice(1,-1) : account.accountName),\r\n totalValue: totalAccountValue,\r\n currencyId: 'AUD',\r\n holdings: allHoldings,\r\n benchmark: {\r\n holdings: [{\r\n identifier: 'XXXXXXXXXX',\r\n identifierType: 'MSID',\r\n weight: 100\r\n }]\r\n }\r\n }\r\n resolve(portfolio);\r\n }\r\n\r\n });\r\n\r\n };\r\n\r\n\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ViewPortfolioScope extends ng.IScope {\r\n dashboardForm: ng.IFormController;\r\n events: Patersons.PortfolioViewCtrl;\r\n portfolio: Array;\r\n xRayPortfolios: MorningStarXrayPortfolio[];\r\n xRayComparePortfolios: MorningStarXrayPortfolio[];\r\n selectedAccount: Account;\r\n selectedAccountId: string;\r\n compareAccountId: string;\r\n ChangeAccount;\r\n CompareAccount;\r\n parentController: AbstractController;\r\n date: Date;\r\n isLoading: boolean;\r\n }\r\n\r\n export class PortfolioCompareCtrl extends AbstractController {\r\n portfolioService: Patersons.PortfolioService;\r\n scope: Patersons.ViewPortfolioScope;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.scope.date = new Date();\r\n this.scope.parentController = this;\r\n\r\n\r\n\t\t\t\r\n //this.scope.portfolio = this.portfolioService.getPortfolioData();\r\n //this.setSelectedAccount(this.scope.accounts[1].AccountId);\r\n //if (this.location.search().a != null) {\r\n // this.scope.selectedAccountId = this.location.search().a;\r\n //}\r\n //if (this.location.search().c != null) {\r\n // // the compare account id parameter\r\n // this.scope.compareAccountId = this.location.search().c;\r\n // this.log.info(\"CompareAccountId = \" + this.scope.compareAccountId);\r\n // this.getPortfolioData(this.baseUrl, this.scope.compareAccountId, this.scope.xRayComparePortfolios);\r\n //}\r\n //else {\r\n // this.log.info(\"AccountId = \" + this.scope.selectedAccountId);\r\n // this.getPortfolioData(this.baseUrl, this.scope.selectedAccountId, this.scope.xRayPortfolios);\r\n //}\r\n\r\n //this.scope.ChangeAccount = function () {\r\n // var accId = this.scope.selectedAccountId;\r\n // this.scope.xRayPortfolios = this.scope.parentController.getPortfolioData(this.scope.parentController.baseUrl, accId);\r\n // this.scope.parentController.setSelectedAccount(accId);\r\n //}\r\n //this.scope.CompareAccount = function () {\r\n // var accId = this.scope.selectedAccount.AccountId;\r\n // var caccId = this.scope.compareaccount.AccountId;\r\n // var url = \"/comparePortfolios?a=\" + accId + \"&c=\" + caccId;\r\n // this.location.url(url);\r\n //}\r\n }\r\n //setSelectedAccount(accountId: string) {\r\n // if (this.scope.accounts != null) {\r\n // this.scope.accounts.forEach((acc) => {\r\n // if (acc.AccountId == accountId) {\r\n // this.scope.selectedAccount = acc;\r\n // this.scope.selectedAccountId = acc.AccountId;\r\n // }\r\n // })\r\n // }\r\n //}\r\n //mapPortfolioResponseData(response, portfolios) {\r\n // var portfolio = new MorningStarXrayPortfolio();\r\n // portfolio.benchmark = new MorningStarXrayIdentifier('EUCA000620', 'MSID', 0);\r\n // response.data.Holdings.forEach((holding) => {\r\n\r\n // portfolio.holdingAllocation.push(new MorningStarXrayIdentifier(holding.ISIN, 'ISIN', holding.AverageCost));\r\n // })\r\n // portfolios = new Array();\r\n // portfolios.push(portfolio);\r\n\r\n // return portfolio;// response.data;\r\n //}\r\n //getPortfolioData(baseUrl?: string, id?: string, portfolios ?: MorningStarXrayPortfolio[]): any {\r\n // var Url = baseUrl + \"/dataService/api/portfoliosummary\";\r\n // this.log.info(\"portfolioService getting data with query \" + Url);\r\n // var data = {\r\n // AccountId: id\r\n // };\r\n\r\n // var config = {\r\n // params: data,\r\n // headers: { 'Accept': 'application/json' }\r\n // };\r\n\r\n\r\n // this.http.get(Url, config )\r\n // .then((result) => { return this.mapPortfolioResponseData(result, portfolios); },\r\n // this.errorHandler(\"Error retrieving porfolio summary\", Url));\r\n //}; \r\n }\r\n}\r\n","'use strict';\r\ndeclare var loaderConfigSalStock: any;\r\n\r\nmodule Patersons {\r\n\r\n export interface StockReportScope extends ng.IScope {\r\n dashboardForm: ng.IFormController;\r\n parentController: AbstractController;\r\n date: Date;\r\n isLoading: boolean;\r\n isinToView: string;\r\n portfolioLink: string;\r\n portfolioLinkText: string;\r\n portfolioName: string;\r\n salControlToUse: string;\r\n salControlLabel: string;\r\n securityId: string;\r\n }\r\n\r\n export class StockReportCtrl extends PortfolioBaseCtrl {\r\n scope: Patersons.StockReportScope;\r\n timeout: any;\r\n salReportScope: Array = []\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.parentController = this;\r\n this.scope.date = new Date();\r\n this.scope.securityId = $stateParams.secId;\r\n this.timeout = $timeout;\r\n this.load();\r\n }\r\n salStockReportTransform() {\r\n morningstar.asterix.ng.transforms.register('fromAuClientResearch', function (input) {\r\n if (!input) {\r\n return input;\r\n }\r\n return {\r\n title: input.title,\r\n url: input.url,\r\n date: new Date(input.dateWritten),\r\n author: input.author,\r\n recommendation: input.licenseeRecommendation,\r\n recommendationChange: input.recommendationChange\r\n };\r\n });\r\n\r\n morningstar.asterix.ng.transforms.register('fromAuDocumentList', function (input) {\r\n if (!input || !input.arcDocumentList || !input.arcDocumentList.length) {\r\n return input;\r\n }\r\n return {\r\n title: input.arcDocumentList[0].byLine ? input.arcDocumentList[0].byLine : input.arcDocumentList[0].title,\r\n url: input.arcDocumentList[0].url,\r\n date: new Date(input.arcDocumentList[0].date)\r\n };\r\n });\r\n }\r\n\r\n load() {\r\n this.log.info(\"SAL report Ctrl loading...\");\r\n let self = this;\r\n var isinData = this.state.params['secId']\r\n ? this.state.params['secId']\r\n : \"\";\r\n if (isinData) {\r\n $('#SalContainer').data('$injector', '')\r\n $.ajax(SALauthUrl).then(function (authData) {\r\n loaderConfigSalStock.configuration.overrides.settings.shareClassId = isinData;\r\n loaderConfigSalStock.apiTokens.apiGatewayToken = authData.body;\r\n morningstar.loader.load(loaderConfigSalStock).then(function (manifest) {\r\n //setup sal stock report transform\r\n self.salStockReportTransform();\r\n $('#main-spinner').remove()\r\n }).catch(function (error) {\r\n console.log(error);\r\n });\r\n\r\n })\r\n } else {\r\n this.state.go('dashboard')\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\ndeclare var loaderConfigSalFund: any;\r\n\r\nmodule Patersons {\r\n\r\n export interface FundReportScope extends ng.IScope {\r\n isLoading: boolean;\r\n securityId: string;\r\n }\r\n\r\n export class FundReportCtrl extends AbstractController {\r\n scope: Patersons.FundReportScope;\r\n timeout: any;\r\n salReportScope: Array = []\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.timeout = $timeout;\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.log.info(\"SAL fund Ctrl loading...\");\r\n $('#SalContainer').data('$injector', '')\r\n var isinData = this.state.params['secId']\r\n ? this.state.params['secId']\r\n : \"\";\r\n if (isinData) {\r\n $.ajax(SALauthUrl).then(function (authData) {\r\n loaderConfigSalFund.configuration.overrides.settings.shareClassId = isinData;\r\n loaderConfigSalFund.apiTokens.apiGatewayToken = authData.body;\r\n morningstar.loader.load(loaderConfigSalFund).then(function () {\r\n $('#main-spinner').remove()\r\n }).catch(function (error) {\r\n console.log(error);\r\n });\r\n\r\n })\r\n } else {\r\n this.state.go('dashboard')\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\ndeclare var loaderConfigSalETF: any;\r\nmodule Patersons {\r\n\r\n export interface EtfReportScope extends ng.IScope {\r\n isLoading: boolean;\r\n securityId: string;\r\n }\r\n\r\n export class EtfReportCtrl extends AbstractController {\r\n scope: Patersons.EtfReportScope;\r\n timeout: any;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.scope.securityId = $stateParams.secId;\r\n this.timeout = $timeout;\r\n this.load();\r\n }\r\n\r\n load() {\r\n\r\n this.log.info(\"SAL report Ctrl loading...\");\r\n console.log($('#sal-report'))\r\n //\r\n var isinData = this.state.params['secId']\r\n ? this.state.params['secId']\r\n : \"\";\r\n if (isinData) {\r\n $.ajax(SALauthUrl).then(function (authData) {\r\n loaderConfigSalETF.configuration.overrides.settings.shareClassId = isinData;\r\n loaderConfigSalETF.apiTokens.apiGatewayToken = authData.body;\r\n $('#SalContainer').data('$injector', '')\r\n morningstar.loader.load(loaderConfigSalETF).then(function() {\r\n $('#main-spinner').remove()\r\n }).catch(function (error) {\r\n console.log(error);\r\n });\r\n\r\n })\r\n } else {\r\n this.state.go('dashboard')\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface HoldingsScope extends ng.IScope {\r\n accounts: Array;\r\n selectedAccount: Account;\r\n selectedAccountTotals: SelectedAccountTotal;\r\n events: HoldingsCtrl;\r\n isLoading: boolean;\r\n isError: boolean;\r\n hasData: boolean;\r\n autoDownloadPDF: boolean;\r\n autoDownloaded: boolean;\r\n asAt: Date;\r\n\r\n reverse: boolean;\r\n predicate: string;\r\n intReverse: boolean;\r\n intPredicate: string;\r\n cashTablePredicate: string;\r\n cashTableSortOrder: boolean;\r\n hiReverse: boolean;\r\n hiPredicate: string;\r\n termDepositsPredicate: string;\r\n termDepositsSortOrder: boolean;\r\n\r\n termDepositsReport: TermDepositsHoldingsReport;\r\n cashHoldingsReport: CashHoldingsReport;\r\n highInterestCashHoldingsReport: CashHoldingsReport;\r\n equityHoldingsReport: EquityHoldingsReport;\r\n internationalHoldingsReport: EquityHoldingsReport;\r\n totalMarketValue: number;\r\n valuationReport: ValuationStatement;\r\n\r\n generatedDate: Date;\r\n timeZoneAEST: string;\r\n\r\n userCompany: UserCompany;\r\n\r\n filter: ng.IFilterService;\r\n\r\n }\r\n\r\n //export class HoldingsCtrl extends AbstractController {\r\n export class HoldingsCtrl extends PortfolioBaseCtrl {\r\n q: ng.IQService;\r\n scope: Patersons.HoldingsScope;\r\n portfolioService: Patersons.PortfolioService;\r\n reportService: Patersons.ReportService;\r\n reportDownloadService: Patersons.ReportDownloadService;\r\n stateParams: any;\r\n pdfBuilderService: Patersons.PDFBuilderService;\r\n selectionService: SelectionService;\r\n userCompanyService: Patersons.UserCompanyService;\r\n\r\n \r\n\r\n static $inject = ['$scope', '$q', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'reportService', 'reportDownloadService', 'navigationService', 'selectionService', 'pdfBuilderService','userCompanyService'];\r\n\r\n constructor($scope, $q, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, reportService, reportDownloadService, navigationService, selectionService, pdfBuilderService,userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.q = $q;\r\n this.stateParams = $stateParams;\r\n this.portfolioService = portfolioService;\r\n this.reportService = reportService;\r\n this.reportDownloadService = reportDownloadService;\r\n this.selectionService = selectionService;\r\n this.scope.accounts = new Array();\r\n this.scope.reverse = false;\r\n this.scope.predicate = \"securityCode\";\r\n this.scope.intPredicate = \"securityCode\";\r\n this.scope.intReverse = false;\r\n this.scope.filter = $filter;\r\n this.scope.asAt = moment().toDate();\r\n this.pdfBuilderService = pdfBuilderService;\r\n this.userCompanyService = userCompanyService;\r\n\r\n this.scope.cashTableSortOrder = false;\r\n this.scope.cashTablePredicate = \"instituteCode\";\r\n this.scope.hiPredicate = \"instituteCode\";\r\n this.scope.hiReverse = false;\r\n this.scope.termDepositsSortOrder = false;\r\n this.scope.termDepositsPredicate = \"provider\";\r\n this.scope.hasData = false;\r\n this.scope.isError = false;\r\n\r\n this.scope.generatedDate = new Date();\r\n\r\n this.userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n if(this.stateParams.accountId){\r\n this.selectionService.selectedAccountId = $stateParams.accountId;\r\n }\r\n if(this.stateParams.asAt){\r\n this.scope.asAt = moment(this.stateParams.asAt).toDate();\r\n }\r\n if(this.stateParams.autoDownloadPDF){\r\n this.scope.autoDownloadPDF = this.stateParams.autoDownloadPDF;\r\n }\r\n\r\n this.load();\r\n }\r\n\r\n checkAutoDownloadPDF(){\r\n if(this.stateParams && this.stateParams.autoDownloadPDF && !this.scope.autoDownloaded){\r\n this.downloadPdf()\r\n this.scope.autoDownloaded = true\r\n }\r\n }\r\n\r\n setAsAtDate(selectedDate: Date) {\r\n console.info('Selected As At Date: ' + selectedDate);\r\n this.scope.asAt = selectedDate;\r\n }\r\n\r\n setSelectedAccount(accountId: string) {\r\n console.info('Selected Account Id: ' + accountId);\r\n this.scope.hasData = false;\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n }\r\n\r\n getBackdatedHolding = function () {\r\n // if(this.scope.isLoading){\r\n // return;\r\n // }\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n let now = moment();\r\n let selectedDate = moment(this.scope.asAt);\r\n this.scope.generatedDate = new Date();\r\n\r\n if (selectedDate.isBefore(now, 'day')) {\r\n this.loadBackdatedHoldings();\r\n }\r\n else {\r\n this.buildReports();\r\n }\r\n }\r\n\r\n \r\n getSummaryText = function () {\r\n var text = \"Report generated at \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\r\n \" AEST on \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".
\" +\r\n \"Australian equity prices are delayed by 20 minutes. International equity prices are from the previous day's close.\";\r\n return text;\r\n }\r\n\r\n order = function (predicate) {\r\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\r\n this.scope.predicate = predicate;\r\n };\r\n\r\n orderInternational = function (predicate) {\r\n this.scope.intReverse = (this.scope.intPredicate === predicate) ? !this.scope.intReverse : false;\r\n this.scope.intPredicate = predicate;\r\n };\r\n\r\n orderHiCash = function (predicate) {\r\n this.scope.hiReverse = (this.scope.hiPredicate === predicate) ? !this.scope.hiReverse : false;\r\n this.scope.hiPredicate = predicate;\r\n };\r\n\r\n orderCash = function (predicate) {\r\n this.scope.cashTableSortOrder = (this.scope.cashTablePredicate === predicate) ? !this.scope.cashTableSortOrder : false;\r\n this.scope.cashTablePredicate = predicate;\r\n };\r\n\r\n orderTermDeposits = function (predicate) {\r\n this.scope.termDepositsSortOrder = (this.scope.termDepositsPredicate === predicate) ? !this.scope.termDepositsSortOrder : false;\r\n this.scope.termDepositsPredicate = predicate;\r\n };\r\n\r\n load() {\r\n this.scope.isLoading = true;\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result: Account[]) => {\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result;\r\n this.scope.isLoading = false;\r\n if((!this.selectionService || !this.selectionService.selectedAccountId) && result[0]){\r\n this.setSelectedAccount(result[0].accountId);\r\n this.getBackdatedHolding();\r\n }\r\n });\r\n })\r\n .catch((reason) => {\r\n this.scope.$apply(() => {\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n }\r\n\r\n loadBackdatedHoldings() {\r\n if (this.scope.selectedAccount.accountType == \"Standard\") {\r\n this.scope.isLoading = true;\r\n\r\n this.portfolioService.getBackdatedPortfolioData(this.scope.selectedAccount.accountId, this.scope.asAt)\r\n .then((result) => {\r\n this.scope.cashHoldingsReport = new CashHoldingsReport();\r\n this.scope.highInterestCashHoldingsReport = new CashHoldingsReport();\r\n this.scope.termDepositsReport = new TermDepositsHoldingsReport();\r\n\r\n let domesticHoldings = result.filter(h => !h.isInternational);\r\n this.scope.equityHoldingsReport = this.buildEquityHoldingsReport(domesticHoldings);\r\n\r\n let internationalHoldings = result.filter(h => h.isInternational);\r\n this.scope.internationalHoldingsReport = this.buildInternationalEquityHoldingsReport(internationalHoldings);\r\n\r\n this.scope.totalMarketValue = this.scope.equityHoldingsReport.total.marketValue + this.scope.internationalHoldingsReport.total.marketValue;\r\n this.scope.hasData = true;\r\n this.scope.isError = false;\r\n this.checkAutoDownloadPDF();\r\n },\r\n (error) => {\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n }).finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n else {\r\n this.loadAccoladeAccount();\r\n }\r\n }\r\n\r\n downloadPdf() {\r\n console.info('Download PDF');\r\n \r\n let asAtDate = this.scope.asAt;\r\n let account = this.scope.selectedAccount;\r\n let fileName = this.getFileName(account.accountId, asAtDate);\r\n if (this.scope.selectedAccount.accountType == \"Standard\") {\r\n this.makeAgilityPdf(account, asAtDate, fileName);\r\n } else {\r\n this.makeAccoladePdf(account, fileName,asAtDate);\r\n }\r\n }\r\n\r\n downloadCsv() {\r\n console.info('Download CSV');\r\n let asAtDate = this.scope.asAt;\r\n let account = this.scope.selectedAccount;\r\n let fileName = this.getFileName(account.accountId, asAtDate);\r\n\r\n if (this.scope.selectedAccount.accountType == \"Standard\") {\r\n this.makeCsv(account, fileName, asAtDate);\r\n } else {\r\n this.reportDownloadService.downloadCsvFile(this.scope.valuationReport, account)\r\n }\r\n }\r\n\r\n private makeCsv(account: Account, filename: string, endDate: Date): void {\r\n filename = filename + \".csv\";\r\n let topLine = ReportDownloadService.getCsvTopLine(account, new Date(), endDate, endDate, undefined);\r\n let csvBuilder = new CsvBuilder();\r\n\r\n let cashHoldings = this.scope.cashHoldingsReport;\r\n let highInterestCashHoldings = this.scope.highInterestCashHoldingsReport;\r\n let termDeposits = this.scope.termDepositsReport;\r\n let equityHoldings = this.scope.equityHoldingsReport;\r\n let internationalHoldings = this.scope.internationalHoldingsReport;\r\n let pricesQuotedAt = this.scope.selectedAccount.pricesQuotedAt;\r\n let totalMarketValue = this.scope.totalMarketValue;\r\n\r\n let formattedTermDeposits = this.getFormattedTermDeposits(termDeposits);\r\n let formattedCashHoldings = this.getFormattedCashHoldings(cashHoldings);\r\n let formattedHighInterestCashHoldings = this.getFormattedCashHoldings(highInterestCashHoldings);\r\n let formattedEquityHoldings = this.getFormattedHoldings(equityHoldings);\r\n let formattedInternationalHoldings = this.getFormattedHoldingsInternational(internationalHoldings);\r\n let allCSVData = [];\r\n\r\n\r\n // Term Deposits.\r\n if (formattedTermDeposits && formattedTermDeposits.length > 0) {\r\n allCSVData.push(this.getRowHeading(\"Term Deposits\"));\r\n allCSVData.push([\r\n \"MATURITY DATE\",\r\n \"INSTITUTION\",\r\n \"BALANCE\",\r\n \"RATE\",\r\n ]);\r\n formattedTermDeposits.forEach(x => {\r\n const data = [\r\n (x.maturityDate) ? x.maturityDate : \"\",\r\n (x.provider) ? x.provider : \"\",\r\n (x.balance) ? x.balance : \"\",\r\n (x.rate) ? x.rate : \"\",\r\n ]\r\n allCSVData.push(data);\r\n });\r\n }\r\n\r\n // Cash Accounts.\r\n if (formattedCashHoldings && formattedCashHoldings.length > 0) {\r\n allCSVData.push(this.getRowHeading(\"Cash Accounts\"));\r\n allCSVData.push([\r\n \"INSTITUTION\",\r\n \"ACCOUNT NAME\",\r\n \"BALANCE\",\r\n \"TYPE\",\r\n ]);\r\n formattedCashHoldings.forEach(x => {\r\n const data = [\r\n (x.instituteCode) ? x.instituteCode : \"\",\r\n (x.accountName) ? x.accountName : \"\",\r\n (x.balance) ? x.balance : \"\",\r\n (x.type) ? x.type : \"\",\r\n ]\r\n allCSVData.push(data);\r\n });\r\n }\r\n\r\n // High Interest Cash Holdings\r\n if (formattedHighInterestCashHoldings && formattedHighInterestCashHoldings.length > 0) {\r\n allCSVData.push(this.getRowHeading(\"High Interest Cash Accounts\"));\r\n allCSVData.push([\r\n \"INSTITUTION\",\r\n \"ACCOUNT NAME\",\r\n \"BALANCE\",\r\n \"RATE\",\r\n ]);\r\n\r\n formattedHighInterestCashHoldings.forEach(x => {\r\n const data = [\r\n (x.instituteCode) ? x.instituteCode : \"\",\r\n (x.accountName) ? x.accountName : \"\",\r\n (x.balance) ? x.balance : \"\",\r\n (x.interestRate) ? x.interestRate : \"\",\r\n ]\r\n allCSVData.push(data);\r\n });\r\n }\r\n\r\n // Australian Equities.\r\n if (formattedEquityHoldings && formattedEquityHoldings.length > 0) {\r\n allCSVData.push(this.getRowHeading(\"Australian Equities\"));\r\n allCSVData.push([\r\n \"CODE\",\r\n \"NAME\",\r\n \"QUANTITY\",\r\n \"AVERAGE COST\",\r\n \"MARKET PRICE\",\r\n \"TOTAL COST\",\r\n \"MARKET VALUE\",\r\n \"PROFIT (LOSS)\",\r\n \"Historic DPS **\",\r\n \"Historic Fr. Credits\",\r\n \"Historic Est. Income\",\r\n \"Historic YIELD\",\r\n ]);\r\n\r\n formattedEquityHoldings.forEach(x => {\r\n\r\n const data = [\r\n (x.securityCode) ? x.securityCode : \"\",\r\n (x.companyName) ? x.companyName : \"\",\r\n (x.quantity) ? x.quantity : \"\",\r\n (x.averageCost) ? x.averageCost : \"\",\r\n (x.lastPrice) ? x.lastPrice : \"\",\r\n (x.totalCost) ? x.totalCost : \"\",\r\n (x.marketValue) ? x.marketValue : \"\",\r\n (x.profitOrLoss) ? x.profitOrLoss : \"\",\r\n (x.dividendPerShare) ? x.dividendPerShare : \"\",\r\n (x.frankedAmount) ? x.frankedAmount : \"\",\r\n (x.income) ? x.income : \"\",\r\n (x.yield) ? x.yield : \"\",\r\n ]\r\n allCSVData.push(data);\r\n\r\n });\r\n }\r\n const internationalFields = this.getFieldsInternational()\r\n // International Holdings.\r\n if (formattedInternationalHoldings && formattedInternationalHoldings.length > 0) {\r\n allCSVData.push(this.getRowHeading(\"International Equities\"));\r\n allCSVData.push([\r\n \"CODE\",\r\n \"CURRENCY\",\r\n \"NAME\",\r\n \"QUANTITY\", \r\n \"NATIVE COST PRICE\", \r\n \"NATIVE TOTAL COST\", \r\n \"NATIVE MARKET PRICE\", \r\n \"NATIVE MARKET VALUE\", \r\n \"NATIVE PROFIT (LOSS)\", \r\n \"AUD MARKET VALUE\", \r\n ]);\r\n\r\n formattedInternationalHoldings.forEach(x => {\r\n const data = [\r\n (x.securityCode) ? x.securityCode : \"\",\r\n (x.currency) ? x.currency : \"\",\r\n (x.companyName) ? x.companyName : \"\",\r\n (x.quantity) ? x.quantity : \"\" ,\r\n (x.nativeCostPrice) ? x.nativeCostPrice : \"\" ,\r\n (x.nativeTotalCost) ? x.nativeTotalCost : \"\" ,\r\n (x.nativeMarketPrice) ? x.nativeMarketPrice : \"\" ,\r\n (x.nativeMarketValue) ? x.nativeMarketValue : \"\" ,\r\n (x.nativeProfitLoss) ? x.nativeProfitLoss : \"\" ,\r\n (x.marketValue) ? x.marketValue : \"\" ,\r\n ];\r\n allCSVData.push(data);\r\n });\r\n }\r\n\r\n // Grand Total\r\n allCSVData.push([\r\n \"Grand Total\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n \"\",\r\n totalMarketValue,\r\n ]);\r\n\r\n csvBuilder.setFilename(filename)\r\n .setTopLine(topLine)\r\n .setHeaders(this.getHeadings())\r\n .setData(allCSVData)\r\n .build();\r\n }\r\n\r\n private getRowHeading(title: string) {\r\n return [title]\r\n }\r\n\r\n\r\n private getHeadings(): string[] {\r\n return [];\r\n }\r\n\r\n private getAccoladeHeadings(): string[] {\r\n return [];\r\n }\r\n\r\n private getFileName(accountId: string, asAtDate: Date): string {\r\n var asAtDateStr = moment(asAtDate).format(\"YYYY-MM-DD\");\r\n return accountId + \"-Holdings-\" + asAtDateStr;\r\n }\r\n\r\n private makeAccoladePdf(account: Account, filename: string,asAtDate: Date): any {\r\n let reportData: ValuationStatement = this.scope.valuationReport;\r\n let asAt: string = moment(asAtDate).format(\"D MMM YYYY\");\r\n let generatedAt: string = moment.tz(reportData.creationDateUtc, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY');\r\n let pricesQuotedAt: string = moment.tz(this.scope.selectedAccount.pricesQuotedAt, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY');\r\n\r\n this.reportDownloadService.report = reportData;\r\n // Build a valuation statement (aka Accolade Holdings) PDF document definition using an empty content object.\r\n // We'll inject this document definition into our PDF builder in the next step.\r\n let docDefinition = this.reportDownloadService.getValuationStatement({ content: [] });\r\n this.pdfBuilderService.newPdfBuilderInstance().then((pdfBuilder) => {\r\n pdfBuilder\r\n .setTitle(reportData.title)\r\n .setSubTitle(this.scope.filter(\"accountName\")(account.designation ? account.accountName+' '+account.designation : account.accountName))\r\n .addHeaderTableRow('Adviser:',account.adviserName, '','')\r\n .addHeaderTableRow('Account:',account.accountId, '','')\r\n .addHeaderTableRow('Report Generated At:', generatedAt, 'As at:', asAt)\r\n .addHeading(this.getStandardDisclaimer())\r\n .setFilename(filename)\r\n .build(docDefinition.content);\r\n })\r\n }\r\n\r\n private makeAgilityPdf(account: Account, asAtDate: Date, filename: string): any {\r\n let nowDate = moment(new Date());\r\n let asAtDateStr = moment(asAtDate).format(\"D MMM YYYY\");\r\n let cashHoldings = this.scope.cashHoldingsReport;\r\n let highInterestCashHoldings = this.scope.highInterestCashHoldingsReport;\r\n let termDeposits = this.scope.termDepositsReport;\r\n let equityHoldings = this.scope.equityHoldingsReport;\r\n let internationalHoldings = this.scope.internationalHoldingsReport;\r\n let pricesQuotedAt = this.scope.selectedAccount.pricesQuotedAt;\r\n let totalMarketValue = this.scope.totalMarketValue;\r\n\r\n let formattedTermDeposits = this.getFormattedTermDeposits(termDeposits);\r\n let formattedCashHoldings = this.getFormattedCashHoldings(cashHoldings);\r\n let formattedHighInterestCashHoldings = this.getFormattedCashHoldings(highInterestCashHoldings);\r\n let formattedEquityHoldings = this.getFormattedHoldings(equityHoldings);\r\n let formattedInternationalHoldings = this.getFormattedHoldingsInternational(internationalHoldings);\r\n\r\n let lastRowIsTotal: boolean = true;\r\n this.pdfBuilderService.newPdfBuilderInstance().then((pdfBuilder) => {\r\n pdfBuilder\r\n .setTitle('Holdings')\r\n .setSubTitle(this.scope.filter(\"accountName\")(account.designation ? account.accountName+' '+account.designation : account.accountName))\r\n .addHeaderTableRow('Adviser:',account.adviserName, '','')\r\n .addHeaderTableRow('Account:',account.accountId, '','')\r\n .addHeaderTableRow('Report Generated At:', moment.tz(nowDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), 'As at:', asAtDateStr)\r\n .addHeading(this.getStandardDisclaimer())\r\n .addTableAligned(\r\n 'Australian Equities',\r\n formattedEquityHoldings,\r\n this.getHoldingsFields(),\r\n this.getHoldingsHeadingsAligned(),\r\n this.getHoldingsFormatHints(),\r\n lastRowIsTotal)\r\n .addTableAligned(\r\n 'International Equities',\r\n formattedInternationalHoldings,\r\n this.getInternationalHoldingsFields(),\r\n this.getInternationalHoldingsHeadingsAligned(),\r\n this.getInternationalHoldingsFormatHints(),\r\n lastRowIsTotal)\r\n .addTable(\r\n 'Cash Accounts',\r\n formattedCashHoldings,\r\n this.getCashHoldingsFields(),\r\n this.getCashHoldingsHeadings(),\r\n this.getCashHoldingsFormatHints(),\r\n lastRowIsTotal)\r\n .addTable(\r\n 'High Interest Cash Accounts',\r\n formattedHighInterestCashHoldings,\r\n this.getCashHoldingsFields(),\r\n this.getCashHoldingsHeadings(),\r\n this.getCashHoldingsFormatHints(),\r\n lastRowIsTotal)\r\n .addTable(\r\n 'Term Deposits',\r\n formattedTermDeposits,\r\n this.getTermDepositsFields(),\r\n this.getTermDepositsHeadings(),\r\n this.getTermDepositsFormatHints(),\r\n lastRowIsTotal)\r\n .addTable(\r\n 'Grand Total',\r\n [{ total: totalMarketValue }],\r\n ['total'],\r\n null,//['Total Market Value'],\r\n [PdfFormatHint.Currency],\r\n false)\r\n .setFilename(filename)\r\n .build();\r\n })\r\n }\r\n\r\n private getFormattedTermDeposits(data: TermDepositsHoldingsReport) {\r\n if (!data || !data.holdings) {\r\n return null;\r\n }\r\n var formattedData: TermDeposit[] = angular.copy(data.holdings);\r\n if (data.total && data.total.hasData()) {\r\n formattedData.push(angular.copy(data.total));\r\n }\r\n formattedData = formattedData.map((record) => {\r\n return {\r\n maturityDate: moment(record.maturityDate).format(\"DD/MM/YYYY\"),\r\n provider: record.provider,\r\n balance: record.balance,\r\n rate: record.rate\r\n };\r\n });\r\n return formattedData;\r\n }\r\n\r\n private getFormattedCashHoldings(data: CashHoldingsReport) {\r\n if (!data || !data.holdings) {\r\n return null;\r\n }\r\n var formattedData: CashHolding[] = angular.copy(data.holdings);\r\n if (data.total && data.total.hasData()) {\r\n formattedData.push(angular.copy(data.total));\r\n }\r\n formattedData = formattedData.map((record) => {\r\n return {\r\n instituteCode: record.instituteCode,\r\n accountName: record.accountName,\r\n balance: record.balance,\r\n type: record.type\r\n };\r\n });\r\n return formattedData;\r\n }\r\n\r\n private getFieldsInternational() {\r\n return [\r\n \"securityCode\",\r\n \"currency\",\r\n \"companyName\",\r\n \"quantity\", \r\n \"nativeCostPrice\", \r\n \"nativeTotalCost\", \r\n \"nativeMarketPrice\", \r\n \"nativeMarketValue\", \r\n \"nativeProfitLoss\", \r\n \"totalCost\", \r\n \"marketValue\", \r\n \"profitOrLoss\", \r\n ];\r\n }\r\n private getFields() {\r\n return [\r\n \"securityCode\",\r\n \"companyName\",\r\n \"quantity\",\r\n \"averageCost\",\r\n \"lastPrice\",\r\n \"totalCost\",\r\n \"marketValue\",\r\n \"profitOrLoss\",\r\n \"dividendPerShare\",\r\n \"frankedAmount\",\r\n \"income\",\r\n \"yield\"//,\r\n //\"priceToEarnings\"\r\n ];\r\n }\r\n\r\n private getAccoladeFields() {\r\n const result = [];\r\n if(this.scope.userCompany.enableFeature){\r\n const result = [\r\n \"code\",\r\n \"securityName\",\r\n \"quantity\",\r\n \"costPrice\",\r\n \"reducedCostBase\",\r\n \"marketPrice\",\r\n \"marketValue\",\r\n \"profitOrLoss\",\r\n \"pctAssets\",\r\n \"estIncome\",\r\n \"estFrankingCredits\",\r\n \"estGrossYield\"\r\n ];\r\n return result;\r\n }else{\r\n const result = [\r\n \"code\",\r\n \"securityName\",\r\n \"quantity\",\r\n \"costPrice\",\r\n \"reducedCostBase\",\r\n \"marketPrice\",\r\n \"marketValue\",\r\n \"profitOrLoss\",\r\n \"pctAssets\",\r\n ];\r\n return result;\r\n }\r\n \r\n }\r\n\r\n private getFormattedHoldingsInternational(data: EquityHoldingsReport) {\r\n if (!data || !data.holdings) {\r\n return null;\r\n }\r\n var formattedData: EquityHolding[] = angular.copy(data.holdings);\r\n if (data.total && data.total.hasData()) {\r\n formattedData.push(angular.copy(data.total));\r\n }\r\n formattedData = formattedData.map((record) => {\r\n return {\r\n securityCode: record.securityCode,\r\n currency: record.currency,\r\n companyName: record.companyName,\r\n quantity: record.quantity, \r\n nativeCostPrice: record.nativeCostPrice, \r\n nativeTotalCost: record.nativeTotalCost, \r\n nativeMarketPrice: record.nativeMarketPrice, \r\n nativeMarketValue: record.nativeMarketValue, \r\n nativeProfitLoss: record.nativeProfitLoss, \r\n totalCost: record.totalCost, \r\n marketValue: record.marketValue, \r\n profitOrLoss: record.profitOrLoss, \r\n\r\n };\r\n });\r\n return formattedData;\r\n }\r\n private getFormattedHoldings(data: EquityHoldingsReport) {\r\n if (!data || !data.holdings) {\r\n return null;\r\n }\r\n var formattedData: EquityHolding[] = angular.copy(data.holdings);\r\n if (data.total && data.total.hasData()) {\r\n formattedData.push(angular.copy(data.total));\r\n }\r\n formattedData = formattedData.map((record) => {\r\n return {\r\n securityCode: record.securityCode,\r\n companyName: record.companyName,\r\n quantity: record.quantity,\r\n averageCost: record.averageCost,\r\n lastPrice: record.lastPrice,\r\n totalCost: record.totalCost,\r\n marketValue: record.marketValue,\r\n profitOrLoss: record.profitOrLoss,\r\n dividendPerShare: record.dividendPerShare,\r\n frankedAmount: record.frankedAmount,\r\n income: record.income,\r\n \"yield\": record.yield,\r\n //priceToEarnings: record.priceToEarnings\r\n };\r\n });\r\n return formattedData;\r\n }\r\n private getTermDepositsFields() {\r\n return [\"maturityDate\", \"provider\", \"balance\", \"rate\"];\r\n }\r\n\r\n private getCashHoldingsFields() {\r\n return [\"instituteCode\", \"accountName\", \"balance\", \"type\"];\r\n }\r\n private getInternationalHoldingsFields() {\r\n return [\r\n \"securityCode\",\r\n \"currency\",\r\n \"companyName\",\r\n \"quantity\", \r\n \"nativeCostPrice\", \r\n \"nativeTotalCost\", \r\n \"nativeMarketPrice\", \r\n \"nativeMarketValue\", \r\n \"nativeProfitLoss\", \r\n \"marketValue\", \r\n ];\r\n }\r\n private getHoldingsFields() {\r\n return [\"securityCode\",\r\n \"companyName\",\r\n \"quantity\",\r\n \"averageCost\",\r\n \"lastPrice\",\r\n \"totalCost\",\r\n \"marketValue\",\r\n \"profitOrLoss\",\r\n \"dividendPerShare\",\r\n \"frankedAmount\",\r\n \"income\",\r\n \"yield\",\r\n /*\"priceToEarnings\"*/];\r\n }\r\n\r\n private getTermDepositsFormatHints() {\r\n return [\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.None\r\n ];\r\n }\r\n private getCashHoldingsFormatHints() {\r\n return [\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.None\r\n ];\r\n } \r\n private getInternationalHoldingsFormatHints() {\r\n return [\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.Currency4decPts,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency4decPts,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n ];\r\n }\r\n\r\n private getHoldingsFormatHints() {\r\n return [\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.Currency4decPts,\r\n PdfFormatHint.Currency4decPts,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency,\r\n PdfFormatHint.Currency\r\n ];\r\n }\r\n\r\n private getTermDepositsHeadings(): string[] {\r\n return [\"Maturity Date\", \"Institution\", \"Balance\", \"Rate\"];\r\n }\r\n\r\n private getCashHoldingsHeadings(): string[] {\r\n return [\"Institution\", \"Account Name\", \"Balance\", \"Type\"];\r\n }\r\n\r\n private getHoldingsHeadings(): string[] {\r\n return [\"Code\", \"Name\", \"Quantity\", \"Average Cost\",\r\n \"Market Price\", \"Total Cost\", \"Market Value\",\r\n \"Profit (Loss)\", \"Historic DPS**\", \"Historic Fr. Credits\", \"Historic Est. Income\",\r\n \"Yield\", /*\"PE\"*/];\r\n }\r\n\r\n private getInternationalHoldingsHeadingsAligned(): any[] {\r\n return [\r\n {text: \"Code\" ,type: \"string\"},\r\n {text: \"Currency\" ,type: \"string\"},\r\n {text: \"Name\" ,type: \"string\"},\r\n {text: \"Quantity\" ,type: \"number\"}, \r\n {text: \"Native Cost Price\" ,type: \"number\"}, \r\n {text: \"Native Total Cost\" ,type: \"number\"}, \r\n {text: \"Native Market Price\" ,type: \"number\"}, \r\n {text: \"Native Market Value\" ,type: \"number\"}, \r\n {text: \"Native Profit (Loss)\" ,type: \"number\"}, \r\n {text: \"AUD Market Value\" ,type: \"number\"}, \r\n ];\r\n }\r\n private getHoldingsHeadingsAligned(): any[] {\r\n return [\r\n {text: \"Code\", type: \"string\"},\r\n {text: \"Name\", type: \"string\"},\r\n {text: \"Quantity\", type: \"number\"},\r\n {text: \"Average Cost\", type: \"number\"},\r\n {text: \"Market Price\", type: \"number\"},\r\n {text: \"Total Cost\", type: \"number\"},\r\n {text: \"Market Value\", type: \"number\"},\r\n {text: \"Profit (Loss)\", type: \"number\"},\r\n {text: \"Historic DPS**\", type: \"number\"},\r\n {text: \"Historic Fr. Credits\", type: \"number\"},\r\n {text: \"Historic Est. Income\", type: \"number\"},\r\n {text: \"Historic Yield\", type: \"number\"},\r\n /*{text: \"PE\", type: \"number\"},*/ ];\r\n }\r\n\r\n getStandardDisclaimer() {\r\n return '* Australian Equity prices are delayed by 20 mins. International equity prices are the previous day\\'s closing price.';\r\n }\r\n\r\n buildReports() {\r\n if (this.scope.selectedAccount == undefined) {\r\n return;\r\n }\r\n\r\n this.scope.isLoading = true;\r\n\r\n if (this.scope.selectedAccount.accountType == \"Standard\") {\r\n this.loadStandardAccount();\r\n }\r\n else {\r\n this.loadAccoladeAccount()\r\n }\r\n }\r\n\r\n loadStandardAccount() {\r\n let cashAccountsPromise = this.portfolioService.getCashAccounts(this.scope.selectedAccount.accountId);\r\n cashAccountsPromise.then((result) => {\r\n this.scope.selectedAccount.cashDeposits = result;\r\n this.scope.cashHoldingsReport = this.buildCashHoldingReport(result);\r\n }, (error) => { // error handling\r\n this.scope.selectedAccount.cashDeposits = null;\r\n this.scope.cashHoldingsReport = null;\r\n });\r\n\r\n let highInterestCashPromise = this.portfolioService.getHighInterestCashAccounts(this.scope.selectedAccount.accountId);\r\n highInterestCashPromise.then((result) => {\r\n this.scope.highInterestCashHoldingsReport = this.buildCashHoldingReport(result);\r\n }, (error) => { // error handling\r\n this.scope.highInterestCashHoldingsReport = null;\r\n });\r\n\r\n let termDepositPromise = this.portfolioService.getTermDeposits(this.scope.selectedAccount.accountId);\r\n termDepositPromise.then((result) => {\r\n this.scope.selectedAccount.termDeposits = result;\r\n this.scope.termDepositsReport = this.buildTermDepositsReport(this.scope.selectedAccount);\r\n }, (error) => { // error handling\r\n this.scope.selectedAccount.termDeposits = null;\r\n this.scope.termDepositsReport = null;\r\n });\r\n\r\n let internationalSharesPromise = this.portfolioService.getInternationalSharesForHoldings(this.scope.selectedAccount);\r\n internationalSharesPromise.then((result) => {\r\n this.scope.internationalHoldingsReport = this.buildInternationalEquityHoldingsReport(result);\r\n }, (error) => { // error handling\r\n this.scope.internationalHoldingsReport = null;\r\n });\r\n\r\n let sharesPromise = this.portfolioService.getShares(this.scope.selectedAccount.accountId);\r\n sharesPromise.then((result) => {\r\n this.scope.selectedAccount.holdings = result;\r\n this.scope.equityHoldingsReport = this.buildEquityHoldingsReport(this.scope.selectedAccount.holdings);\r\n if (this.scope.selectedAccount.holdings[0]) {\r\n this.scope.selectedAccount.pricesQuotedAt = this.scope.selectedAccount.holdings[0].asOf;\r\n }\r\n }, (error) => { // error handling\r\n this.scope.selectedAccount.holdings = null;\r\n this.scope.equityHoldingsReport = null;\r\n });\r\n\r\n \r\n let allPromises = this.q.all([\r\n cashAccountsPromise,\r\n highInterestCashPromise,\r\n termDepositPromise,\r\n internationalSharesPromise,\r\n sharesPromise]);\r\n allPromises.then(() => {\r\n this.scope.totalMarketValue = this.scope.equityHoldingsReport.total.marketValue + this.scope.internationalHoldingsReport.total.marketValue + this.scope.cashHoldingsReport.total.balance + this.scope.termDepositsReport.total.balance;\r\n }, (error) => { // error handling\r\n this.scope.totalMarketValue = null;\r\n });\r\n allPromises.finally(() => {\r\n this.scope.isLoading = false;\r\n this.scope.hasData = true;\r\n this.checkAutoDownloadPDF();\r\n });\r\n }\r\n\r\n loadAccoladeAccount() {\r\n this.scope.isLoading = true;\r\n this.reportService.getReport(ReportType.Valuation, this.scope.selectedAccount.accountId, this.scope.asAt, this.scope.asAt)\r\n .then((result) => {\r\n this.scope.selectedAccount.pricesQuotedAt = this.scope.asAt;\r\n this.scope.valuationReport = result as ValuationStatement;\r\n this.scope.hasData = true;\r\n this.scope.isError = false;\r\n this.checkAutoDownloadPDF();\r\n },\r\n (error) => {\r\n // error handling\r\n this.scope.selectedAccount.pricesQuotedAt = this.scope.asAt;\r\n this.scope.valuationReport = null;\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n }).finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n buildCashHoldingReport(cashDeposits: CashDeposit[]) {\r\n\r\n var report = new CashHoldingsReport();\r\n var holdings = new Array();\r\n var total = new CashHolding();\r\n\r\n total.balance = 0;\r\n\r\n for (var i = 0; i < cashDeposits.length; i++) {\r\n var cashDeposit = cashDeposits[i];\r\n var rec = new CashHolding();\r\n\r\n rec.instituteCode = cashDeposit.instituteCode;\r\n rec.accountName = cashDeposit.accountName;\r\n rec.balance = cashDeposit.balance;\r\n rec.type = cashDeposit.type;\r\n rec.interestRate = cashDeposit.interestRate\r\n\r\n holdings.push(rec);\r\n\r\n total.balance += cashDeposit.balance;\r\n }\r\n\r\n report.holdings = holdings;\r\n report.total = total;\r\n return report;\r\n }\r\n\r\n buildEquityHoldingsReport(inputHoldings: Holding[]) {\r\n var report = new EquityHoldingsReport();\r\n var holdings = new Array();\r\n var total = new EquityHolding();\r\n\r\n\r\n total.totalCost = 0;\r\n total.marketValue = 0;\r\n total.profitOrLoss = 0;\r\n total.income = 0;\r\n\r\n for (var i = 0; i < inputHoldings.length; i++) {\r\n var holding = inputHoldings[i];\r\n\r\n if (!holding.isInternational) {\r\n var rec = new EquityHolding();\r\n rec.exchange = holding.exchange;\r\n rec.securityCode = holding.securityCode;\r\n rec.companyName = holding.companyName;\r\n rec.quantity = holding.quantity;\r\n rec.averageCost = holding.averageCost;\r\n rec.lastPrice = holding.lastPrice;\r\n rec.totalCost = holding.totalCost;\r\n rec.marketValue = holding.marketValue;\r\n rec.profitOrLoss = holding.profitOrLoss;\r\n rec.dividendPerShare = holding.dividendPerShare;\r\n rec.frankedAmount = holding.frankedAmount;\r\n rec.income = holding.income;\r\n rec.yield = holding.yield;\r\n //rec.priceToEarnings = holding.priceToEarnings;\r\n\r\n holdings.push(rec);\r\n\r\n total.totalCost += holding.totalCost;\r\n total.marketValue += holding.marketValue;\r\n total.profitOrLoss += holding.profitOrLoss;\r\n total.income += holding.income;\r\n }\r\n }\r\n\r\n report.holdings = holdings;\r\n report.total = total;\r\n\r\n return report;\r\n }\r\n\r\n buildInternationalEquityHoldingsReport(intHoldings: Holding[]) {\r\n var report = new EquityHoldingsReport();\r\n var holdings = new Array();\r\n var total = new EquityHolding();\r\n\r\n\r\n total.totalCost = 0;\r\n total.marketValue = 0;\r\n total.profitOrLoss = 0;\r\n total.income = 0;\r\n total.nativeTotalCost = 0;\r\n total.nativeMarketValue = 0;\r\n total.nativeProfitLoss = 0;\r\n\r\n for (var i = 0; i < intHoldings.length; i++) {\r\n var holding = intHoldings[i];\r\n\r\n var rec = new EquityHolding();\r\n rec.exchange = holding.exchange;\r\n rec.securityCode = holding.securityCode;\r\n rec.companyName = holding.companyName;\r\n rec.quantity = holding.quantity;\r\n rec.averageCost = holding.averageCost;\r\n rec.lastPrice = holding.lastPrice;\r\n rec.totalCost = holding.totalCost;\r\n rec.marketValue = holding.marketValue;\r\n rec.profitOrLoss = holding.profitOrLoss;\r\n rec.dividendPerShare = holding.dividendPerShare;\r\n rec.frankedAmount = holding.frankedAmount;\r\n rec.income = holding.income;\r\n rec.yield = holding.yield;\r\n\r\n rec.currency = holding.currency;\r\n rec.nativeCostPrice = holding.nativeCostPrice;\r\n rec.nativeTotalCost = holding.nativeTotalCost;\r\n rec.nativeMarketPrice = holding.nativeMarketPrice;\r\n rec.nativeMarketValue = holding.nativeMarketValue;\r\n rec.nativeProfitLoss = holding.nativeProfitLoss;\r\n //rec.priceToEarnings = holding.priceToEarnings;\r\n\r\n holdings.push(rec);\r\n\r\n total.totalCost += holding.totalCost;\r\n total.nativeTotalCost += holding.nativeTotalCost;\r\n total.nativeMarketValue += holding.nativeMarketValue;\r\n total.nativeProfitLoss += holding.nativeProfitLoss;\r\n total.marketValue += holding.marketValue;\r\n total.profitOrLoss += holding.profitOrLoss;\r\n total.income += holding.income;\r\n\r\n }\r\n\r\n report.holdings = holdings;\r\n report.total = total;\r\n\r\n return report;\r\n }\r\n\r\n buildTermDepositsReport(account: Account) {\r\n\r\n var report = new TermDepositsHoldingsReport();\r\n var holdings = new Array();\r\n var total = new TermDeposit();\r\n\r\n total.balance = 0;\r\n\r\n for (var i = 0; i < account.termDeposits.length; i++) {\r\n var termDeposit = account.termDeposits[i];\r\n var rec = new TermDeposit();\r\n\r\n rec.accountCode = termDeposit.accountCode;\r\n rec.balance = termDeposit.balance;\r\n rec.maturityDate = termDeposit.maturityDate;\r\n rec.provider = termDeposit.provider;\r\n rec.rate = termDeposit.rate;\r\n\r\n holdings.push(rec);\r\n\r\n total.balance += termDeposit.balance;\r\n }\r\n\r\n report.holdings = holdings;\r\n report.total = total;\r\n return report;\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n // NOTE: In the UI templates, these are referred to as 'Contract Notes'.\r\n export interface ConfirmationNotesScope extends ng.IScope {\r\n accounts: Array;\r\n selectedAccount: Account;\r\n selectedAccountTotals: SelectedAccountTotal;\r\n events: ConfirmationNotesCtrl;\r\n generatedDate: Date;\r\n reportError: string;\r\n isLoading: boolean;\r\n isSelected: boolean;\r\n isSelectAll: boolean;\r\n reverse: boolean;\r\n predicate: string;\r\n startDate: Date;\r\n endDate: Date;\r\n checkedItems: Array;\r\n filter: ng.IFilterService;\r\n isDownloadReady: boolean;\r\n isDownloading: boolean;\r\n hasData: boolean;\r\n isError: boolean;\r\n }\r\n\r\n //export class ConfirmationNotesCtrl extends AbstractController {\r\n export class ConfirmationNotesCtrl extends PortfolioBaseCtrl {\r\n q: ng.IQService;\r\n state: angular.ui.IStateService;\r\n http: ng.IHttpService;\r\n scope: Patersons.ConfirmationNotesScope;\r\n portfolioService: Patersons.PortfolioService;\r\n bulkDownloadService: Patersons.BulkDownloadService;\r\n pdfBuilderService: Patersons.PDFBuilderService;\r\n static $inject = ['$q', '$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService', 'bulkDownloadService','navigationService', 'pdfBuilderService'];\r\n\r\n constructor($q, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, bulkDownloadService, navigationService, pdfBuilderService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.q = $q;\r\n this.state = $state;\r\n this.http = $http;\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.scope.filter = $filter;\r\n this.portfolioService = portfolioService;\r\n this.bulkDownloadService = bulkDownloadService;\r\n this.pdfBuilderService = pdfBuilderService;\r\n this.scope.accounts = new Array();\r\n this.scope.reverse = true;\r\n this.scope.predicate = \"conDate\";\r\n this.scope.isSelectAll = false;\r\n\r\n this.scope.endDate = moment().toDate();\r\n this.scope.startDate = moment().subtract(30, 'days').toDate();\r\n\r\n this.scope.generatedDate = new Date();\r\n this.scope.hasData = false;\r\n this.scope.isError = false;\r\n\r\n this.load();\r\n }\r\n\r\n\r\n order = function (predicate) {\r\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\r\n this.scope.predicate = predicate;\r\n };\r\n\r\n hasNotesInRange(): boolean {\r\n let start: moment.Moment = moment(this.scope.startDate);\r\n let end: moment.Moment = moment(this.scope.endDate);\r\n\r\n return this.scope.selectedAccount &&\r\n this.scope.selectedAccount.confirmationNotes &&\r\n this.scope.selectedAccount.confirmationNotes.some(m => moment(m.conDate).isBetween(start, end, 'days', '[]'));\r\n }\r\n\r\n selectAll(e) {\r\n e.stopPropagation();\r\n this.scope.isSelectAll = !this.scope.isSelectAll;\r\n var selectAll = this.scope.isSelectAll;\r\n console.log(\"Selected : \" + selectAll);\r\n var log = [];\r\n\r\n let selectableContractNotes = this.scope.selectedAccount.confirmationNotes.filter(x => x.uri !== null);\r\n\r\n angular.forEach(selectableContractNotes, function (cn, key) {\r\n cn.isSelected = selectAll;\r\n console.log(\"Set : \" + cn.isSelected);\r\n });\r\n\r\n if (selectAll === true) {\r\n this.scope.checkedItems = selectableContractNotes;\r\n } else {\r\n this.scope.checkedItems = [];\r\n }\r\n };\r\n\r\n isDownloadButtonDisabled() {\r\n return this.scope.checkedItems == undefined || this.scope.checkedItems.length <= 0;\r\n }\r\n\r\n toggleSelection(item, e) {\r\n e.stopPropagation();\r\n if (this.scope.checkedItems == undefined) {\r\n this.scope.checkedItems = [];\r\n }\r\n var idx = this.scope.checkedItems.indexOf(item);\r\n\r\n if (idx > -1) {\r\n this.scope.checkedItems.splice(idx, 1);\r\n }\r\n else {\r\n this.scope.checkedItems.push(item);\r\n }\r\n };\r\n\r\n load() {\r\n this.scope.isLoading = true;\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result) => {\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result;\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n }\r\n\r\n loadConfirmationNotes(accountId: string, startDate: Date, endDate: Date) {\r\n\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n this.scope.startDate = startDate;\r\n this.scope.endDate = endDate;\r\n this.scope.generatedDate = new Date();\r\n\r\n this.scope.isLoading = true;\r\n this.scope.isDownloadReady = false;\r\n\r\n this.scope.hasData = false;\r\n this.scope.isError = false;\r\n\r\n this.portfolioService.getContractNotes(this.scope.selectedAccount.accountId, startDate, endDate)\r\n .then((result) => {\r\n this.scope.selectedAccount.confirmationNotes = result;\r\n this.scope.isDownloadReady = true;\r\n this.scope.hasData = true;\r\n this.scope.isError = false;\r\n },\r\n (reason) => {\r\n this.scope.reportError = reason.data.message;\r\n this.scope.hasData = false;\r\n this.scope.isError = true;\r\n })\r\n .finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n downloadPdf() {\r\n console.info('Download PDF');\r\n let account = this.scope.selectedAccount;\r\n let startDate = this.scope.startDate;\r\n let endDate = this.scope.endDate;\r\n let fileName = this.getFileName(account.accountId, startDate, endDate);\r\n let filteredData = account.confirmationNotes;\r\n let sortedData = this.orderBy(filteredData, this.scope.predicate, this.scope.reverse);\r\n\r\n this.makePdf(sortedData, account, startDate, endDate, fileName + \".pdf\");\r\n }\r\n\r\n downloadCsv() {\r\n console.info('Download CSV');\r\n let account = this.scope.selectedAccount;\r\n let startDate = this.scope.startDate;\r\n let endDate = this.scope.endDate;\r\n let fileName = this.getFileName(account.accountId, startDate, endDate);\r\n let filteredData = account.confirmationNotes;\r\n let sortedData = this.orderBy(filteredData, this.scope.predicate, this.scope.reverse);\r\n\r\n this.makeCsv(sortedData, account, startDate, endDate, fileName);\r\n }\r\n\r\n downloadContractNote(item: ConfirmationNote, e: ng.IAngularEvent) {\r\n this.http.get(item.uri, { headers: { 'Accept': 'application/pdf' }, responseType: 'arraybuffer'})\r\n .then((response) => {\r\n var blob = new Blob([response.data], { type: 'application/pdf' });\r\n\r\n if (window.navigator && window.navigator.msSaveOrOpenBlob) {\r\n // Open BLOB in IE and Edge\r\n window.navigator.msSaveOrOpenBlob(blob, item.prettyFileName);\r\n }\r\n else {\r\n // Open BLOB in Chrome, Firefox etc.\r\n var downloadLink = document.createElement('a');\r\n downloadLink.href = window.URL.createObjectURL(blob);\r\n downloadLink.target = '_blank';\r\n downloadLink.setAttribute('download', item.prettyFileName);\r\n\r\n document.body.appendChild(downloadLink);\r\n downloadLink.click();\r\n downloadLink.remove();\r\n }\r\n },\r\n (reason) => {\r\n if (reason.status === 403) {\r\n this.state.go('forbidden');\r\n }\r\n\r\n throw reason;\r\n });\r\n }\r\n\r\n download() {\r\n if (this.scope.checkedItems == undefined || this.scope.checkedItems.length <= 0) {\r\n return null;\r\n }\r\n\r\n this.scope.isDownloading = true;\r\n let filename = this.scope.selectedAccount.accountId + \"-\" + moment(new Date()).format(\"YYYY-MM-DD\") + \".zip\";\r\n this.bulkDownloadService.downloadItems(this.scope.checkedItems, filename)\r\n .finally(() => {\r\n this.scope.isDownloading = false;\r\n });\r\n }\r\n\r\n getSummaryText = function() {\r\n var text = \"Report generated at \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\r\n \" AEST on \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".\";\r\n return text;\r\n }\r\n\r\n private orderBy(notes: ConfirmationNote[], predicate: string, reverse: boolean): Array {\r\n return this.scope.filter('orderBy')(notes, predicate, reverse);\r\n }\r\n\r\n private makePdf(notes: ConfirmationNote[], account: Account, startDate: Date, endDate: Date, filename: string): any {\r\n filename = filename + \".pdf\";\r\n let nowDate = moment(new Date());\r\n let formattedData = this.getFormattedData(notes);\r\n let startDateStr = moment(startDate).format(\"D MMM YYYY\");\r\n let endDateStr = moment(endDate).format(\"D MMM YYYY\");\r\n\r\n let generatedAt: string = moment.tz(nowDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY');\r\n this.pdfBuilderService.newPdfBuilderInstance().then((pdfBuilder) => {\r\n pdfBuilder.setTitle('Contract Notes')\r\n .setSubTitle(this.scope.filter(\"accountName\")(account.designation ? account.accountName+' '+account.designation : account.accountName))\r\n .addHeaderTableRow('Adviser:',account.adviserName, '','')\r\n .addHeaderTableRow('Account:',account.accountId, '','')\r\n .addHeaderTableRow('From:', startDateStr, '','')\r\n .addHeaderTableRow('To:', endDateStr, '','')\r\n .addHeaderTableRow('Report Generated At:', generatedAt, '', '')\r\n .addTable('Contract Notes', formattedData, this.getFields(), this.getHeadings(), this.getFormatHints())\r\n .setFilename(filename)\r\n .build();\r\n })\r\n }\r\n\r\n private makeCsv(notes: ConfirmationNote[], account: Account, startDate: Date, endDate: Date, filename: string): void {\r\n filename = filename + \".csv\";\r\n let formattedData = this.getFormattedDataCsv(notes);\r\n let topLine = ReportDownloadService.getCsvTopLine(account, new Date(), startDate, endDate, undefined);\r\n let csvBuilder = new CsvBuilder();\r\n csvBuilder.setFilename(filename)\r\n .setTopLine(topLine)\r\n .setHeaders(this.getHeadings())\r\n .setData(formattedData)\r\n .build();\r\n }\r\n\r\n private getFormattedDataCsv(data: ConfirmationNote[]) {\r\n var formattedData = angular.copy(data);\r\n formattedData = formattedData.map((note) => {\r\n const fields = this.getFields()\r\n const data = {\r\n conNumber: note.conNumber,\r\n conDate: moment(note.conDate).format(\"DD/MM/YYYY\"),\r\n securityCode: note.securityCode,\r\n securityDescription: note.securityDescription,\r\n type: note.type,\r\n units: note.units,\r\n currencyCode: note.currencyCode,\r\n nett: note.nett\r\n };\r\n return fields.map(field => data[field])\r\n });\r\n\r\n return formattedData;\r\n }\r\n private getFormattedData(data: ConfirmationNote[]) {\r\n var formattedData = angular.copy(data);\r\n formattedData = formattedData.map((note) => {\r\n return {\r\n conNumber: note.conNumber,\r\n conDate: moment(note.conDate).format(\"DD/MM/YYYY\"),\r\n securityCode: note.securityCode,\r\n securityDescription: note.securityDescription,\r\n type: note.type,\r\n units: note.units,\r\n currencyCode: note.currencyCode,\r\n nett: note.nett\r\n };\r\n });\r\n\r\n return formattedData;\r\n }\r\n\r\n private getFileName(accountId: string, startDate: Date, endDate: Date): string {\r\n var startDateStr = moment(startDate).format(\"YYYY-MM-DD\");\r\n var endDateStr = moment(endDate).format(\"YYYY-MM-DD\");\r\n return accountId + \"-ContractNotes-\" + startDateStr + \"_\" + endDateStr;\r\n }\r\n\r\n private getFields() {\r\n return [\"conDate\", \"conNumber\", \"type\", \"units\", \"securityCode\", \"securityDescription\", \"currencyCode\", \"nett\"];\r\n }\r\n\r\n private getFormatHints() {\r\n return [\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.None,\r\n PdfFormatHint.Currency\r\n ];\r\n }\r\n\r\n private getHeadings(): string[] {\r\n return [\"Date\", \"Number\", \"Type\", \"Units\", \"Security Code\", \"Description\", \"Currency\", \"Nett\"];\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\ndeclare var pdfMake: any;\r\n\r\nmodule Patersons {\r\n\r\n export interface MarketOrdersScope extends ng.IScope {\r\n accounts: Array;\r\n selectedAccount: Account;\r\n selectedAccountTotals: SelectedAccountTotal;\r\n events: MarketOrdersCtrl;\r\n isLoading: boolean;\r\n reportError: string;\r\n startDate: Date;\r\n endDate: Date;\r\n generatedDate: Date;\r\n reverse: boolean;\r\n predicate: string;\r\n filename: string;\r\n csvData: Array;\r\n filter: any;\r\n isDownloadReady: boolean;\r\n isError: boolean;\r\n hasData: boolean;\r\n }\r\n\r\n //export class MarketOrdersCtrl extends AbstractController {\r\n export class MarketOrdersCtrl extends PortfolioBaseCtrl {\r\n scope: Patersons.MarketOrdersScope;\r\n portfolioService: Patersons.PortfolioService;\r\n pdfBuilderService: Patersons.PDFBuilderService;\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$filter', 'portfolioService','navigationService', 'pdfBuilderService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $filter, portfolioService, navigationService, pdfBuilderService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.filter = $filter;\r\n this.scope.events = this;\r\n this.portfolioService = portfolioService;\r\n this.scope.accounts = new Array();\r\n this.scope.reverse = true;\r\n this.scope.predicate = \"orderDate\";\r\n this.pdfBuilderService = pdfBuilderService\r\n\r\n this.scope.endDate = moment().toDate();\r\n this.scope.startDate = moment().subtract(30, 'days').toDate();\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n\r\n this.scope.csvData = [];\r\n this.load();\r\n }\r\n\r\n order(predicate) {\r\n this.scope.reverse = (this.scope.predicate === predicate) ? !this.scope.reverse : false;\r\n this.scope.predicate = predicate;\r\n }\r\n\r\n hasOrdersInRange(): boolean {\r\n let start: moment.Moment = moment(this.scope.startDate);\r\n let end: moment.Moment = moment(this.scope.endDate);\r\n\r\n return this.scope.selectedAccount &&\r\n this.scope.selectedAccount.marketOrders &&\r\n this.scope.selectedAccount.marketOrders.some(m => moment(m.orderDate).isBetween(start, end, 'days', '[]'));\r\n }\r\n\r\n buildTableBody(data, columns, headers) {\r\n var body = [];\r\n body.push(headers);\r\n data.forEach(row => {\r\n var dataRow = [];\r\n columns.forEach(column => {\r\n dataRow.push(row[column].toString());\r\n });\r\n body.push(dataRow);\r\n });\r\n return body;\r\n }\r\n\r\n table(data, columns, headers) {\r\n return {\r\n table: {\r\n headerRows: 1,\r\n body: this.buildTableBody(data, columns, headers)\r\n }\r\n };\r\n }\r\n\r\n downloadCsv() {\r\n console.info('Download CSV');\r\n let account = this.scope.selectedAccount;\r\n let startDate = this.scope.startDate;\r\n let endDate = this.scope.endDate;\r\n let fileName = this.getFileName();\r\n\r\n this.makeCsv(fileName);\r\n }\r\n\r\n private makeCsv(filename: string): void {\r\n let account = this.scope.selectedAccount;\r\n let startDate = this.scope.startDate;\r\n let endDate = this.scope.endDate;\r\n let topLine = ReportDownloadService.getCsvTopLine(account, new Date(), startDate, endDate, undefined);\r\n let csvBuilder = new CsvBuilder();\r\n csvBuilder.setFilename(filename)\r\n .setTopLine(topLine)\r\n .setHeaders(this.getHeadings())\r\n .setData(this.getFormattedData())\r\n .build();\r\n }\r\n\r\n private getFields() {\r\n return [\"orderDate\", \"orderNumber\", \"orderStatus\", \"type\", \"quantity\", \"securityCode\", \"securityDescription\", \"limit\", \"quantityMatched\", \"quantityAllocated\", \"unfilled\"];\r\n }\r\n\r\n private getHeadings(): string[] {\r\n return [\"Date\", \"Order Number\", \"Status\", \"Type\", \"Units\", \"Security Code\", \"Description\", \"Limit\", \"Matched\", \"Allocated\", \"Unbooked\"];\r\n }\r\n\r\n private makeOrdersPdf(account: Account, filename: string): any {\r\n let rawData = this.scope.selectedAccount.marketOrders;\r\n var data = this.getFormattedDataPdf(rawData);\r\n let asAtDateStr = moment(new Date()).format(\"D MMM YYYY\");\r\n var startDate = moment(this.scope.startDate).format(\"D MMM YYYY\");\r\n var endDate = moment(this.scope.endDate).format(\"D MMM YYYY\");\r\n let timestamp = moment.tz(this.scope.generatedDate, 'Australia/Sydney').format(\"h:mm AEST a [on] D MMM YYYY\");\r\n\r\n this.pdfBuilderService.newPdfBuilderInstance().then((pdfBuilder) => {\r\n pdfBuilder\r\n .setTitle('Market Orders')\r\n .addHeaderTableRow('Adviser:',account.adviserName, '','')\r\n .addHeaderTableRow('Account:',account.accountId, '','')\r\n .addHeaderTableRow('From Date:', moment.tz(startDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), '', '')\r\n .addHeaderTableRow('To Date:', moment.tz(endDate, 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), '', '')\r\n .addHeaderTableRow('Report Generated at:', moment.tz(new Date(), 'Australia/Sydney').format('h:mm a [AEST on] D MMM YYYY'), '', '')\r\n .addTable(\r\n 'Market Orders',\r\n data,\r\n this.getRawHeader(),\r\n this.getPdfHeader(),\r\n null,\r\n false)\r\n .setFilename(filename)\r\n .build();\r\n }) \r\n \r\n\r\n }\r\n\r\n downloadPdf() {\r\n console.info('Download PDF');\r\n let fileName = this.getFileName();\r\n this.makeOrdersPdf(this.scope.selectedAccount, fileName);\r\n }\r\n\r\n getRawHeader() {\r\n return [\"orderDate\", \"orderNumber\", \"orderStatus\", \"type\", \"quantity\", \"securityCode\", \"securityDescription\", \"limit\", \"quantityMatched\", \"quantityAllocated\", \"unfilled\"];//, \"accountNumber\", \"adviserCode\", \"reportTitle\", \"dateRangeSelected\"];\r\n }\r\n\r\n getPdfHeader() {\r\n /*return [\r\n { text: \"Date\", style: \"tableHeader\" },\r\n { text: \"Order Number\", style: \"tableHeader\" },\r\n { text: \"Status\", style: \"tableHeader\" },\r\n { text: \"Type\", style: \"tableHeader\" },\r\n { text: \"Units\", style: \"tableHeader\" },\r\n { text: \"Security Code\", style: \"tableHeader\" },\r\n { text: \"Description\", style: \"tableHeader\" },\r\n { text: \"Limit\", style: \"tableHeader\" },\r\n { text: \"Matched\", style: \"tableHeader\" },\r\n { text: \"Allocated\", style: \"tableHeader\" },\r\n { text: \"Unbooked\", style: \"tableHeader\" }\r\n ];*/\r\n return [\r\n \"Date\",\r\n \"Order Number\",\r\n \"Status\",\r\n \"Type\",\r\n \"Units\",\r\n \"Security Code\",\r\n \"Description\",\r\n \"Limit\",\r\n \"Matched\",\r\n \"Allocated\",\r\n \"Unbooked\"\r\n ];\r\n }\r\n\r\n getFileName() {\r\n var accountId = this.scope.selectedAccount.accountId;\r\n var startDate = moment(this.scope.startDate).format(\"YYYY-MM-DD\");\r\n var endDate = moment(this.scope.endDate).format(\"YYYY-MM-DD\");\r\n return accountId + \"-MarketOrders-\" + startDate + \"_\" + endDate;\r\n }\r\n\r\n getSummaryText = function() {\r\n var text = \"Report generated at \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\r\n \" AEST on \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".\";\r\n return text;\r\n }\r\n\r\n getFormattedDataPdf(data) {\r\n var startDate = this.scope.startDate;\r\n var endDate = this.scope.endDate;\r\n var filtered = this.scope.filter('dateFilter')(data, 'orderDate', startDate, endDate);\r\n var pdfData = angular.copy(filtered);\r\n pdfData.map((order) => {\r\n delete order.id;\r\n delete order.investorPortfolioId;\r\n order.orderDate = moment(order.orderDate).format(\"DD-MM-YYYY\");\r\n });\r\n return pdfData;\r\n }\r\n getFormattedData() {\r\n let data = this.scope.selectedAccount.marketOrders;\r\n var accountId = this.scope.selectedAccount.accountId;\r\n var accountName = this.scope.filter(\"accountName\")(this.scope.selectedAccount.designation ? this.scope.selectedAccount.accountName+ ' '+ this.scope.selectedAccount.designation : this.scope.selectedAccount.accountName)\r\n var adviserCode = this.scope.selectedAccount.adviserCode;\r\n var startDate = this.scope.startDate;\r\n var endDate = this.scope.endDate;\r\n this.scope.filename = this.getFileName();\r\n var filtered = this.scope.filter('dateFilter')(data, 'orderDate', startDate, endDate);\r\n var csvData = angular.copy(filtered);\r\n const fields = this.getFields();\r\n csvData.map((order) => {\r\n delete order.id;\r\n delete order.investorPortfolioId;\r\n order.orderDate = moment(order.orderDate).format(\"YYYY-MM-DD\");\r\n order.accountNumber = accountId;\r\n order.adviserCode = adviserCode;\r\n order.reportTitle = \"Market Orders for \" + accountName;\r\n order.dateRangeSelected = startDate + \" to \" + endDate;\r\n return fields.map(field => order[field])\r\n });\r\n return csvData;\r\n }\r\n\r\n load() {\r\n this.scope.isLoading = true;\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result) => {\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result;\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n }\r\n\r\n loadMarketOrders(accountId: string, startDate: Date, endDate: Date) {\r\n\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n this.scope.startDate = startDate;\r\n this.scope.endDate = endDate;\r\n this.scope.generatedDate = new Date();\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n\r\n // Ensure the date range is inclusive\r\n this.scope.startDate.setHours(0, 0, 0, 0);\r\n this.scope.endDate.setHours(23, 59, 59, 0);\r\n\r\n this.scope.isLoading = true;\r\n this.scope.isDownloadReady = false;\r\n this.portfolioService.getMarketOrders(this.scope.selectedAccount.accountId)\r\n .then((result) => {\r\n this.scope.selectedAccount.marketOrders = result;\r\n this.scope.isDownloadReady = true;\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n },\r\n (reason) => { // error handling\r\n //this.scope.reportError = reason.data.message;\r\n this.scope.selectedAccount.marketOrders = null;\r\n this.scope.isDownloadReady = true;\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n })\r\n .finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface MarketDepthScope extends ng.IScope {\r\n marketDepthInformation: any; \r\n securityCode: string; \r\n events: MarketDepthCtrl;\r\n isLoading: boolean;\r\n \r\n }\r\n\r\n export class MarketDepthCtrl extends PortfolioBaseCtrl {\r\n scope: Patersons.MarketDepthScope;\r\n portfolioService: Patersons.PortfolioService;\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService','navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.portfolioService = portfolioService;\r\n }\r\n \r\n load() {\r\n if (this.scope.securityCode == null || this.scope.securityCode == \"\") {\r\n return;\r\n }\r\n\r\n this.scope.isLoading = true;\r\n\r\n this.portfolioService.getOrderDepthData(this.scope.securityCode)\r\n .then((result) => {\r\n this.scope.marketDepthInformation = result; \r\n }).finally(() => {\r\n this.scope.isLoading = false; \r\n });\r\n } \r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ReportScope extends ng.IScope {\r\n accounts: Array;\r\n selectedAccount: Account;\r\n report: AbstractReport;\r\n hasAccoladeAccounts: boolean;\r\n currentPage: string;\r\n\r\n loaded: boolean;\r\n\r\n reportType: string;\r\n startDate: Date;\r\n endDate: Date;\r\n reportStartDate: Date;\r\n isError: boolean;\r\n hasData: boolean;\r\n\r\n searchtextRun: string;\r\n searchtext: any;\r\n isDownloadReady: boolean;\r\n isDownloading: boolean;\r\n isRendering: boolean;\r\n events: ReportViewCtrl;\r\n\r\n isPreselected: boolean;\r\n initialReportGenerated: boolean;\r\n collapsedBanner: boolean;\r\n showNewReportBtn: boolean;\r\n\r\n hidePdf: boolean;\r\n hideCsv: boolean;\r\n\r\n valuationReport: ValuationStatement;\r\n userCompany: UserCompany;\r\n }\r\n \r\n \r\n //export class ReportViewCtrl extends AbstractController {\r\n export class ReportViewCtrl extends PortfolioBaseCtrl {\r\n q: ng.IQService;\r\n scope: Patersons.ReportScope;\r\n portfolioService: Patersons.PortfolioService;\r\n reportService: Patersons.ReportService;\r\n reportDownloadService: Patersons.ReportDownloadService;\r\n bulkDownloadService: Patersons.BulkDownloadService;\r\n static $inject = ['$q', '$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'portfolioService', 'reportService', 'reportDownloadService', 'bulkDownloadService','navigationService', 'userCompanyService'];\r\n\r\n constructor($q, $scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, portfolioService, reportService, reportDownloadService, bulkDownloadService, navigationService, userCompanyService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.q = $q;\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.portfolioService = portfolioService;\r\n this.reportService = reportService;\r\n this.reportDownloadService = reportDownloadService;\r\n this.bulkDownloadService = bulkDownloadService;\r\n this.scope.loaded = null;\r\n this.scope.accounts = new Array();\r\n this.scope.currentPage = this.state.current.name;\r\n this.scope.endDate = moment().toDate();\r\n this.scope.startDate = moment().subtract(1, 'year').toDate();\r\n\r\n this.scope.showNewReportBtn = true;\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n this.scope.searchtextRun = \"Run another report\";\r\n this.scope.searchtext = {\r\n open: \"Run another report\",\r\n close: \"Hide report form\"\r\n };\r\n this.scope.isPreselected = false;\r\n this.scope.collapsedBanner = false;\r\n if($stateParams.hasAccoladeAccounts){\r\n this.scope.hasAccoladeAccounts = $stateParams.hasAccoladeAccounts;\r\n }else{\r\n this.scope.hasAccoladeAccounts = null;\r\n }\r\n\r\n if ($stateParams.collapsedBanner == true){\r\n this.scope.collapsedBanner = true;\r\n this.scope.loaded = true;\r\n }\r\n\r\n if (this.state.current.name == \"report.tax\"){\r\n this.scope.isPreselected = true;\r\n this.scope.reportType = \"TaxReports\";\r\n }else if (this.state.current.name == \"report.quarterly\") {\r\n this.scope.isPreselected = true;\r\n this.scope.reportType = \"QuarterlyReports\";\r\n }else if (this.state.current.name == \"report.invoices\") {\r\n this.scope.isPreselected = true;\r\n this.scope.reportType = \"InvoiceReports\"\r\n }\r\n if(this.scope.isPreselected){\r\n this.scope.loaded = true;\r\n this.scope.collapsedBanner = true;\r\n this.scope.searchtextRun = \"Run another search\";\r\n this.scope.searchtext = {\r\n open: \"Run another search\",\r\n close: \"Hide search form\"\r\n };\r\n }\r\n this.scope.hideCsv = false;\r\n this.scope.hidePdf = false;\r\n if (!this.scope.loaded) {\r\n this.scope.loaded = false;\r\n }\r\n\r\n userCompanyService.getUserCompany().then((company) => {\r\n this.scope.userCompany = company;\r\n })\r\n\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result) => {\r\n this.scope.loaded = true;\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result.filter(r => r.accountType == \"Accolade\");\r\n this.scope.hasAccoladeAccounts = this.scope.accounts.some(a => a.isAccolade);\r\n if (this.scope.isPreselected && !this.scope.hasAccoladeAccounts){\r\n this.scope.collapsedBanner = false;\r\n this.state.go('report')\r\n }\r\n });\r\n });\r\n };\r\n\r\n setSelectedAccount(accountId: string) {\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n console.info('selected account id: ' + this.scope.selectedAccount.accountId);\r\n this.scope.isError = false;\r\n console.log(this.scope.selectedAccount)\r\n this.scope.hasData = false;\r\n }\r\n toggleNewReportBtn(){\r\n this.scope.showNewReportBtn = !this.scope.showNewReportBtn;\r\n }\r\n setFromDate(fromDate: Date) {\r\n this.scope.startDate = fromDate;\r\n console.info('from date: ' + this.scope.startDate);\r\n }\r\n\r\n setToDate(toDate: Date) {\r\n this.scope.endDate = toDate;\r\n console.info('to date: ' + this.scope.endDate);\r\n }\r\n\r\n setReportType(reportType: string) {\r\n this.scope.reportType = reportType;\r\n console.info('report types: ' + this.scope.reportType);\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n }\r\n\r\n get showFromDate() {\r\n if(this.scope.reportType === ReportType.UnrealisedCapitalGains.toString()){\r\n return false;\r\n }else if(this.scope.reportType === ReportType.Valuation.toString()){\r\n return false;\r\n }else{\r\n return true;\r\n }\r\n }\r\n\r\n get toDateLabel() {\r\n return this.showFromDate ? 'To:' : 'As at:';\r\n }\r\n\r\n get dateRangeLabel() {\r\n if (this.showFromDate) {\r\n let fromDateString: string = moment(this.scope.report.dateFrom).format('D MMM YYYY');\r\n let toDateString: string = moment(this.scope.report.dateTo).format('D MMM YYYY');\r\n return `From ${fromDateString} to ${toDateString}`;\r\n } else {\r\n let asAtDateString: string = moment(this.scope.report.asAtDate).format('D MMM YYYY');\r\n return `As at: ${asAtDateString}`;\r\n }\r\n }\r\n\r\n get areReportComponentsVisible() {\r\n return this.scope.report != null && this.scope.report.reportType.toString() == this.scope.reportType;\r\n }\r\n\r\n renderReport = function () {\r\n this.scope.isRendering = true;\r\n this.scope.isDownloadReady = false;\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n this.scope.initialReportGenerated = true;\r\n this.scope.showNewReportBtn = true;\r\n if (this.scope.reportType === \"TaxReports\" || this.scope.reportType === \"QuarterlyReports\" || this.scope.reportType === \"InvoiceReports\"){\r\n this.scope.hidePdf = true;\r\n this.scope.hideCsv = true;\r\n }\r\n else\r\n {\r\n this.scope.hidePdf = false;\r\n this.scope.hideCsv = false;\r\n }\r\n\r\n this.reportService.getReport(this.scope.reportType, this.scope.selectedAccount.accountId, this.scope.startDate, this.scope.endDate)\r\n .then((result) => {\r\n this.scope.report = result;\r\n this.scope.generatedDateTime = moment.tz(this.scope.report.creationDateUtc, 'Australia/Sydney').format('h:mm a');\r\n this.scope.generatedDate = moment(this.scope.report.creationDateUtc).tz('Australia/Sydney').toDate();\r\n this.scope.isDownloadReady = true;\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n },\r\n (reason) => {\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n })\r\n .finally(() => {\r\n this.scope.reportStartDate = this.scope.startDate;\r\n this.scope.reportEndDate = this.scope.endDate;\r\n this.scope.isRendering = false;\r\n });\r\n };\r\n\r\n downloadPdf() {\r\n console.info('Download PDF');\r\n this.reportDownloadService.downloadPdfFile(this.scope.report, this.scope.selectedAccount);\r\n }\r\n\r\n downloadCsv() {\r\n console.info('Download CSV');\r\n this.reportDownloadService.downloadCsvFile(this.scope.report, this.scope.selectedAccount);\r\n }\r\n\r\n downloadInvestorDocuments(investorDocs) {\r\n if (investorDocs.length <= 0) {\r\n return;\r\n }\r\n\r\n this.scope.isDownloading = true;\r\n var filename = this.scope.selectedAccount.accountId + \"-\" + moment(new Date()).format(\"YYYY-MM-DD\") + \".zip\";\r\n this.bulkDownloadService.downloadItems(investorDocs, filename)\r\n .finally(() => {\r\n this.scope.isDownloading = false;\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\ndeclare var pdfMake: any;\r\n\r\nmodule Patersons {\r\n\r\n export interface LedgerScope extends ng.IScope {\r\n accounts: Array;\r\n selectedAccount: Account;\r\n startDate: Date;\r\n endDate: Date;\r\n\r\n report: StandardLedgerReport;\r\n reportError: string;\r\n\r\n events: LedgerViewCtrl;\r\n\r\n summaryText: string;\r\n isError: boolean;\r\n hasData: boolean;\r\n isRendering: boolean;\r\n isDownloadReady: boolean;\r\n }\r\n\r\n //export class LedgerViewCtrl extends AbstractController {\r\n export class LedgerViewCtrl extends PortfolioBaseCtrl{\r\n scope: Patersons.LedgerScope;\r\n portfolioService: Patersons.PortfolioService;\r\n reportService: Patersons.ReportService;\r\n reportDownloadService: Patersons.ReportDownloadService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'reportService', 'reportDownloadService', 'portfolioService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, reportService, reportDownloadService, portfolioService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.scope.events = this;\r\n this.reportService = reportService;\r\n this.reportDownloadService = reportDownloadService;\r\n this.portfolioService = portfolioService;\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n\r\n this.load()\r\n\r\n this.scope.endDate = moment().toDate();\r\n this.scope.startDate = moment().subtract(30, 'days').toDate();\r\n }\r\n\r\n load() {\r\n this.scope.isRendering = true;\r\n this.portfolioService.getCombinedPortfolioData()\r\n .then((result) => {\r\n this.scope.$apply(() => {\r\n this.scope.accounts = result;\r\n this.scope.isRendering = false;\r\n });\r\n });\r\n }\r\n\r\n renderLedger = function (accountId: string, startDate: Date, endDate: Date) {\r\n this.scope.selectedAccount = this.scope.accounts.filter(a => a.accountId == accountId)[0];\r\n this.scope.startDate = startDate;\r\n this.scope.endDate = endDate;\r\n this.scope.generatedDate = new Date();\r\n\r\n this.scope.isRendering = true;\r\n this.scope.isDownloadReady = false;\r\n\r\n this.scope.isError = false;\r\n this.scope.hasData = false;\r\n\r\n this.reportService.getReport(ReportType.StandardLedger, this.scope.selectedAccount.accountId, this.scope.startDate, this.scope.endDate)\r\n .then((result) => {\r\n this.scope.report = result;\r\n this.scope.isDownloadReady = true;\r\n this.scope.isError = false;\r\n this.scope.hasData = true;\r\n },\r\n (reason) => {\r\n //this.scope.reportError = reason.data.message;\r\n this.scope.report = null;\r\n this.scope.isDownloadReady = true;\r\n this.scope.isError = true;\r\n this.scope.hasData = false;\r\n })\r\n .finally(() => {\r\n this.scope.isRendering = false;\r\n });\r\n };\r\n\r\n getSummaryText = function() {\r\n var text = \"Report generated at \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('h:mm a') +\r\n \" AEST on \" +\r\n moment.tz(this.scope.generatedDate, 'Australia/Sydney').format('D MMM YYYY') + \".\";\r\n return text;\r\n }\r\n\r\n downloadPdf() {\r\n console.info('Download PDF');\r\n this.reportDownloadService.downloadPdfFile(this.scope.report, this.scope.selectedAccount);\r\n }\r\n\r\n downloadCsv() {\r\n console.info('Download CSV');\r\n this.reportDownloadService.downloadCsvFile(this.scope.report, this.scope.selectedAccount);\r\n }\r\n }\r\n}\r\n","'use strict';\r\ndeclare var loaderConfigSalETF: any;\r\nmodule Patersons {\r\n\r\n export interface XrayScope extends ng.IScope {\r\n isLoading: boolean;\r\n securityId: string;\r\n }\r\n\r\n export class XrayCtrl extends AbstractController {\r\n scope: Patersons.XrayScope;\r\n timeout: any;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.log.info(\"Xray Ctrl loading...\");\r\n let portfolio_xray = {\r\n name: 'demo portfolio 1',\r\n totalValue: 10000,\r\n currencyId: 'USD',\r\n holdings: [{\r\n identifier: 'AU000000SFY4',\r\n identifierType: 'ISIN',\r\n weight: 50\r\n }, {\r\n identifier: 'AU000000VAP7',\r\n identifierType: 'ISIN',\r\n weight: 30\r\n }, {\r\n identifier: 'AU000000BHP4',\r\n identifierType: 'ISIN',\r\n weight: 10\r\n }, {\r\n identifier: 'AU60PLA00028',\r\n identifierType: 'ISIN',\r\n weight: 10\r\n }],\r\n benchmark: {\r\n holdings: [{\r\n identifier: 'XIUSA04GJ2',\r\n identifierType: 'MSID',\r\n weight: 100\r\n }]\r\n }\r\n };\r\n\r\n rootMorningstarPromise().then(function (\r\n promiseChain\r\n ) {\r\n console.log(\"initializing component\");\r\n initComponent('component-xray', 'ec-xray-container', 'ec-xray', 'ecXrayPats').then(function () {\r\n morningstar.asterix.instanceRegistry.get('ecXrayPats').setParameter('portfolio', portfolio_xray);\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\ndeclare var loaderConfigSalETF: any;\r\nmodule Patersons {\r\n\r\n export interface UATPortfolioCompareScope extends ng.IScope {\r\n isLoading: boolean;\r\n securityId: string;\r\n }\r\n\r\n export class UATPortfolioCompareCtrl extends AbstractController {\r\n scope: Patersons.UATPortfolioCompareScope;\r\n timeout: any;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', '$timeout'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, $timeout) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n this.scope = $scope;\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.log.info(\"UATPortfolioCompare Ctrl loading...\");\r\n let portfolioDemo = {\r\n \"current\": {\r\n \"name\": \"demo portfolio 1\",\r\n \"totalValue\": 10000,\r\n \"currencyId\": \"AUD\",\r\n \"holdings\": [\r\n {\r\n \"identifier\": \"AU000000SFY4\",\r\n \"identifierType\": \"ISIN\",\r\n \"weight\": 50\r\n },\r\n {\r\n \"identifier\": \"AU000000VAP7\",\r\n \"identifierType\": \"ISIN\",\r\n \"weight\": 50\r\n }\r\n ],\r\n \"benchmark\": {\r\n \"holdings\": [\r\n {\r\n \"identifier\": \"XIUSA04GJ2\",\r\n \"identifierType\": \"MSID\",\r\n \"weight\": 100\r\n }\r\n ]\r\n }\r\n },\r\n \"proposed\": {\r\n \"name\": \"demo portfolio 2\",\r\n \"totalValue\": 10000,\r\n \"currencyId\": \"AUD\",\r\n \"holdings\": [\r\n {\r\n \"identifier\": \"AU000000SFY4\",\r\n \"identifierType\": \"ISIN\",\r\n \"weight\": 50\r\n },\r\n {\r\n \"identifier\": \"AU000000VAP7\",\r\n \"identifierType\": \"ISIN\",\r\n \"weight\": 30\r\n },\r\n {\r\n \"identifier\": \"AU000000BHP4\",\r\n \"identifierType\": \"ISIN\",\r\n \"weight\": 10\r\n },\r\n {\r\n \"identifier\": \"AU60PLA00028\",\r\n \"identifierType\": \"ISIN\",\r\n \"weight\": 10\r\n }\r\n ],\r\n \"benchmark\": {\r\n \"holdings\": [\r\n {\r\n \"identifier\": \"XIUSA04GJ2\",\r\n \"identifierType\": \"MSID\",\r\n \"weight\": 100\r\n }\r\n ]\r\n }\r\n }\r\n };\r\n\r\n rootMorningstarPromise().then(function (\r\n promiseChain\r\n ) {\r\n console.log(\"initializing component\");\r\n initComponent('component-container', 'ec-portfolio-compare-container', 'ec-portfolio-compare', 'ecPortfolioCompare').then(function () {\r\n morningstar.asterix.instanceRegistry.find(\"ecPortfolioCompare\").setParameter(\"portfolio\", portfolioDemo);\r\n });\r\n });\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nvar portfolioModule = angular.module(\"app.portfolioModule\", []);\r\n\r\n\r\nportfolioModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function ($stateProvider: ng.ui.IStateProvider, $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.portfolioModule config...');\r\n\r\n $stateProvider\r\n .state(\"dashboard\",\r\n {\r\n url: \"/dashboard\",\r\n templateUrl: \"assets/templates/portfolioSummary/dashboard.html\",\r\n controller: 'portfolioDashboardCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Dashboard\"};\r\n }],\r\n }\r\n })\r\n .state(\"portfolioHeatmap\",\r\n {\r\n url: \"/portfolioHeatmap\",\r\n templateUrl: \"assets/templates/portfolioSummary/portfolioHeatmap.html\",\r\n controller: 'portfolioHeatmapCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Heatmap\"};\r\n }],\r\n }\r\n })\r\n .state(\"portfolioSnapshot\",\r\n {\r\n url: \"/portfolioSnapshot\",\r\n templateUrl: \"assets/templates/portfolioSummary/portfolioSnapshot.html\",\r\n controller: 'portfolioSnapshotCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Snapshot\"};\r\n }],\r\n }\r\n })\r\n .state(\"viewPortfolio\",\r\n {\r\n url: \"/portfolioOverview?accountId\",\r\n templateUrl: \"assets/templates/PortfolioSummary/portfolioOverview.html\",\r\n controller: 'portfolioViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Portfolio Overview\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"comparePortfolios\",\r\n {\r\n url: \"/comparePortfolios\",\r\n templateUrl: \"assets/templates/PortfolioSummary/compare.html\",\r\n controller: 'portfolioCompareCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Portfolio Compare\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"stockReport\",\r\n {\r\n url: \"/stockReport?secId\",\r\n templateUrl: \"assets/templates/PortfolioSummary/stockReport.html\",\r\n controller: 'stockReportCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Stock Report\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"fundReport\",\r\n {\r\n url: \"/fundReport?secId\",\r\n templateUrl: \"assets/templates/PortfolioSummary/fundReport.html\",\r\n controller: 'fundReportCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Fund Report\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"etfReport\",\r\n {\r\n url: \"/etfReport?secId\",\r\n templateUrl: \"assets/templates/PortfolioSummary/etfReport.html\",\r\n controller: 'etfReportCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"ETF Report\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"holdings\",\r\n {\r\n url: \"/holdings\",\r\n templateUrl: \"assets/templates/PortfolioSummary/holdings.html\",\r\n controller: 'holdingsCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Holdings\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n },\r\n params: {\r\n accountId: null,\r\n autoDownloadPDF: null,\r\n asAt: null\r\n }\r\n })\r\n .state('incomeProjection', {\r\n url: '/incomeProjection',\r\n templateUrl: 'assets/templates/PortfolioSummary/IncomeProjection.html'\r\n })\r\n .state('confirmationNotes', {\r\n url: '/confirmationNotes',\r\n templateUrl: 'assets/templates/portfolioSummary/confirmationNotes.html',\r\n controller: \"confirmationNotesCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Confirmation Notes\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state('marketOrders', {\r\n url: '/marketOrders',\r\n templateUrl: 'assets/templates/PortfolioSummary/marketOrders.html',\r\n controller: \"marketOrdersCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Market Orders\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"placeOrderRequest\",\r\n {\r\n url: \"/placeOrderRequest\",\r\n templateUrl: \"assets/templates/portfolioSummary/placeOrderRequest.html\",\r\n controller: \"placeOrderRequestViewCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Place Order Request\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"viewOrderRequests\",\r\n {\r\n url: \"/viewOrderRequests\",\r\n templateUrl: \"assets/templates/portfolioSummary/viewOrderRequests.html\",\r\n controller: \"viewOrderRequestsViewCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"View Order Requests\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"report\",\r\n {\r\n url: \"/report\",\r\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\r\n controller: 'reportViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Accolade Reports\"};\r\n }],\r\n },\r\n params: {\r\n hasAccoladeAccounts: null,\r\n collapsedBanner: null,\r\n },\r\n })\r\n .state(\"report.quarterly\",\r\n {\r\n url: \"/quarterly\",\r\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\r\n controller: 'reportViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Accolade Quarterly Reports\"};\r\n }],\r\n },\r\n params: {\r\n hasAccoladeAccounts: null,\r\n },\r\n })\r\n .state(\"report.tax\",\r\n {\r\n url: \"/tax\",\r\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\r\n controller: 'reportViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Accolade Tax Reports\"};\r\n }],\r\n },\r\n params: {\r\n hasAccoladeAccounts: null,\r\n },\r\n })\r\n .state(\"report.invoices\",\r\n {\r\n url: \"/invoices\",\r\n templateUrl: \"assets/templates/portfolioSummary/reports.html\",\r\n controller: 'reportViewCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Accolade Invoices\"};\r\n }],\r\n },\r\n params: {\r\n hasAccoladeAccounts: null,\r\n },\r\n })\r\n .state(\"marketDepth\",\r\n {\r\n url: \"/marketDepth\",\r\n templateUrl: \"assets/templates/portfolioSummary/marketDepth.html\",\r\n controller: 'marketDepthCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Market Depth\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"ledger\",\r\n {\r\n url: \"/ledger\",\r\n templateUrl: \"assets/templates/portfolioSummary/ledger.html\",\r\n controller: \"ledgerViewCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Ledger\"};\r\n }],\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if(profile){\r\n deferred.resolve();\r\n }else{\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"uatxray\",\r\n {\r\n url: \"/uatxray\",\r\n templateUrl: \"assets/templates/portfolioSummary/uat_xray.html\",\r\n controller: \"xrayCtrl\",\r\n resolve: {\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if (profile) {\r\n deferred.resolve();\r\n } else {\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state(\"uatportfoliocompare\",\r\n {\r\n url: \"/uatportfoliocompare\",\r\n templateUrl: \"assets/templates/portfolioSummary/uat_portfolioCompare.html\",\r\n controller: \"uatPortfolioCompareCtrl\",\r\n resolve: {\r\n checkUserProfile: ['sessionService', '$q', '$state', function (sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n const profile = sessionService.getCurrentUserProfile()\r\n if (profile) {\r\n deferred.resolve();\r\n } else {\r\n deferred.reject();\r\n }\r\n\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n }]);\r\n\r\nportfolioModule.controller('portfolioBaseCtrl', Patersons.PortfolioBaseCtrl);\r\nportfolioModule.controller('portfolioDashboardCtrl', Patersons.PortfolioDashboardCtrl);\r\nportfolioModule.controller('portfolioHeatmapCtrl', Patersons.PortfolioHeatmapCtrl);\r\nportfolioModule.controller('portfolioSnapshotCtrl', Patersons.PortfolioSnapshotCtrl);\r\nportfolioModule.controller('portfolioViewCtrl', Patersons.PortfolioViewCtrl);\r\nportfolioModule.controller('portfolioCompareCtrl', Patersons.PortfolioCompareCtrl);\r\nportfolioModule.controller('stockReportCtrl', Patersons.StockReportCtrl);\r\nportfolioModule.controller('fundReportCtrl', Patersons.FundReportCtrl);\r\nportfolioModule.controller('etfReportCtrl', Patersons.EtfReportCtrl);\r\nportfolioModule.controller('holdingsCtrl', Patersons.HoldingsCtrl);\r\nportfolioModule.controller('confirmationNotesCtrl', Patersons.ConfirmationNotesCtrl);\r\nportfolioModule.controller('marketOrdersCtrl', Patersons.MarketOrdersCtrl);\r\nportfolioModule.controller('placeOrderRequestViewCtrl', Patersons.PlaceOrderRequestViewCtrl);\r\nportfolioModule.controller('viewOrderRequestsViewCtrl', Patersons.ViewOrderRequestsViewCtrl);\r\nportfolioModule.controller('reportViewCtrl', Patersons.ReportViewCtrl);\r\nportfolioModule.controller('ledgerViewCtrl', Patersons.LedgerViewCtrl);\r\nportfolioModule.controller('marketDepthCtrl', Patersons.MarketDepthCtrl);\r\n\r\nportfolioModule.controller('xrayCtrl', Patersons.XrayCtrl);\r\nportfolioModule.controller('uatPortfolioCompareCtrl', Patersons.UATPortfolioCompareCtrl);\r\n\r\n\r\nportfolioModule.component('investorDocs', new Patersons.InvestorDocsComponent());\r\nportfolioModule.component('reportTypeSelect', new Patersons.ReportTypeSelectComponent());\r\nportfolioModule.component('accountDateRangeFilter', new Patersons.AccountDateRangeFilterComponent());\r\nportfolioModule.component('portfolioSummary', new Patersons.PortfolioSummaryComponent());\r\nportfolioModule.component('incomeReport', new Patersons.IncomeReportComponent());\r\nportfolioModule.component('cashReport', new Patersons.CashReportComponent());\r\nportfolioModule.component('capitalTransactionStatement', new Patersons.CapitalTransactionStatementComponent());\r\nportfolioModule.component('standardLedgerReport', new Patersons.StandardLedgerReportComponent());\r\nportfolioModule.component('performanceReport', new Patersons.PerformanceReportComponent());\r\nportfolioModule.component('portfolioGraph', new Patersons.PortfolioGraphComponent());\r\nportfolioModule.component('realisedCapitalGainsReport', new Patersons.RealisedCapitalGainsReportComponent());\r\nportfolioModule.component('unrealisedCapitalGainsReport', new Patersons.UnrealisedCapitalGainsReportComponent());\r\nportfolioModule.component('valuationReport', new Patersons.ValuationStatementComponent());\r\nportfolioModule.component('marketValueReport', new Patersons.MarketValueReportComponent());\r\nportfolioModule.component('reportDisclaimer', new Patersons.ReportDisclaimerComponent());\r\nportfolioModule.component('holdingsDisclaimer', new Patersons.HoldingsDisclaimerComponent());\r\nportfolioModule.component('cashHoldingsReport', new Patersons.CashHoldingsReportComponent());\r\nportfolioModule.component('cashHighInterestHoldingsReport', new Patersons.CashHighInterestHoldingsReportComponent());\r\nportfolioModule.component('termDepositsHoldingsReport', new Patersons.TermDepositsHoldingsReportComponent());\r\nportfolioModule.component('equityHoldingsReport', new Patersons.EquityHoldingsReportComponent());\r\nportfolioModule.component('totalMarketValue', new Patersons.TotalMarketValueComponent());\r\nportfolioModule.component('portfolioNavigation', new Patersons.PortfolioNavigationComponent());\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export abstract class ChangeRequestBaseCtrl extends AbstractController {\r\n navigationService: Patersons.NavigationService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope);\r\n\r\n this.navigationService = navigationService;\r\n this.navigationService.deactivateAll();\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ChangeRequestScope extends ng.IScope {\r\n events: ChangeRequestViewCtrl;\r\n //accounts: Array;\r\n changeRequests: Array;\r\n currentChangeRequest: ChangeRequest;\r\n currentIndex: number;\r\n originalData: any;\r\n originalDataKeys: string[];\r\n modifiedData: any;\r\n modifiedDataKeys: string[];\r\n isLoading: boolean;\r\n hasChangeRequests: boolean;\r\n submissionFailedVerifyPhoneNumber: boolean;\r\n isBusy: boolean;\r\n isError: boolean;\r\n }\r\n\r\n export class ChangeRequestViewCtrl extends ChangeRequestBaseCtrl {\r\n scope: Patersons.ChangeRequestScope;\r\n rootScope: ng.IRootScopeService;\r\n changeRequestService: Patersons.ChangeRequestService;\r\n tokenService: Patersons.TokenService;\r\n identityService: Patersons.IdentityService;\r\n modal: any;\r\n\r\n static $inject = ['$scope', '$uibModal', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'changeRequestService', 'tokenService', 'navigationService','identityService'];\r\n\r\n constructor($scope, $uibModal, $log, $location, $window, $state, $stateParams, $http, $rootScope, changeRequestService, tokenService, navigationService, identityService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.rootScope = $rootScope;\r\n this.changeRequestService = changeRequestService;\r\n this.tokenService = tokenService;\r\n this.identityService = identityService;\r\n\r\n this.scope.events = this;\r\n this.scope.currentIndex = 0;\r\n\r\n this.scope.isBusy = false;\r\n\r\n this.modal = $uibModal;\r\n\r\n this.load();\r\n }\r\n\r\n load() {\r\n this.scope.isLoading = true;\r\n this.scope.hasChangeRequests = false;\r\n\r\n this.changeRequestService.getChangeRequestsForApproval()\r\n .then((result) => {\r\n this.scope.changeRequests = result;\r\n\r\n if (this.scope.changeRequests && this.scope.changeRequests.length > 0) {\r\n this.scope.hasChangeRequests = true;\r\n }\r\n else {\r\n return;\r\n }\r\n\r\n this.setCurrentChangeRequest(0);\r\n }, (error) => { // error handling\r\n this.scope.isError = true;\r\n this.scope.isLoading = false;\r\n }).finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n goToPreviousChangeRequest() {\r\n this.scope.currentIndex -= 1;\r\n\r\n if (this.scope.currentIndex < 0) {\r\n this.scope.currentIndex = 0;;\r\n }\r\n\r\n this.setCurrentChangeRequest(this.scope.currentIndex);\r\n }\r\n\r\n goToNextChangeRequest() {\r\n this.scope.currentIndex += 1;\r\n\r\n if (this.scope.currentIndex >= this.scope.changeRequests.length) {\r\n this.scope.currentIndex = this.scope.changeRequests.length - 1;\r\n }\r\n\r\n this.setCurrentChangeRequest(this.scope.currentIndex);\r\n }\r\n\r\n approveChangeRequest() {\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n\r\n this.identityService.getIsPhoneNumberVerifyed().\r\n then((phone_number_verified: boolean) => {\r\n if (phone_number_verified !== true) {\r\n this.scope.submissionFailedVerifyPhoneNumber = true;\r\n return;\r\n }\r\n\r\n var modalPopup = this.modal.open({\r\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\r\n controller: ApproveChangeRequestCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n resolve: {\r\n changeRequestId: this.scope.currentChangeRequest.id\r\n }\r\n });\r\n\r\n modalPopup.result\r\n .then((result) => {\r\n if (result === true) {\r\n this.scope.currentChangeRequest.isApproved = true;\r\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\r\n this.rootScope.$emit('changeRequestActioned', null);\r\n }\r\n }, (error) => { // error handling\r\n this.scope.isError = true;\r\n this.scope.isLoading = false;\r\n });\r\n });\r\n\r\n /*if (this.tokenService.tokenManager.profile.phone_number_verified !== 'true') {\r\n this.scope.submissionFailedVerifyPhoneNumber = true;\r\n return;\r\n }\r\n\r\n var modalPopup = this.modal.open({\r\n templateUrl: 'assets/templates/common/twoFactorAuthentication.html',\r\n controller: ApproveChangeRequestCtrl,\r\n keyboard: false,\r\n backdrop: 'static',\r\n resolve: {\r\n changeRequestId: this.scope.currentChangeRequest.id\r\n }\r\n });\r\n\r\n modalPopup.result\r\n .then((result) => {\r\n if (result === true) {\r\n this.scope.currentChangeRequest.isApproved = true;\r\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\r\n this.rootScope.$emit('changeRequestActioned', null);\r\n }\r\n }, (error) => { // error handling\r\n this.scope.isError = true;\r\n this.scope.isLoading = false;\r\n });*/\r\n }\r\n\r\n rejectChangeRequest() {\r\n this.scope.isBusy = true;\r\n this.scope.currentChangeRequest.isRejected = true;\r\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\r\n\r\n this.changeRequestService.rejectChangeRequest(this.scope.currentChangeRequest.id)\r\n .then((result) => {\r\n this.rootScope.$emit('changeRequestActioned', null);\r\n }, (error) => { // error handling\r\n this.scope.isError = true;\r\n this.scope.isLoading = false;\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n\r\n }\r\n\r\n setCurrentChangeRequest(index: number) {\r\n this.scope.submissionFailedVerifyPhoneNumber = false;\r\n\r\n this.scope.currentChangeRequest = this.scope.changeRequests[index];\r\n this.setChangeRequestTypeDescription(this.scope.currentChangeRequest);\r\n this.setApprovalStatusDescription(this.scope.currentChangeRequest);\r\n\r\n this.constructOriginalDataObject(this.scope.currentChangeRequest);\r\n this.constructModifiedDataObject(this.scope.currentChangeRequest);\r\n }\r\n\r\n constructOriginalDataObject(changeRequest: ChangeRequest) {\r\n this.scope.originalData = null;\r\n this.scope.originalDataKeys = null;\r\n\r\n if (changeRequest.originalData === null) {\r\n return;\r\n }\r\n\r\n this.scope.originalData = JSON.parse(changeRequest.originalData);\r\n this.scope.originalDataKeys = Object.keys(this.scope.originalData);\r\n }\r\n\r\n constructModifiedDataObject(changeRequest: ChangeRequest) {\r\n this.scope.modifiedData = null;\r\n this.scope.modifiedDataKeys = null;\r\n\r\n if (changeRequest.modifiedData === null) {\r\n return;\r\n }\r\n\r\n this.scope.modifiedData = JSON.parse(changeRequest.modifiedData);\r\n this.scope.modifiedDataKeys = Object.keys(this.scope.modifiedData);\r\n }\r\n\r\n setApprovalStatusDescription(changeRequest: ChangeRequest) {\r\n if (changeRequest.isApproved) {\r\n changeRequest.approvalStatusDescription = 'Approved';\r\n }\r\n else if (changeRequest.isRejected) {\r\n changeRequest.approvalStatusDescription = 'Rejected';\r\n }\r\n else {\r\n changeRequest.approvalStatusDescription = 'Pending';\r\n }\r\n }\r\n\r\n setChangeRequestTypeDescription(changeRequest: ChangeRequest) {\r\n switch (changeRequest.changeRequestType) {\r\n case 'AccoladeOptions':\r\n changeRequest.changeRequestTypeDescription = 'Accolade Options';\r\n break;\r\n case 'AddressDetails':\r\n changeRequest.changeRequestTypeDescription = 'Address Details';\r\n break;\r\n case 'RegistrationAddressDetails':\r\n changeRequest.changeRequestTypeDescription = 'Registration Address Details';\r\n break;\r\n case 'AccountEmailAddress':\r\n changeRequest.changeRequestTypeDescription = 'Account Email Address';\r\n break;\r\n case 'ContractNoteEmailAddress':\r\n changeRequest.changeRequestTypeDescription = 'Contract Note Email Address';\r\n break;\r\n case 'PhoneNumbers':\r\n changeRequest.changeRequestTypeDescription = 'Phone Numbers';\r\n break;\r\n case 'BankAccountDetails':\r\n changeRequest.changeRequestTypeDescription = 'Bank Account Details';\r\n break;\r\n case 'TaxFileNumber':\r\n changeRequest.changeRequestTypeDescription = 'Tax File Number';\r\n break;\r\n default:\r\n changeRequest.changeRequestTypeDescription = changeRequest.changeRequestType\r\n }\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nvar changeRequestModule = angular.module(\"app.changeRequestModule\", []);\r\n\r\n\r\nchangeRequestModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function ($stateProvider: ng.ui.IStateProvider, $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.changeRequestModule config...');\r\n\r\n $stateProvider\r\n .state(\"changeRequests\",\r\n {\r\n url: \"/changeRequests\",\r\n templateUrl: \"assets/templates/changeRequests/changeRequest.html\",\r\n controller: 'changeRequestViewCtrl',\r\n resolve:{\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Account Information Change Requests\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n }]);\r\n\r\n\r\nchangeRequestModule.controller('changeRequestBaseCtrl', Patersons.ChangeRequestBaseCtrl);\r\nchangeRequestModule.controller('changeRequestViewCtrl', Patersons.ChangeRequestViewCtrl);\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface VerifyPhoneScope extends ng.IScope { \r\n phoneForm: ng.IFormController\r\n accessCode: string;\r\n events: Patersons.VerifyPhoneCtrl; \r\n }\r\n \r\n export class VerifyPhoneCtrl {\r\n\r\n scope: Patersons.VerifyPhoneScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n http: ng.IHttpService; \r\n identityService: Patersons.IdentityService;\r\n\r\n static $inject = ['$scope', '$location', '$window', '$state', '$stateParams', '$http', 'identityService'];\r\n\r\n constructor($scope, $location, $window, $state, $stateParams, $http, identityService) {\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http; \r\n\r\n this.scope.events = this; \r\n var userId = $stateParams.userId; \r\n } \r\n\r\n save() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.phoneForm.$invalid) {\r\n return;\r\n }\r\n alert('checking phone...');\r\n }\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ChangePasswordCtrlScope extends ng.IScope {\r\n changePasswordDetails: ChangePasswordDetails\r\n changePasswordForm: ng.IFormController;\r\n errorHandler: any;\r\n events: Patersons.ChangePasswordCtrl;\r\n isBusy: boolean;\r\n passwordInputType: string;\r\n isValidPassword: boolean;\r\n }\r\n\r\n export class ChangePasswordCtrl extends IdentityBaseCtrl {\r\n\r\n scope: Patersons.ChangePasswordCtrlScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n http: ng.IHttpService;\r\n identityService: Patersons.IdentityService;\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'identityService', 'navigationService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, identityService, navigationService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.identityService = identityService;\r\n this.scope.events = this;\r\n \r\n this.scope.passwordInputType = \"password\";\r\n\r\n this.scope.isBusy = false;\r\n\r\n this.scope.changePasswordDetails = new ChangePasswordDetails;\r\n }\r\n togglePasswordVisibility() {\r\n \r\n if (this.scope.passwordInputType === \"password\") {\r\n this.scope.passwordInputType = \"text\"\r\n } else {\r\n this.scope.passwordInputType = \"password\"\r\n }\r\n }\r\n onValidation = (isValid: boolean) => {\r\n if(this.scope){\r\n this.scope.isValidPassword = isValid;\r\n }\r\n }\r\n changePassword() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.changePasswordForm.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n\r\n this.identityService.changePassword(this.scope.changePasswordDetails)\r\n .then((result) => {\r\n location.href = '/dashboard';\r\n },\r\n (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n\r\n\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface ChangeEmailCtrlScope extends ng.IScope {\r\n changeEmailDetails: ChangeEmailDetails;\r\n changeEmailForm: {form:ng.IFormController};\r\n errorHandler: any;\r\n events: Patersons.ChangeEmailCtrl;\r\n isBusy: boolean;\r\n emailChanged: boolean;\r\n profile: UserProfile;\r\n profileAddressDetails: ProfileAddress;\r\n }\r\n\r\n export class ChangeEmailCtrl extends IdentityBaseCtrl {\r\n\r\n scope: Patersons.ChangeEmailCtrlScope;\r\n location: ng.ILocationService;\r\n window: ng.IWindowService;\r\n state: angular.ui.IStateService;\r\n stateParams: angular.ui.IStateProvider;\r\n http: ng.IHttpService;\r\n identityService: Patersons.IdentityService;\r\n tokenService: Patersons.TokenService;\r\n\r\n static $inject = ['$scope', '$log', '$location', '$window', '$state', '$stateParams', '$http', '$rootScope', 'identityService', 'navigationService', 'tokenService', 'sessionService'];\r\n\r\n constructor($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, identityService, navigationService, tokenService, sessionService) {\r\n super($scope, $log, $location, $window, $state, $stateParams, $http, $rootScope, navigationService);\r\n this.scope = $scope;\r\n this.location = $location;\r\n this.window = $window;\r\n this.state = $state;\r\n this.stateParams = $stateParams;\r\n this.http = $http;\r\n this.identityService = identityService;\r\n this.tokenService = tokenService;\r\n this.scope.profile = this.tokenService.tokenManager.profile;\r\n if (!this.scope.profile){\r\n window.localStorage.setItem('$psl.redirect_uri', window.location.href);\r\n this.tokenService.tokenManager.redirectForToken();\r\n }\r\n this.scope.events = this;\r\n\r\n this.scope.isBusy = false;\r\n this.scope.emailChanged = false;\r\n\r\n this.scope.profileAddressDetails = new ProfileAddress;\r\n this.scope.changeEmailForm = {form: null};\r\n this.scope.changeEmailDetails = new ChangeEmailDetails;\r\n this.scope.changeEmailDetails.newEmail = this.scope.profile.email;\r\n this.load();\r\n }\r\n\r\n load(){\r\n var promise = this.identityService.getUserAddressDetails();\r\n promise.then((result: any) => {\r\n this.scope.profileAddressDetails.addressLine1 = result[\"addressLine1\"];\r\n this.scope.profileAddressDetails.addressLine2 = result[\"addressLine2\"];\r\n this.scope.profileAddressDetails.addressLine3 = result[\"addressLine3\"];\r\n this.scope.profileAddressDetails.addressLine4 = result[\"addressLine4\"];\r\n this.scope.profileAddressDetails.postcode = result[\"postcode\"];\r\n this.scope.profileAddressDetails.country = result[\"country\"];\r\n console.log(this.scope.profileAddressDetails);\r\n });\r\n }\r\n\r\n changeEmail() {\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.changeEmailForm.form.$invalid) {\r\n return;\r\n }\r\n\r\n this.scope.isBusy = true;\r\n\r\n this.identityService.changeEmail(this.scope.changeEmailDetails)\r\n .then((result) => {\r\n this.scope.emailChanged = true;\r\n setTimeout(() =>{\r\n this.tokenService.tokenManager.redirectForToken();\r\n }, 2000);\r\n },\r\n (reason) => {\r\n this.scope.errorHandler = reason.data;\r\n })\r\n .finally(() => {\r\n this.scope.isBusy = false;\r\n });\r\n }\r\n\r\n\r\n }\r\n}\r\n","'use strict';\r\n\r\nmodule Patersons {\r\n\r\n export interface SetPasswordScope extends ng.IScope {\r\n setPasswordDetails: Patersons.SetPasswordDetails;\r\n setPasswordForm: ng.IFormController;\r\n errorHandler: any;\r\n isSubmitted: boolean;\r\n isSuccess: boolean;\r\n events: Patersons.SetPasswordCtrl;\r\n isLoading: boolean;\r\n \r\n passwordInputType: string;\r\n isValidPassword: boolean;\r\n }\r\n\r\n export class SetPasswordCtrl {\r\n\r\n scope: Patersons.SetPasswordScope;\r\n identityService: Patersons.IdentityService;\r\n tokenService: TokenService;\r\n\r\n static $inject = ['$scope', 'identityService', 'tokenService'];\r\n\r\n constructor($scope, identityService, tokenService) {\r\n this.scope = $scope;\r\n this.identityService = identityService;\r\n this.tokenService = tokenService;\r\n\r\n this.scope.events = this;\r\n this.scope.isSubmitted = false;\r\n this.scope.isSuccess = false;\r\n this.scope.passwordInputType = \"password\";\r\n this.scope.setPasswordDetails = new Patersons.SetPasswordDetails();\r\n }\r\n onValidation = (isValid: boolean) => {\r\n if(this.scope){\r\n this.scope.isValidPassword = isValid;\r\n }\r\n }\r\n togglePasswordVisibility() {\r\n \r\n if (this.scope.passwordInputType === \"password\") {\r\n this.scope.passwordInputType = \"text\"\r\n } else {\r\n this.scope.passwordInputType = \"password\"\r\n }\r\n }\r\n save() {\r\n this.scope.errorHandler = null;\r\n this.scope.isSubmitted = true;\r\n this.scope.$broadcast('show-errors-check-validity');\r\n\r\n if (this.scope.setPasswordForm.$invalid) {\r\n return;\r\n }\r\n this.scope.isLoading = true;\r\n this.identityService.setPassword(this.scope.setPasswordDetails)\r\n .then((result) => {\r\n this.scope.isSuccess = true;\r\n this.sleep(2000).then(() => {\r\n this.tokenService.tokenManager.redirectForToken();\r\n });\r\n }, (response) => {\r\n this.scope.isSuccess = false;\r\n this.scope.errorHandler = response.data;\r\n }).finally(() => {\r\n this.scope.isLoading = false;\r\n });\r\n }\r\n\r\n sleep(time) {\r\n return new Promise((resolve) => setTimeout(resolve, time));\r\n }\r\n }\r\n}","'use strict';\r\n\r\nvar identityModule = angular.module(\"app.identityModule\", []);\r\n\r\n\r\nidentityModule.config([\"$stateProvider\", \"$locationProvider\",\r\n function ($stateProvider: ng.ui.IStateProvider, $locationProvider: angular.ILocationProvider) {\r\n\r\n console.log('app.identityModule config...');\r\n\r\n $stateProvider\r\n .state('forgottenPan', {\r\n url: '/forgottenPan',\r\n templateUrl: 'assets/templates/identity/forgottenPan.html',\r\n controller: \"forgottenPanCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Forgotten Pan\"};\r\n }],\r\n }\r\n })\r\n .state('forgottenPassword', {\r\n url: '/forgottenPassword',\r\n templateUrl: 'assets/templates/identity/forgottenPassword.html',\r\n controller: \"forgottenPasswordCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Forgotten Password\"};\r\n }],\r\n }\r\n })\r\n .state('changeMobile', {\r\n url: '/changeMobile',\r\n templateUrl: 'assets/templates/identity/changeMobile.html',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Change Mobile\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state('registerMobile', {\r\n url: '/registerMobile',\r\n templateUrl: 'assets/templates/identity/registerMobile.html',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Register Mobile\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state('changePassword', {\r\n url: '/changePassword',\r\n templateUrl: 'assets/templates/identity/changePassword.html',\r\n controller: \"changePasswordCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Change Password\"};\r\n }],\r\n }\r\n })\r\n .state('changeEmail', {\r\n url: '/changeEmail',\r\n templateUrl: 'assets/templates/identity/changeEmail.html',\r\n controller: \"changeEmailCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Update User Profile\"};\r\n }],\r\n }\r\n })\r\n .state('verifyPhone', {\r\n url: '/verifyPhone?userId',\r\n templateUrl: 'assets/templates/identity/verifyPhone.html',\r\n controller: \"verifyPhoneCtrl\",\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Verify Phone\"};\r\n }],\r\n impersonatorCheck: ['sessionService', '$q','$state', function(sessionService, $q, $state) {\r\n var deferred = $q.defer();\r\n if (sessionService.getCurrentUserProfile().impersonator === 'True') {\r\n $state.go('dashboard');\r\n deferred.reject();\r\n } else {\r\n deferred.resolve();\r\n }\r\n return deferred.promise;\r\n }]\r\n }\r\n })\r\n .state('confirmPassword', {\r\n url: '/confirmPassword',\r\n templateUrl: 'assets/templates/identity/confirmPassword.html',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Confirm Password\"};\r\n }],\r\n }\r\n })\r\n .state('callbackAction', {\r\n url: '/callback/:response',\r\n templateUrl: 'assets/templates/common/loading.html',\r\n controller: 'identityCallbackCtrl'\r\n })\r\n .state('setPassword', {\r\n url: '/setPassword',\r\n templateUrl: 'assets/templates/identity/setPassword.html',\r\n controller: 'setPasswordCtrl',\r\n resolve: {\r\n meta: ['$rootScope', '$stateParams', function ($rootScope, $stateParams) {\r\n $rootScope.meta = {title: \"Set Password\"};\r\n }],\r\n }\r\n })\r\n }]);\r\n\r\nidentityModule.controller('IdentityBaseCtrl', Patersons.IdentityBaseCtrl);\r\nidentityModule.controller('identityCallbackCtrl', Patersons.CallbackCtrl);\r\nidentityModule.controller('verifyPhoneCtrl', Patersons.VerifyPhoneCtrl);\r\nidentityModule.controller('changePhoneCtrl', Patersons.ChangePhoneCtrl);\r\nidentityModule.controller('forgottenPanCtrl', Patersons.ForgottenPanCtrl);\r\nidentityModule.controller('forgottenPasswordCtrl', Patersons.ForgottenPasswordCtrl);\r\nidentityModule.controller('changePasswordCtrl', Patersons.ChangePasswordCtrl);\r\nidentityModule.controller('changeEmailCtrl', Patersons.ChangeEmailCtrl);\r\nidentityModule.controller('setPasswordCtrl', Patersons.SetPasswordCtrl);\r\n","\"use strict\";\r\n\r\nvar controllerModule = angular.module(\"app.controllers\", [\"ui.bootstrap\"]);\r\ncontrollerModule.controller('navbarCtrl', Patersons.NavbarCtrl); \r\ncontrollerModule.controller('footerCtrl', Patersons.FooterCtrl);\r\ncontrollerModule.controller('abstractController', Patersons.AbstractController);\r\ncontrollerModule.controller('clientAdviserViewCtrl', Patersons.ClientAdviserViewCtrl);\r\ncontrollerModule.controller('helpViewCtrl', Patersons.HelpViewCtrl);\r\ncontrollerModule.controller('landingCtrl', Patersons.LandingCtrl); \r\n","\"use strict\";\r\n\r\nvar compareTo = function () {\r\n return {\r\n require: \"ngModel\",\r\n scope: {\r\n otherModelValue: \"=compareTo\"\r\n },\r\n link: function (scope, element, attributes, ngModel) {\r\n\r\n ngModel.$validators.compareTo = function (modelValue) {\r\n return modelValue == scope.otherModelValue;\r\n };\r\n\r\n scope.$watch(\"otherModelValue\", function () {\r\n ngModel.$validate();\r\n });\r\n }\r\n };\r\n};\r\n\r\nvar appDirectives = angular.module(\"app.directives\", []);\r\n\r\nappDirectives.config(() => {\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n var dictionary: any = JSON.parse(model);\r\n\r\n for (var key in dictionary) {\r\n module.constant(key, dictionary[key]);\r\n }\r\n});\r\n\r\nappDirectives.directive(\"appVersion\", function () {\r\n var model: string = document.getElementById(\"model\").textContent.trim();\r\n var dictionary: any = JSON.parse(model);\r\n var version = dictionary['websiteVersionNumber'];\r\n return {\r\n template: 'Version: ' + version\r\n };\r\n});\r\n\r\nappDirectives.directive(\"compareTo\", compareTo);\r\n\r\nappDirectives.directive('showErrors', function () {\r\n return {\r\n restrict: 'A',\r\n require: '^form',\r\n link: function (scope, el, attrs, formCtrl) {\r\n // find the text box element, which has the 'name' attribute\r\n var inputEl = el[0].querySelector(\"[name]\");\r\n // convert the native text box element to an angular element\r\n var inputNgEl = angular.element(inputEl);\r\n // get the name on the text box so we know the property to check\r\n // on the form controller\r\n var inputName = inputNgEl.attr('name');\r\n\r\n // only apply the has-error class after the user leaves the text box\r\n inputNgEl.bind('blur', function () {\r\n el.toggleClass('has-error', formCtrl[inputName].$invalid);\r\n })\r\n }\r\n }\r\n});\r\n\r\nappDirectives.directive('addressForm', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'assets/templates/accountDetails/addressForm.html',\r\n scope: {\r\n addressTitle: '@',\r\n address: '=', // allows data to be passed into directive from controller scope\r\n selectedAccount: '<',\r\n mailAddressForm: '=',\r\n isDisabled: '<'\r\n }\r\n };\r\n});\r\n\r\n// Note: rendered as \r\nappDirectives.directive('marketDepthForm', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'assets/templates/portfolioSummary/components/marketDepth.component.html'\r\n };\r\n});\r\n\r\nappDirectives.directive('holdingsSummary', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'assets/templates/portfolioSummary/holdingsSummary.html',\r\n };\r\n});\r\n\r\nappDirectives.directive('marketOrdersSummary', function () {\r\n return {\r\n restrict: 'E',\r\n controller: Patersons.MarketOrdersCtrl,\r\n templateUrl: 'assets/templates/portfolioSummary/marketOrdersSummary.html'\r\n };\r\n});\r\n\r\nappDirectives.directive('errSrc', function () {\r\n return {\r\n link: function (scope, element, attrs:any) {\r\n element.bind('error', function () {\r\n if (attrs.src != attrs.errSrc) {\r\n attrs.$set('src', attrs.errSrc);\r\n }\r\n });\r\n\r\n attrs.$observe('ngSrc', function (value) {\r\n if (!value && attrs.errSrc) {\r\n attrs.$set('src', attrs.errSrc);\r\n }\r\n });\r\n }\r\n };\r\n});\r\n\r\nappDirectives.directive(\"isNotDuplicate\", [\"$q\", function ($q) {\r\n return {\r\n require: \"ngModel\",\r\n link: function (scope, elm, attrs, ctrl: any) {\r\n ctrl.$asyncValidators.isNotDuplicate = function (modelValue: string, viewValue: string) {\r\n if (ctrl.$isEmpty(viewValue)) {\r\n return $q.resolve();\r\n }\r\n\r\n var existing = attrs.isNotDuplicate.split(\"|\");\r\n\r\n var def = $q.defer();\r\n if (existing.indexOf(viewValue.toLowerCase()) === -1) {\r\n def.resolve();\r\n } else {\r\n def.reject();\r\n }\r\n\r\n return def.promise;\r\n };\r\n }\r\n };\r\n}]);\r\n\r\nappDirectives.directive(\"dateFormat\", [\"$q\", function ($q) {\r\n return {\r\n require: \"ngModel\",\r\n link: function (scope, elm, attrs, ctrl: any) {\r\n ctrl.$asyncValidators.dateFormat = function (modelValue: string, viewValue: string) {\r\n if (ctrl.$isEmpty(viewValue)) {\r\n return $q.resolve();\r\n }\r\n\r\n // Validate format against dd/dd/dddd\r\n if (!/^\\d\\d\\/\\d\\d\\/\\d\\d\\d\\d$/.test(viewValue)) {\r\n return $q.reject();\r\n }\r\n\r\n if (!moment(viewValue, \"DD/MM/YYYY\").isValid()) {\r\n return $q.reject();\r\n }\r\n\r\n return $q.resolve();\r\n }\r\n }\r\n };\r\n}]);\r\n\r\nappDirectives.directive('passwordMatch', [\"$q\", function ($q) {\r\n return {\r\n restrict: 'A',\r\n scope:true,\r\n require: 'ngModel',\r\n link: function (scope, elem , attrs, control) {\r\n var checker = function () {\r\n //get the value of the first password\r\n var e1 = scope.$eval(attrs.ngModel);\r\n //get the value of the other password\r\n var e2 = scope.$eval(attrs.passwordMatch);\r\n return e1 == e2;\r\n };\r\n scope.$watch(checker, function (n) {\r\n //set the form control to valid if both\r\n //passwords are the same, else invalid\r\n control.$setValidity(\"unique\", n);\r\n //attrs.passwordMatch.$setValidity(\"pattern\", n);\r\n });\r\n }\r\n };\r\n}]);\r\n\r\nvar defaultTitle = '';\r\nappDirectives.directive('pageTitle', ['$rootScope', '$interpolate', '$state', 'userCompanyService', function ($rootScope, $interpolate, $state, userCompanyService) {\r\n\r\n\r\n return {\r\n restrict: 'A',\r\n link: function (scope, element) {\r\n $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {\r\n //reset the meta data when a route changes - the document title should be updated by the resolve meta property on each state\r\n $rootScope.meta = undefined;\r\n });\r\n $rootScope.$on('$stateChangeSuccess', function (event, toState) {\r\n userCompanyService.getUserCompany().then((company) => {\r\n defaultTitle = company.companyName;\r\n var separateBy = ' - ';\r\n if ($rootScope.meta && $rootScope.meta.title) {\r\n var stateTitle = $rootScope.meta.title;\r\n element.html(stateTitle + separateBy + defaultTitle);\r\n $rootScope.$emit('$titleChangeSuccess', stateTitle + separateBy + defaultTitle);\r\n } else {\r\n element.html(defaultTitle);\r\n $rootScope.$emit('$titleChangeSuccess', defaultTitle);\r\n }\r\n })\r\n });\r\n }\r\n }\r\n}]);","'use strict'\r\n\r\nvar appComponents = angular.module(\"app.components\", []);\r\n\r\nappComponents.component('changeRequestSubmitted', new Patersons.ChangeRequestSubmittedComponent());\r\nappComponents.component('phoneNotRegistered', new Patersons.PhoneNotRegisteredComponent());\r\nappComponents.component('changePhone', new Patersons.ChangePhoneComponent());\r\nappComponents.component('approversNotRegistered', new Patersons.ApproversNotRegisteredComponent());\r\nappComponents.component('sectionHeader', new Patersons.SectionHeaderComponent());\r\nappComponents.component('spinner', new Patersons.SpinnerComponent());\r\nappComponents.component('accountSelect', new Patersons.AccountSelectComponent());\r\nappComponents.component('actionButton', new Patersons.ActionButtonComponent());\r\nappComponents.component('passwordValidation', new Patersons.PasswordValidationComponent());\r\nappComponents.component('dateSelect', new Patersons.DateSelectComponent());\r\nappComponents.component('morningstarError', new Patersons.MorningstarErrorComponent());\r\nappComponents.component('featuredItem', new Patersons.FeaturedItemComponent());\r\nappComponents.component('feedList', new Patersons.feedListComponent());"],"sourceRoot":"/source/"}