{"version":3,"sources":["assets/img/ETFSA_On Black.png","assets/img/caret.svg","assets/img/arrow.svg","assets/img/opened-white-box.svg","assets/img/et-ps-icon.svg","assets/img/calendar-icon.svg","assets/img/cash-icon.svg","assets/img/total-value-icon.svg","assets/img/funnel.svg","assets/img/caret.png","assets/img/close-icon.svg","assets/img/verified.png","assets/img/verified@2x.png","assets/img/declined.png","assets/img/declined@2x.png","assets/img/pending.png","assets/img/pending@2x.png","assets/img/info-panel-bump.png","assets/img/mobile.svg","assets/img/worldwide-icon.svg","assets/img/whatsapp-icon.svg","assets/img/mail-icon.svg","assets/img/hamburger-icon.svg","assets/img/down-arrow-icon.svg","assets/img/settings-icon.svg","assets/img/documents-icon.svg","assets/img/ETFSA_On White.png","assets/img/ETFSA_On White@2x.png","assets/img/ETFSA_On White@3x.png","AppTypes.ts","Services/AppService.ts","Models/Registration/Enums/InvestorTypes.ts","Services/AuthorisationService.ts","Models/Security/AppUser.ts","Models/Registration/Enums/OtpType.ts","Models/Investors/InvestorLinkedPortfolioLookup.ts","Models/Investors/InvestorLookup.ts","Models/Security/LoginResult.ts","Models/Enums/NotificationDuration.ts","Views/ETInvestorVMBase.ts","Views/ETViewBase.ts","Services/AppLayout.ts","Models/ApiModelBase.ts","Models/Security/LoginDetails.ts","App/Components/Popover.tsx","App/Components/PopoverButton.tsx","Models/Registration/Enums/InvestmentType.ts","Models/Registration/Enums/PaymentType.ts","Models/Base/Enums/InvestableType.ts","Views/Dashboard/Components/InvestmentSelectionComponent.tsx","Models/Portfolio/StatementCriteria.ts","Models/Investors/InvestorOTPDetails.ts","Models/Library/APIModelBase.ts","Models/Base/TradeCost.ts","Models/Enums/FicaStatus.ts","Models/Instruments/InstrumentDetail.ts","Models/Library/PurchaseTradeRequestBase.ts","Models/Base/RecurringTradeRequest.ts","Models/Base/TradeRequest.ts","Models/Instruments/Instrument.ts","Services/StringConstants.ts","Views/Investor/Trades/SwitchVM.ts","Models/Investors/InvestorAddressDetail.ts","Models/Enums/DataFrequency.ts","Models/Portfolio/GraphDataCriteria.ts","Models/Investors/InvestorBankDetail.ts","Models/Investors/InvestorForeignTax.ts","Models/Investors/InvestorTaxDetail.ts","Models/Registration/Investor.ts","Views/Investor/Trades/WithdrawCashVM.ts","Views/Dashboard/DashboardVM.ts","Models/Base/Enums/MaintenanceDocumentType.ts","App/Components/ETLoader.tsx","App/Components/ClickLink.tsx","App/Components/BreadCrumb.tsx","Views/Dashboard/Components/ChartColors.ts","Views/Dashboard/Components/LineChart.tsx","Views/Dashboard/Components/ModalLineChart.tsx","Views/Dashboard/Components/ETPGrid.tsx","App/Components/InfoIcon.tsx","Views/Dashboard/Components/PieChart.tsx","Models/Registration/Enums/InstrumentProvider.ts","Services/DocumentHandler.ts","Views/Investor/Components/BankAccountDetails.tsx","Views/Investor/Components/TradeCostDetails.tsx","Views/Investor/Trades/WithdrawCash.tsx","Views/Investor/Trades/Switch.tsx","Views/Dashboard/Components/DistributionGrid.tsx","Models/Cart/Cart.ts","Models/Cart/CartDetailLookup.ts","Views/Investor/Trades/ProductsVM.ts","Views/Investor/Components/ProductAccordion.tsx","Views/Registration/Components/TradeConfirmationComponent.tsx","Views/Investor/Trades/PurchaseVM.ts","Views/Investor/Trades/Purchase.tsx","Models/Portfolio/PortfolioType.ts","Views/Investor/Trades/Product.tsx","Models/Registration/Enums/RegistrationState.ts","Views/Dashboard/Components/DashboardLineChart.tsx","Views/Dashboard/Dashboard.tsx","Models/Security/OTPRegistrationVerification.ts","Views/Registration/Components/OTPComponent.tsx","Views/Registration/Components/RegistrationPersonalDetailsComponent.tsx","Models/Registration/Registration.ts","Models/Registration/Portfolio.ts","Views/Registration/Components/AccountTypeComponent.tsx","Models/Registration/Enums/IDType.ts","Models/Enums/IDCheckResult.ts","Views/Registration/RegisterVM.ts","Models/Registration/Enums/Gender.ts","Models/Investors/UpdateIdentityCommand.ts","Models/Enums/YesNo.ts","Views/Investor/Components/IdentityDetails.tsx","Views/Registration/Components/IdentificationComponent.tsx","Models/Base/PoliticalSensitivity.ts","Services/AppDataService.ts","Views/Registration/Components/PoliticalSensitivityComponent.tsx","Views/Investor/Components/AddressDetails.tsx","Models/Investors/UpdateAddressCommand.ts","Views/Registration/Components/ProofOfResidenceComponent.tsx","Views/Registration/Components/BankDetailsComponent.tsx","Views/Investor/Components/TaxDetails.tsx","Views/Registration/Components/TaxDetailsComponent.tsx","Views/Registration/Components/MandateComponent.tsx","Views/Registration/Components/AccountCreatedComponent.tsx","Views/Registration/RegisterView.tsx","Views/Security/LoginVM.ts","Models/Security/ForgotPassword.ts","Models/Security/UpdatePassword.ts","Views/Security/ForgotPasswordVM.ts","Views/Security/ForgotPasswordView.tsx","Models/Security/ForgotUsername.ts","Views/Security/ForgotUsernameVM.ts","Views/Security/ForgotUsernameView.tsx","Views/Security/Login.tsx","Services/AuthenticationService.ts","Models/AppConfig.ts","Models/Catalogue/Bank.ts","Models/Catalogue/BankAccountType.ts","Models/Catalogue/Country.ts","Models/Catalogue/Province.ts","Models/Catalogue/SourceOfFunds.ts","Views/InformationPanel/AccountInformationVM.ts","App/Components/404NotFound.tsx","Views/Security/LoggedOut.tsx","Views/Registration/RegistrationActivationVM.ts","Views/Registration/RegistrationActivationView.tsx","Views/Investor/InvestorProfileVM.ts","App/Components/StatusImage.tsx","App/Components/InfoPanel/InfoPanel.tsx","App/Components/InfoPanel/InfoPanelColumn.tsx","App/Components/InfoPanel/InfoPanelController.ts","Views/InformationPanel/Components/InvestmentInfoVM.ts","Views/Investor/InvestorProfileView.tsx","Models/Base/FAQ.ts","Views/FAQView.tsx","Views/ContactUsView.tsx","Services/RouteService.ts","ApiClients/SecurityApiClient.ts","App/Components/EtfSAErrorHandler.ts","ApiClients/InvestorApiClient.ts","ApiClients/PortfolioApiClient.ts","ApiClients/DocumentApiClient.ts","ApiClients/PoliticalSensitivityApiClient.ts","ApiClients/ProvinceApiClient.ts","ApiClients/BankApiClient.ts","ApiClients/BankAccountTypeApiClient.ts","ApiClients/CountryApiClient.ts","Models/Investors/InvestorFicaStatusLookup.ts","Models/Investors/InvestorDocument.ts","Views/InformationPanel/DocumentPanelVM.ts","Models/Investors/AppInvestorData.ts","Models/Reporting/Distribution.ts","Models/Portfolio/GraphData.ts","Models/Portfolio/PortfolioBalance.ts","Models/Portfolio/AppPortfolioData.ts","Services/CurrentInvestorService.ts","ApiClients/InvestorQueryApiClient.ts","Models/Catalogue/Strategy.ts","Models/Catalogue/AssetClass.ts","Models/Catalogue/Region.ts","Models/Instruments/InstrumentProvider.ts","Models/Catalogue/PortfolioCatalogue.ts","ApiClients/CatalogueApiClient.ts","Services/OldSiteIntegration.tsx","Models/Security/ChangeOTPPreference.ts","Models/Security/ChangePassword.ts","Views/InformationPanel/UserInformationVM.ts","ApiClients/FAQApiClient.ts","ApiClients/StatementApiClient.ts","ApiClients/RecurringTradeRequestApiClient.ts","Services/OtpService.ts","ApiClients/TradeRequestApiClient.ts","ApiClients/InstrumentApiClient.ts","ApiClients/ReportingApiClient.ts","ApiClients/SourceOfFundsApiClient.ts","ApiClients/CartApiClient.ts","ApiClients/InvestorDocumentApiClient.ts","AppModule.ts","AppSetup.ts","Models/Enums/DocumentType.ts","App/Components/Sidebar.tsx","App/Components/LeftPanel.tsx","App/Components/UserStatus.tsx","Views/InformationPanel/Components/AccountIdentityInfo.tsx","Views/InformationPanel/Components/AccountAddressInfo.tsx","Views/InformationPanel/Components/BankDetailsInfo.tsx","Views/InformationPanel/Components/TaxInfo.tsx","Views/InformationPanel/Components/InvestmentInfo.tsx","Views/InformationPanel/AccountInformationPanel.tsx","Views/InformationPanel/UserInformationPanel.tsx","Views/InformationPanel/DocumentPanel.tsx","App/Components/HeaderPanel.tsx","App/Components/RouteView.tsx","App/Components/Footer.tsx","App/Components/OTPModal.tsx","App.tsx","index.tsx"],"names":["module","exports","Types","ApiClients","SecurityApiClient","AppServices","ServiceIdentifier","InvestorApiClient","InvestorQueryApiClient","PortfolioApiClient","DocumentApiClient","InvestorDocumentApiClient","PoliticalSensitivityApiClient","ProvinceApiClient","BankApiClient","BankAccountTypeApiClient","CountryApiClient","CatalogueApiClient","FAQApiClient","StatementApiClient","RecurringTradeRequestApiClient","TradeRequestApiClient","InstrumentApiClient","ReportingApiClient","SourceOfFundsApiClient","CartApiClient","Services","AppAuthenticationService","NeoTypes","Security","AuthenticationService","asType","AppDataCache","AppLayout","RouteService","CurrentInvestorService","OldSiteIntegration","OtpService","UserInformationVM","Config","ConfigModel","Neo","NeoReactTypes","AppService","Misc","Globals","appService","InvestorTypes","AuthorisationService","injectable","roleName","Promise","resolve","AppUser","userInfo","this","userName","fullName","Date","now","tokenInfo","expiryDate","getTime","authToken","investorID","OtpType","InvestorLinkedPortfolioLookup","Attributes","Observable","NeoModel","portfolioID","portfolioTypeID","portfolioType","isPrimary","reinvestDividends","wasCreated","pendingReinvestDividends","LookupBase","InvestorLookup","investorTypeID","firstName","lastName","hasRecurringTradeRequest","ficaVerified","EnumHelper","getItemMetadata","display","List","decorateEnum","e","describe","Email","CellNo","Both","NotificationDuration","TokenInfo","Integer","DateUtils","add","createdOn","seconds","expiresIn","LoginResult","ChildObject","Rules","Required","Nullable","Serialisation","SerialiseType","FullOnly","userID","administrator","emailAddress","cellNo","otpType","firstTimeLogin","pendingOtpType","value","ModelBase","ETInvestorVMBase","taskRunner","get","TaskRunner","investorService","oldSiteIntegration","investorData","investor","portfolioData","portfolioBalance","Views","ViewModelBase","ETViewBase","hideHeader","sidebarType","viewModel","ViewBase","ScreenSize","APIModelBase","LoginDetails","Display","rules","isNew","Popover","props","popoverRef","React","createRef","onMouseDown","bind","window","addEventListener","anchor","anchorElement","current","anchorRect","getBoundingClientRect","thisRect","left","alignment","offsetLeft","width","style","top","offsetTop","height","yOffset","removeEventListener","target","level","parentElement","maxElementNesting","onHide","ref","className","Utils","joinWithSpaces","onClick","alt","src","PopoutArrow","children","Component","PopoverButton","observer","anchorRef","show","dropDownClassName","menuItems","map","menuItem","isDivider","text","subText","observable","InvestmentType","PaymentType","InvestableType","header","footer","contentPanel","onWindowResize","document","scrollY","peek","isScrollTop","currentView","innerWidth","currentScreenSize","ExtraSmall","Small","Medium","Large","ExtraLarge","Huge","setContentHeight","setContainerMargin","getElementById","headerHeight","clientHeight","parseInt","getComputedStyle","marginBottom","minHeight","innerHeight","containers","querySelectorAll","first","forEach","c","menuHidden","windowWidth","remainingSpace","element","marginLeft","action","InvestmentSelectionComponent","portfolio","selectedPortfolio","globalTaskRunner","waitFor","getPortfolioAsync","investorInfo","investorType","hideInvestmentType","portfolioList","p","onPortfolioClick","StatementCriteria","TimeZoneFormat","None","ValueObject","monthStart","today","InvestorOTPDetails","otpMethod","ApiModelBase","TradeCost","Float","tradeAmount","Math","round","brokerage","min","strateCostMax","max","strateCostMin","strateCostPercentage","feeMultiplier","effectiveMultiplier","getBrokerage","strateFee","getStrateFee","fees","TradeFees","vat","FicaStatus","InstrumentDetail","NoTracking","instrumentID","failWhen","amount","minimumRandValue","minimumTradeValue","instrumentMinimumTradeValue","estimatedUnits","minimumEstimatedUnits","instrument","minimumInvestmentAmount","investableTypeID","ModelPortfolio","tradeCostMultiplier","underlyingInstrumentsCount","buyPrice","SwitchInstrumentDetail","percentage","minimumPercentageValue","onProperties","minimumTradePercentage","parentSwitch","setTradeValues","trunc","valueAvailable","tradeFees","hasTradeCosts","tradeCosts","getFees","Instrument","estimatedUnitsCalculation","sellAmountFees","totalFees","floor","setTradeFees","PurchaseInstrumentDetail","tradeRequest","calculateFees","PurchaseTradeRequestBase","sourceOfFundsAdditionalInfo","RecurringTradeRequest","instruments","RecurringTradeRequestDetail","otp","pendingDebitOrderDay","sum","hasSentOtp","debitOrderDay","instrumentName","RecurringTradeRequestPost","maximumTradeValue","NumberUtils","format","NumberFormat","CurrencyDecimals","DebitOrderDays","description","TAUDebitOrder","contractNumber","selfLink","TradeRequest","OnChanged","investmentTypeChange","paymentMethodID","EFT","selectedInstruments","totalPurchaseAmount","investmentTypeID","RecurringInvestment","OnceOffCollection","sourceOfFundsID","initialSourceOfFundsID","initialSourceOfFundsAdditionalInfo","Purchase","mapFrom","recurringTradeRequest","push","length","addNew","validTradeRules","rule","addError","some","isSourceOfFundsAdditionalInfoRequired","trim","OnceOffInvestment","Sale","Switch","switchToInstrumentDetails","switchFromUnderlyingInstrumentsCount","totalInstrumentToTradeFees","multiplierFrom","instrumentCode","moneyMarketInd","oldInd","isTradeable","instrumentDescription","instrumentRiskRatingID","cashInd","smallImageID","largeImageID","isin","instrumentProviderID","assetClassID","strategyID","regionID","incomeTreatmentDescription","investableType","instrumentProviderImageID","notFicadTooltip","notReadyToInvestTooltip","pendingTradesTooltip","noValueAvailable","message","SwitchVM","notifications","UI","GlobalNotifications","navigation","Routing","NavigationHelper","otpService","tradeRequestApiClient","appDataCache","currentInvestorService","investorApiClient","instrumentApiClient","currentSwitch","investorOTPDetails","showSuccessModal","isPercentage","toInstruments","totalPercentage","hasTradeCostsList","portfolioInstrumentBalance","getDataAsync","setCurrentSwitch","getTradeableInstrumentList","instrumentResult","set","data","switchInstrument","find","instrumentID_From","remove","getInvestorOTPDetails","investorResult","fromJSObject","showNotificationAndClose","title","addDanger","StringConstants","getErrorNotificationText","Long","navigateToDashboard","currentInstrumentDetail","instrumentDetail","currentInstrument","i","setSwitchTradeValues","setEmptySwitch","filter","recalculateSwitch","isDisabled","undefined","sendOtp","showOtpModal","result","SubmitSwitch","resendOtp","cancelled","ModalUtils","showYesNo","ModalResult","No","showOtp","currentModel","newSwitchInstruction","toJSObject","run","options","a","onError","isServerError","addWarning","errorDetail","body","toLocaleLowerCase","includes","switch","tradeCost","success","resetPortfolioData","navigateToView","Home","InvestorAddressDetail","addressLine1","addressLine3","documentId","iad","postalCode","DataFrequency","TimeRange","InvestorBankDetail","surname","thirdPartyIDNo","documentID","ficaStatus","Pending","rejectedReason","isThirdParty","bank","branchCode","defaultBranchCode","ibd","accountNo","InvestorForeignTax","investorForeignTaxID","taxNumber","InvestorTaxDetail","t","onForeignTaxChanged","investorForeignTaxes","item","hasForeignTaxDetails","RegExp","test","isRegisteredForLocalTax","it","validTaxNumber","Investor","guid","emptyGuid","idNo","passportCountryOfIssueID","investorStatusID","identityStatusReason","addressStatusReason","hideTour","taxStatusReason","requiresInvestmentAdvice","WithdrawCashVM","currentSale","instrumentBalanceDetails","bankDetails","isWithdrawAll","getInvestor","costMultiplier","setEmptyTransaction","primaryBankDetails","accountInformationVM","beginEditBankDetails","setTransactionFees","newSellInstruction","sale","SubmitSale","d","Month","Year","ThreeYears","DashboardViewType","GraphDataCriteria","onTimeRangeChanged","frequency","Monthly","timeRange","fromDate","months","Daily","Weekly","Withdrawal","Distributions","MaintenanceDocumentType","DashboardVM","documentApiClient","reportingApiClient","catalogueApiClient","viewType","instrumentGraphData","instrumentGraphCriteria","withdrawCashVM","switchVM","statementCriteria","canWithdrawCash","canSwitchCash","shareCashZAR","disabledToolTip","instrumentGraphTask","registerReaction","setCanTransactAvailableCash","getTradeCosts","isModelPortfolio","getInstrumentName","getGraphData","seriesId","graphCriteria","showMessage","getGraphDataForInstrument","registerViewModel","setPortfolioInstrumentBalance","initialise","Dashboard","load","endDate","monthEnd","startDate","portfolioTypeId","getDistributionReport","toQueryObject","response","FileUtils","showSaveFile","toggleDocumentPanel","documentsVM","panelController","forward","valuePending","hasPendingShareCashTransaction","isCashInstrument","reduce","currentValue","cashAvailable","minTradeValue","ETLoader","canvasRef","drawContext","endTime","colors","colorOffset","animate","palette","getContext","requestAnimationFrame","context","radius","canvas","count","countMinus1","gap","clearRect","start","progress","easeValue","easeOutQuart","fillStyle","beginPath","arc","fill","x","pow","ClickLink","preventDefault","softDisable","data-tip","tooltip","rest","href","BreadCrumbUIItem","breadCrumb","isLast","label","Function","BreadCrumb","items","getBreadCrumbList","b","splice","rootItem","index","key","BreadCrumbItem","link","to","chartColors","LineChart","graphData","hasMounted","highcharts","Highcharts","getChartOptions","seriesData","chartType","tooltipHeader","chartOptions","chart","type","backgroundColor","xAxis","labels","yAxis","series","s","animation","marker","enabled","valueDecimals","headerFormat","pointFormat","name","seriesName","values","valueDate","dataLabels","lineWidth","color","legend","credits","fillColor","linearGradient","x1","x2","y1","y2","stops","ModalLineChart","graphState","criteria","graphTask","isBusy","asList","setLineGraphTimeRange","id","ETPGrid","meta","onPurchase","onWithdraw","onSwitch","balance","isFicad","isReadyToInvest","readyToInvest","Grid","Row","Column","hideBelow","getInstrumentProviderImageUrl","instrumentProviderId","unitsAvailable","numProps","formatString","zeroText","price","currencySymbol","valueInclPending","availableValueInclPending","Button","isOutline","disabled","hasGraphDataAvailable","showInstrumentGraphData","ButtonColumn","addToolTip","getButtonOptions","Modal","bindModel","closeButton","size","hasPending","hasAvailableValue","InfoIcon","toolTip","PieChart","getPieChartOptions","plotOptions","pie","innerSize","borderWidth","assetClass","showInLegend","symbol","fontSize","textOutline","decorator","TermsAndConditions","ThirdPartyDebitOrderAuthority","InstrumentProvider","DocumentHandler","download","arr","Uint8Array","blob","Blob","headers","downloadUrl","URL","createObjectURL","filename","x_filename","createElement","location","append","click","open","BankAccountDetails","bankAccount","readOnly","hideRequiredStatement","hidden","FormGroup","bankID","select","itemSource","banks","onItemSelected","setBranchCode","bankAccountTypeID","bankAccountTypes","ThirdPartyBankAccountDetails","downloadTask","fetchMaintenanceDocument","convertAndDownloadDocument","registration","task","variant","downloadDebitOrderAuthorityForm","FileContext","uploadEndpoint","getInvestorDocumentUploadUrl","afterUpload","docId","allowedExtensions","allowedInvestorDocumentExtensions","taskRunnerLoadingText","FileDropArea","FileUploadButton","FileUploadProgress","reversed","ReadOnlyBankAccountDetails","renderAsText","suppressLabel","TradeCostDetails","renderFee","WithdrawCash","Form","model","onSubmit","setBankDetails","isReadOnly","onChange","isAboveThreshold","Link","withdrawAvailableUnits","paddingBottom","isSubmit","isValid","paddingTop","onClose","acceptButton","showYesNoDismissible","editBankDetails","SwitchComponent","layoutService","validation","validator","getRuleResult","amountExceedsAvailable","addButton","footerButtons","switchPreferredProportions","bindContext","AutoCompleteDropDown","displayMember","valueMember","onInstrumentSelected","PercentDecimals","checkInstrumentInd","NoDecimals","showDelete","buttonSize","getDisplayInfo","displayText","DistributionGrid","setDistributionExportCriteria","Loader","distributions","policyNo","transactionType","settlementDate","withholdingTax","downloadDistributionReport","distributionExportCriteria","FormGroupInline","Cart","sourceOfFundsDescription","sourceOfFundsDescriptionRequired","cartDetails","CartDetail","investmentType","existingCartDetail","cartItem","cartDetailID","cartID","CartDetailLookup","FilterCriteria","ProductsVM","config","cartApiClient","filterCriteria","portfolioCatalogue","researchPageUrl","cart","cartDetailLookups","showPopover","totalCartAmount","fetchInstruments","appendSelectAllInstrument","clearFilterCriteria","getCartDetailLookup","cartResult","setDefaultInstrumentProvider","defaultInstrumentProvider","providers","etfSA","instrumentProviders","instrumentProviderName","instrumentProviderIDs","isSelfDirty","unshift","searchListResult","Array","from","markOld","portfolioId","deleteCartDetail","addSuccess","Standard","refreshCartInfo","ProductAccordion","onSelect","totalExpenseRatio","isExpanded","caret","TradeConfirmationVM","showTradeConfirmationModal","showBankDetails","maintenanceDocumentType","fetchPublicMaintenanceDocument","TradeConfirmationComponent","renderETFModal","renderOnceOffCollectionModal","renderBrokerBankDetails","renderSuccessModal","dismissModal","isTradeComplete","tradeConfirmationVM","hasAcceptedDebitOrderAuthority","hasAcceptedTermsAndConditions","accountInformation","appInvestorData","investorBankDetails","thirdPartyBankDetails","debitFrequency","amountInRands","buttons","GridLayout","md","rows","downloadMaintenanceDocument","DebitOrderAuthority","brokerBankDetails","accountName","accountNumber","accountType","PurchaseVM","recurringTradeRequestApiClient","investmentVM","tradeConfirmation","purchaseSubmitted","sourceOfFunds","currentData","additionalInfoPrompt","requiresAdditionalInfo","debitOrderDays","waitForAll","tc","rtr","getRecurringTradeRequestDetails","results","getCart","preloadInstrument","runInAction","setTradeRequestFromCart","otpDetails","si","setPurchaseTradeValues","ProductView","selectedInstrumentCode","foundInstrument","submitInstruction","purchase","toPurchase","postRecurringTradeRequest","toRecurringTradeRequest","toggleAccountInformationPanel","selectPortfolio","ensureAtLeastOneInstrument","calculateTradeFees","saveCart","errors","isDirty","updateFromTradeRequest","putCart","instrumentId","removeWithoutTracking","PortfolioType","PurchaseView","errorInfo","checkAndSaveCart","leavePrompt","breadcrumbs","viewParams","asString","showHideConfirmationModal","validationDisplayMode","Validation","DisplayMode","Always","uniqueID","RadioList","radioList","enumType","setSourceOfFundsValues","placeholder","sourceOfFundPlaceholder","showFreeTextInput","onBlur","availableInstruments","bindDisplay","showAccountInformationPanel","estimatedFinalAmount","params","containerRef","onMouseOver","closeIcon","regions","allowNulls","nullText","onItemSelect","assetClasses","fetchInitial","bindItems","strategies","filteredList","entityIdentifier","ic","Funnel","isInPopover","deleteCartItem","showAddButton","RegistrationState","DashboardLineChart","showSeriesOptions","suppressSeriesOptions","graphSeriesOptions","beginWithdraw","beginSwitch","hasInvestments","irr","abs","openBox","renderPortfolioSummary","netContributions","taxYearContributions","calendarIcon","contributions","showFor","TaxFree","Discretionary","renderValue","setValues","allocationByClass","assetAllocationByClass","xl","withGaps","getValueSummary","etpIcon","availableBalance","beginViewStatement","getTotalContributionSummary","currentTaxYearContributions","cashIcon","cashReserved","GetCashCardLinks","valueIcon","totalBalance","icon","isArray","IsVisible","OTPRegistrationVerification","registrationId","OTPComponentVM","securityApiClient","showResendOTPModal","otpRegistrationVerification","sendNewOtp","checkOTP","sendNewOtpQuestion","checkRegistrationOTPVerification","otpTypeId","registerWithEmail","catch","ex","sendEmailOnly","register","additionalData","OTPComponent","state","handleChange","setState","dismiss","numInputs","separator","inputStyle","isInputNum","containerStyle","RegistrationPersonalDetailsComponentVM","registerVM","otpComponentVM","showOtpPanel","RegistrationPersonalDetailsComponent","allReadOnly","lg","password","input","renterPassword","Input","cellphoneOtp","emailOtp","Registration","EmailAddress","validCellPhone","cellphone","PortfolioSign","acceptTerms","AccountCreated","IDType","IDCheckResult","AccountTypeComponentVM","portfolioApiClient","individualType","companyType","trustType","clubType","discretionaryInvestment","taxFreeInvestment","PortfolioSignTaxFree","PortfolioSignDiscrentionary","AccountOpened","AccountTypeComponent","Individual","putInvestor","openPortfolio","registrationState","Identification","createPortfolio","portfolioSign","portfolioOpen","account","Card","updateAccountType","checkTypeValid","RegisterVM","registrationPersonalDetailsComponentVM","accountTypeComponentVM","getInvestorAsync","PersonalDetails","IDBook","IDCard","Gender","UpdateIdentityCommand","investorId","gender","idCardCombined","idType","additionalDocumentId","onModel","checkIDNo","countryId","Passport","birthDate","beginAsync","asyncContext","checkIDNumber","IdAlreadyExists","InvalidIDNumber","endAsync","delayMs","YesNo","IdentityDetails","getInvestorDocumentById","downloadDocument","command","countries","dateProps","renderDownloadButton","IdentificationComponentVM","updateInvestorIdentity","IdentificationComponent","saveIdentity","msg","NotifyUtils","onRegisterStateChange","PoliticalSensitivity","politicalSensitivityID","associatedInd","jurisdiction","duration","year","position","ps","LifeTime","YesNoList","PoliticalSensitivityComponentVM","politicalSensitivityApiClient","politicalSensitivity","yesNoSelection","agree","PoliticalSensitivityComponent","saveInvestorPoliticalSensitivity","ProofOfResidence","Yes","setAssociation","tcTextColor","putPoliticalSensitivity","UpdatableAddressDetails","addressDetail","maxColumns","AddressDetails","FormContext","addressLine2","suburb","city","provinceID","provinces","countryID","maxLength","UpdateAddressCommand","ProofOfResidenceComponentVM","authenticationService","addressDetails","updateInvestorAddressDetail","ProofOfResidenceComponent","dispose","updateInvestorAddress","BankDetails","BankDetailsComponentVM","investorBankDetail","investorThirdPartyBankDetail","toUpdate","updateInvestorBankDetail","BankDetailsComponent","updateInvestorBankDetails","TaxDetails","Checkbox","addThirdPartyDetails","updateBankDetails","checkBankDetailsValid","taxDetail","taxInfo","removeForeignTaxItem","TaxDetailsComponentVM","investorTaxDetail","beforeSave","updateInvestorTaxDetail","TaxDetailsComponent","updateTaxDetails","Mandate","MandateComponentVM","agreeToTerms","requireInvestmentAdvice","agreeDebitOrderInstruction","hasDebitOrderInstruction","signPortfolio","MandateComponent","acceptMandates","debitOrderTextColor","checkValidSignatures","AccountCreatedComponentVM","AccountCreatedComponent","RegisterView","renderSidebar","AccountType","currentState","nextState","isNaN","percent","circumference","PI","offset","viewBox","strokeWidth","r","cx","cy","strokeDasharray","strokeDashoffset","y","textAnchor","LoginVM","loginDetails","opt","login","appUser","storeUser","ForgotPassword","username","UpdatePassword","queryString","up","confirmPassword","newPassword","ForgotPasswordVM","forgotPassword","updatePassword","emailReceived","token","ForgotPasswordView","appLayout","setToken","resetPassword","updateUserPassword","ForgotUsername","ForgotUsernameVM","forgotUsername","ForgotUsernameView","SendUsername","Login","signIn","tabIndex","storageKey","HeaderTokenAuthService","redirectPath","timerHandle","refreshUserToken","redirectLocal","Error","loadUserFromSession","userJson","sessionStorage","getItem","JSON","parse","onUserChanged","navigateInternal","hasExpired","axios","defaults","common","accessToken","clearTimeout","setItem","stringify","suppressTrackingState","expiryMs","setTimeout","removeItem","refreshTokenInfo","console","log","AppConfig","apiPath","oldSitePath","branch","Bank","bankName","BankAccountType","bankAccountTypeName","Country","countryName","Province","provinceName","SourceOfFund","sourceOfFundsName","InfoPanelView","AppDataService","countryApiClient","provinceApiClient","bankApiClient","bankAccountTypeApiClient","debitOrderApiClient","sourceOfFundsApiClient","registerList","getCountryList","getProvinceList","getBankList","getBankAccountTypeList","SourceOfFunds","getSourceOfFundsList","portfolioCataloguePromise","getDebitOrderDaysList","Data","CallbackDataSource","getPortfolioCatalogue","CachedDataService","NotFound","LoggedOutView","EmptyViewModel","RegistrationActivationVM","registrationSuccessful","activateRegistration","errorHandling","Components","ErrorDisplayType","ThrowError","activateRegistrationEmail","RegistrationActivationView","getPathForView","required","isQuery","InvestorProfileVM","getFicaStatusesAsync","StatusImage","status","isPending","Approved","Rejected","verified","srcSet","verified2x","declined","declined2x","pending","pending2x","InfoPanel","controller","_show","InfoPanelContextProps","InfoPanelContext","createContext","InfoPanelContent","panelRef","arrowRef","isHiding","panelRect","querySelector","arrowAnchorSelector","pointerRect","panelLeft","beginHide","indexOf","classList","endHideInfoPanel","_isHiding","Provider","InfoPanelBump","InfoPanelColumn","divRef","afterRender","wasHidden","registerPanel","backToText","canShow","getClass","renderBackLink","back","lastHistory","contextType","InfoPanelController","_slideAnimationActive","_slideAnimationTimer","_direction","_currentColumn","_previousColumn","history","panels","Map","startColumn","showInfoPanel","panel","has","lastHistoryName","columnName","beginSlide","pop","InvestmentInfoVM","apiClient","notificationService","debitOrderDetails","TAUDebitOrderList","editingDebitOrder","trades","debitOrders","getHistoricalDebitOrderList","day","debitOrder","debitOrderEstimatedUnits","prevOtp","submitChangeDebitOrder","storeValidOtp","cancelRecurringTradeRequest","contractNo","getTradeDebitOrderMandateDocument","AccountInformationVM","selectedView","editIdentity","editAddress","editBankDetail","edit3rdPartyBankDetail","editTaxDetails","newInvestmentCommand","view","ensureInvestor","beginHideInfoPanel","investorFICAStatusIdentity","clearFicaStatuses","clone","investorFICAStatusAddress","refetchInvestor","investorFICAStatusTaxNumber","NormalMandate","TaxFreeMandate","portfolioOpenAndSign","lookup","InvestorProfileView","ficaStatuses","verticalSpace","getSection","identityStatus","beginShowAccountInformationPanel","Identity","identityFailedReason","addressStatus","Address","addressFailedReason","beginEditAddress","bankDetailsStatus","taxStatus","taxFailedReason","beginEditTaxDetails","thirdPartyBankDetailsStatus","AdditionalBankDetails","beginEdit3rdPartyBankDetails","statusId","content","FAQ","question","answer","FAQCriteria","searchText","FaqVM","faqCriteria","faqList","autoDispose","onAnyPropertyChanged","performFilter","getFAQList","search","FAQView","getFaqList","faq","faqid","PersistentViewBase","ContactUsView","renderContactMethod","mobileIcon","whatsAppIcon","mailIcon","wwwIcon","border","loading","detail","image","dashboardRoute","path","component","requiresReadyInvestor","investorProfileRoute","faqRoute","allowAnonymous","contactUsRoute","routeProvider","RouteProvider","getMenuRoutes","getPureRoutes","LoggedOut","RegistrationActivation","routeChildren","post","RegisterModel","QueryString","encodeURIComponent","ForgotPasswordModel","UpdatePasswordModel","passwordDetails","ForgotUsernameModel","ApiClientBase","EtfSAErrorHandler","HTMLtoText","str","DOMParser","parseFromString","innerText","error","replace","errorDisplay","statusText","statusCode","ensureAxiosErrorData","rawErrorData","apiValidationMessageList","primaryProperty","errorData","properties","Object","keys","propertyErrors","join","ErrorHandler","communicationPreferenceTypeID","OTP","InvestorModel","put","PortfolioTypeID","Model","getQueryString","RequiresInvestmentAdvice","MaintenanceDocTypeID","responseType","documentType","InvestorFicaStatusLookup","InvestorDocument","documentTypeID","documentName","DocumentPanelVM","statementApiClient","investorDocumentApiClient","taxCertificates","selectedPortfolioType","getTaxCertificates","getStatementDocument","AppInvestorData","investorQueryApiClient","_investor","_ficaStatuses","fetchInvestor","selectedPortfolioTypeJSON","Number","fetchFicaInfo","investorPromise","ficaStatusPromise","getInvestorLookup","getFicaStatus","Distribution","GraphData","totals","TimeValue","InstrumentSeries","assetClassId","regionId","PortfolioBalance","taxFreeInd","PortfolioInstrumentBalance","valueTotal","AppPortfolioData","appCache","_portfolioBalance","_distributions","_hasFetchedDistributions","_hasFetchedInstruments","_instruments","fetchPortfolio","portfolioBalancePromise","fetchDistributions","getPortfolioBalance","distributionPromise","getDistributionList","fetchGraphData","allocations","groupBy","k","region","sortBy","_graphData","lineChartByClass","allValues","point","getOrAdd","timeValue","userInvestorId","user","_investorData","isVisible","_portfolioData","Strategy","strategyName","AssetClass","assetClassName","Region","regionName","imageID","PortfolioCatalogue","authService","url","isDevelopment","getUserJson","modal","showModal","overflowWrap","navigator","clipboard","writeText","close","ChangeOTPPreference","newMethod","areYouSure","ChangePassword","oldPassword","globalNotifications","userInfoPanelController","otpChangeDetails","passwordError","changePassword","beginChangeOTPMethod","endChangeOTPMethod","ReadApiClient","currentInvestor","_promiseResolver","OtpModel","reject","sendOTP","appModule","Module","container","inSingletonScope","SecurityService","Axios","toConstantValue","Slider","Range","SketchPicker","AsyncSelect","ReactSelect","registerModule","NeoModule","NeoReactModule","DocumentType","Sidebar","routingState","GlobalRoutingState","showMobileMenu","renderMenuItem","isSelected","observableRoute","Tooltip","getFontAwesomeClass","LeftPanel","sideBarType","renderMainLogo","eftsaLogo","UserStatus","userInfomationVM","hideCard","logoutClicked","beginSignOut","closest","isRegistered","mustCompleteRegistration","documentsIcon","settingsIcon","displayName","DownArrow","AccountIdentityInfo","getInvestorDocument","downloadIDDocument","AccountIdentityEditModal","AccountAddressInfo","ProofOfAddress","downloadProofOfAddress","AccountAddressEditModal","saveAddress","BankDetailsInfo","NotSent","ThirdPartyBankDetailsInfo","BankDetailsEditModal","saveBankDetail","ThirdPartyBankDetailsEditModal","save3rdPartyBankDetail","TaxDetailsInfo","TaxDetailsEditModal","saveTaxDetails","taxDetails","InvestmentInfo","toLowerCase","renderDebitOrders","sort","renderDownloadLink","toDateString","downloadTradeDebitOrderMandate","renderEditDebitOrder","changeDebitOrderDay","totalDebitOrderAmount","beginChangeDebitOrderDay","showInHeader","editButton","editDebitOrder","deleteButton","beginCancelDebitOrder","confirmChangeDebitOrder","xs","prependText","editorStyle","fontWeight","prompt","updateReInvestDividends","dayOfMonth","cancelDebitOrder","AccountInformationPanel","renderHomeView","renderStartInvestment","renderViewLink","renderInvestmentLink","newInvestment","portfolioTypeName","createInvestment","renderMainLink","beginNewInvestment","selectView","data-tip-align","UserInformationPanel","displayOtpType","inline","beginChangeOTPPreference","beginChangePassword","renderChangePassword","renderChangeOTP","details","Alert","onHidden","showPasswordButton","changeOtpDetails","canChangeOtpType","otpTypeViaText","confirmChangeOTPPreference","endChangeOTPPreference","DocumentPanel","viewTaxCertificates","renderStatementCriteria","taxCertificateListByPortfolio","downloadTaxCertificate","downloadStatement","HeaderPanel","setup","layout","showHeader","globalTask","headerClassName","ProgressBar","progressState","reverse","hamburger","logo","RouteView","routeService","routes","switchComponent","routeComponent","Route","getForbiddenComponent","route","getSigningInComponent","withRouter","Footer","getFullYear","investorHubLogo","investorHubLogo2x","investorHubLogo3x","PrivacyPolicy","OTPModal","_onOtpCancelled","showCancelButton","renderModalBody","communicationType","getCommunicationMethod","_onOtpEntered","addPrimary","email","App","containerAppendStyle","basename","baseUrl","getUserConfirmation","PageLeaveHandler","showNavigationConfirmation","showSpinner","fallback","ModalContainer","ToastContainer","notificationStore","store","TooltipProvider","renderComponent","ConfigService","loadConfig","loadUserFromToken","ReactDOM"],"mappings":"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","file":"static/js/main.5d138387.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/ETFSA_On Black.6a6d357b.png\";","module.exports = __webpack_public_path__ + \"static/media/caret.a4dd0167.svg\";","module.exports = __webpack_public_path__ + \"static/media/arrow.fba3697a.svg\";","module.exports = __webpack_public_path__ + \"static/media/opened-white-box.28e1dbb1.svg\";","module.exports = __webpack_public_path__ + \"static/media/et-ps-icon.0299fffb.svg\";","module.exports = __webpack_public_path__ + \"static/media/calendar-icon.e06ebad0.svg\";","module.exports = __webpack_public_path__ + \"static/media/cash-icon.308849b2.svg\";","module.exports = __webpack_public_path__ + \"static/media/total-value-icon.35bd4366.svg\";","module.exports = __webpack_public_path__ + \"static/media/funnel.98b59a81.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAAXNSR0IArs4c6QAAALBJREFUOE/tk0EVwjAQRP8qAAdYqAOKAizUCYMTJIACigNwAgrCW14OfSFpD2lvnWs2P5OZxJhZNjOPFVif6PIZSuqAI3CW9Mx5ltQAJ+Am6TKc+XMoqQf2wBs4pNAIuwNb4CGpnQI2IYTezDYpdAgLIXzMrE0PzGboG1NodPFzVoL5TLGUDNTnR2GjQF+MV7wCu+jwBXSlsiaBEerhe1Euz8zLKmr5d1j7V1aHtQnCF57+TRX/4DnkAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/close-icon.5598a07f.svg\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAA1CAMAAADvX+IZAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAC0UExURUdwTCQvVyQvVyQvVyQvVwCTRicyWRt1Yh9hWCQvWACSRSUxVyMvVwCTRgCTRiMvVyQvVycxWCQvVyQvVwCTRgCSRgCTRQCWSSQvVyQuVwCURwCTRgCSRQCSRQCSRf///7Dht6TarDm1SovIlKzes+347pLSoQiWS5rUpKDWqDCoY3q7g3rHkcHoxtbw2j6ubbfkvfb89mKrbFikYzWLQVrCaI3QlhidVMnqzUaXUWzCiky1dh5QrygAAAAedFJOUwCTScFrsxkFDV7TNtCRxbieJn7fbnT1JIqrVlDOqYWW3N8AAALaSURBVEjHzZXZYqowEIbDIougiLQWu8SJQQSRVgG1tu//XmcCWhZte7zrXCiGj+GfyT+RkE7ojwZ56j8R41Env8WAToaU0uGEDn7k9P6z4M4xfO5/n/u+YpaH1WFZXd5fBx8GvQneXX0wEME+Vvhr0hs8XGHvRJ5ViNiehRwCgFDQ9O4K28OXrwGiDAqeZKyIY4A1SuldZu1TegghSlgWCAkBhyLB1AdK+53MuigpRCJHbpO+pxuAOMg5hKJI/YJdAy8w5/tiJmLxDpDEDNYXLHbrDRhw2FRkSW8gKmJ463QO66IRHBPYbGd1bDcQBhDRdn1DkRbwjYtZMxYgnsfEw5YJUO2Rw+usHa+wD4TihjWMPl3iGoOGgsU+RRUAeRQsad9oyl0B55A20N18h18pZBGsmoJfhNwka0hAdM5KEXEkBL/UtqH0U2zWaxONKsFZDp+UPrTZvMqbYiu2iIan4jBabKkhigXL5ruFQPfnRmRJW0NZGxoMa0vn812NYm1r3q6t7FmEttmKxPMa3QJDJ7d6Vu0F25eC4xpFCfzY2Ytqj5MjlHucQr3HDA3f2ePKO0F44R18vuudypNxEXU8ydGnXU+evM7ipOX1oOBXvH6aIZ4H8dcMQc6DazN0nk1ICuDVcGYsia7OZj3zcVywPOEFmvG7mW+cJQHwEHv901lSnVHL/zqjbjn7bjxTbzmrb/0P+EOhq35br2Hiom2JS8dqrE9lokrueNxkNQU/yiXXbq5bGvFl4roXrGWfH2iGJHcWSpYo+HrbJYZkKzLRJMkjvjX17LGJClXbHuvlLbNkVZ9YDiGjseHamuapBhlZIq+qEtnRtKlJpLFuTEtWs3XJJLqnmqYjax6W/8WOJNOURrpYs5RT2bZBDM/EcEtZNevjmmx4ovqKNe2R6BpWY+ptVsUbsktQBvEr1vBE0a7jKH6H1SXFcTRxy1GVdluuOMuoTjLtr/jpHzaHh+Pc3VWTAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAA1CAMAAAAwEZgGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAB7UExURUdwTNRfVdJZRepvb9JeR9JeSNJhTdFVRNJcR9NcR9ZeTNFQQdFSQ9JdR9JaR9RdSNJdR9FPQdJZRtJeSNFQQdBPQfCMev///9NdSO6HddpjUuV5Zu+9s+uDcel/bdJRQ9xsWfSqne+Vhd9xXPvk4PjHv/TVz/3y8dNVR5mG09IAAAAVdFJOUwAHjgPQNRm0nl8P0nG/UCLexaxF9QDV3KIAAAKzSURBVEjHzVbreqsgEES8olETDShaUWPa9P2f8AxqaqKYtufPOft9zQVnYGeZ3ZSQTdgsJEmUkJDZ5EcR8POJc3468+B7sBVFGnyPUxRZrwmHCfhZVmU7fTy8QKfUPwNS1VLokHWFb2efpi+3rxpgG9kozWmql4f4nLc1UIOoVD3IUuKkGpn5O/tHyF2JppbDmJFQogJdfXIemc6wcXaLdFQH7KXv+wtUiA47aPWGG7GwXAtVAd5fCx3XHhkhrRpPLKPiClsqcZngI+UimlKKyqQbgnmjk77ciiVuYKAK3CD8pA8QSOBafHzMcHy4Cr0JjjitCVQrqJR4K4qufBvxb2WHF6FGFXSFDyPeaonipoEjY3q7CdE1ouVRuJFQCqVEX9yhM63oxdCIciMi0xLqQbzPyZSXGV+8C9loEdkzwW25vrCZoBkzHoShEx1v3ZVRNaEbjATEljCm1EhjSkNtSGkUDZuaRNfKIHosawMZ27JKWHZb1unipPHiKtPFTdao4Y61NXQXmawxmQ9WW5sPmxjNN9sbZn62txI79p4bSGqJDw0kSrXXQHOLokPlV4uiQ+Vui96HgE5aTVNgkHWzPwSWMSOhZKhRTdj01Zh5HGRCYZR9P8h+PSqXYdz+bBj/zbj/9Q/KGL/9yfpPI/GMyyEjxDsisnxdKZds1hBejD8H1U+cfENww30CUnDsNcEUC4EcU+L6TobUmeNQCwTqepQ6fop/JbBik5A6MVsIfh46rsUykvihxWwQAtc7JvaBYsULA0YCaofZQnDcJGaMHa0gmVMCAY/cDEjGaGAf4Sr3i+A6VuKDwKwgXwh4nPojgeXWESrTpUoJSR2PeDlhgW3lTwSskDwlGe6Axo/3kDg+qmvT2MnCR4JF49j3sHvsH+JV1cbxYa0v4L4S7rn3H7v6D5fEYW05PblmAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAA1CAMAAADiQZJeAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACcUExURUdwTPOnJjxGaUBFavOnJjhCZvapJzhCZzhBZzhCZzpTavSnJ/OpKf+uLjhCZjhCZjhCZzhCZvSoJzhCZ/KnJvSnJvOnJjlDaDlDaPOnJ/OmJ/iqK/KnJ/OnJvKmJv/WVf////+GAP/ZX//cbP/mmPi8O//fef/ih//89PzMS/WxMPOrK/7SUf/rrf+kPf/hv//y1v+xWP+THP/OluCUYSgAAAAedFJOUwDVHA/p2zRkvXIGYykOldCFqkRIoYWoMFP5wCTz9ob1MkYAAAKZSURBVEjHzZXbeqowEEZDAANUQaoVeyJ1SAGptPr1/d9tzwTUcLAtdzsXVSeL4Z9jGeuf2YwtNpsFff5+5k5qOWnqWKkz/wW9s56QPB/nybr7AV606EdVfbQPLG46XltEvu+lPvt3esJa33DvaBY5yGQO9IDmnVF4hjfVQco8y5VUUBQS5KFC40hu5uvXNEXHOeSZFgKAD6H7NH1dD5LzkGpYFsRmhf6ATGk8fRihKylVjkxdvuEpa5CAP0lMn37GdOzRGUilWc2jZ1S/x8Q8d+D7F9JBL6419/2t+RrVay0v9x0axWE6QBaa+tztTvpLQR4OeNmhF6QaL0DL+Nrh+dIvAYnhovJOSe9ICBZFnV3vdp/6q5JZTlLMgs4eKUas3/HiunV+JBrjfDRKNE+JViDLi+vWeYnJJzo1C7TRQUowXLfOAWrAMDesR6MZDNetc+quHt0owehLw7V2XkpQfSVtlBlFebrSJ4oSBlE2Gcx1Brs0ZhD6GWyqg1KwOser7iNVR2WD6jSVx4virXNoIoaVb7qKeqg24VqSh0FXtR2L/dntWMDnhx17ngaqvjENkoatGp8d0qIyuE5aVsgbk3aeYuL1dsB2okEbn+LLhsCJKLB+CheFvLkhzO1D9dOKftg+EzfbtK05dSNP3PaT/5P8h8cWY1bXdSN/xM49JsIhbbMkWo3SPBmjWeiP0mNKbMbRd+K5MWfC9yJ8vR1GnvDYyjcMkYgb3a7P7CgJ8KeIuO2tWLgM7Nhj22XPgDQP8O/WE0K4gVgy5ovARVPS0B1Do7ulRSD85pJd6I7hTPOIM75qL1mMuV4aNIt9FoRXmm2jOLrQ3PM836R5rA1myjqV7KcuYMnyr20Qbm0eJ3+leeiFq6md9g81C4CP3rnrpAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAAAPCAYAAABdjGkdAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADr0AAA69AUf7kK0AAADjSURBVFhH3dbdDYMgFIZhnIQtHICpYAK38l5WalPLRyGxxBh+zqHYJ6F4U61voGGa53kXJ6y14er/uHcOV9+2bRNiv6C19iNEu/XAe+S4DHJ0xzD4vbkhogkf7svZjDF+Xtd12G3lIvh5WRY/F/FZKqE+bjHKqFkRqaYgMMpWag0RNQeJfhmFKgaQBYHeW0hKSRoDSINAryhYka/nIzyVDnkQQBTOLYR7c2EJEnGsFuotkmINAlSrheP/4gx7kKh2tfQKERWfVFuUnHLdqhJKqbrTZoOuQY4QB2FSiAC9Q3wI8QaWk+857592qAAAAABJRU5ErkJggg==\"","module.exports = __webpack_public_path__ + \"static/media/mobile.ad4da8ca.svg\";","module.exports = __webpack_public_path__ + \"static/media/worldwide-icon.34e781d2.svg\";","module.exports = __webpack_public_path__ + \"static/media/whatsapp-icon.206489af.svg\";","module.exports = __webpack_public_path__ + \"static/media/mail-icon.42204d97.svg\";","module.exports = __webpack_public_path__ + \"static/media/hamburger-icon.4f52eb0c.svg\";","module.exports = __webpack_public_path__ + \"static/media/down-arrow-icon.92c2bd56.svg\";","module.exports = __webpack_public_path__ + \"static/media/settings-icon.0fb81750.svg\";","module.exports = __webpack_public_path__ + \"static/media/documents-icon.9bfa4a7c.svg\";","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/ETFSA_On White@3x.c387352f.png\";","import { AppServices } from '@singularsystems/neo-core';\r\nimport { NeoReactTypes } from '@singularsystems/neo-react';\r\nimport { AppConfig } from './Models/AppConfig';\r\nimport { AppDataService } from './Services/AppDataService';\r\nimport { RouteService } from './Services/RouteService';\r\nimport AppLayout from './Services/AppLayout';\r\nimport { ISecurityApiClient } from './ApiClients/SecurityApiClient';\r\nimport HeaderTokenAuthService from './Services/AuthenticationService';\r\nimport { IPortfolioApiClient } from './ApiClients/PortfolioApiClient';\r\nimport { IInvestorApiClient } from './ApiClients/InvestorApiClient';\r\nimport { IInvestorQueryApiClient } from './ApiClients/InvestorQueryApiClient';\r\nimport { IDocumentApiClient } from './ApiClients/DocumentApiClient';\r\nimport { IPoliticalSensitivityApiClient } from './ApiClients/PoliticalSensitivityApiClient';\r\nimport { IProvinceApiClient } from './ApiClients/ProvinceApiClient';\r\nimport { IBankApiClient } from './ApiClients/BankApiClient';\r\nimport { IBankAccountTypeApiClient } from './ApiClients/BankAccountTypeApiClient';\r\nimport { ICountryApiClient } from './ApiClients/CountryApiClient';\r\nimport CurrentInvestorService from './Services/CurrentInvestorService';\r\nimport { ICatalogueApiClient } from './ApiClients/CatalogueApiClient';\r\nimport OldSiteIntegration from './Services/OldSiteIntegration';\r\nimport UserInformationVM from './Views/InformationPanel/UserInformationVM';\r\nimport { IFAQApiClient } from './ApiClients/FAQApiClient';\r\nimport { IStatementApiClient } from './ApiClients/StatementApiClient';\r\nimport { IRecurringTradeRequestApiClient } from './ApiClients/RecurringTradeRequestApiClient';\r\nimport { ITradeRequestApiClient } from './ApiClients/TradeRequestApiClient';\r\nimport { IInstrumentApiClient } from './ApiClients/InstrumentApiClient';\r\nimport OtpService from './Services/OtpService';\r\nimport { IReportingApiClient } from './ApiClients/ReportingApiClient'\r\nimport { ISourceOfFundsApiClient } from './ApiClients/SourceOfFundsApiClient';\r\nimport { ICartApiClient } from './ApiClients/CartApiClient'\r\nimport { IInvestorDocumentApiClient } from './ApiClients/InvestorDocumentApiClient';\r\n\r\nconst Types = {\r\n ApiClients: {\r\n SecurityApiClient: new AppServices.ServiceIdentifier(\"SecurityApiClient\"),\r\n InvestorApiClient: new AppServices.ServiceIdentifier(\"InvestorApiClient\"),\r\n InvestorQueryApiClient: new AppServices.ServiceIdentifier(\"InvestorQueryApiClient\"),\r\n PortfolioApiClient: new AppServices.ServiceIdentifier(\"PortfolioApiClient\"),\r\n DocumentApiClient: new AppServices.ServiceIdentifier(\"DocumentApiClient\"),\r\n InvestorDocumentApiClient: new AppServices.ServiceIdentifier(\"InvestorDocumentApiClient\"),\r\n PoliticalSensitivityApiClient: new AppServices.ServiceIdentifier(\"PoliticalSensitivityApiClient\"),\r\n ProvinceApiClient: new AppServices.ServiceIdentifier(\"ProvinceApiClient\"),\r\n BankApiClient: new AppServices.ServiceIdentifier(\"BankApiClient\"),\r\n BankAccountTypeApiClient: new AppServices.ServiceIdentifier(\"BankAccountTypeApiClient\"),\r\n CountryApiClient: new AppServices.ServiceIdentifier(\"CountryApiClient\"),\r\n CatalogueApiClient: new AppServices.ServiceIdentifier(\"CatalogueApiClient\"),\r\n FAQApiClient: new AppServices.ServiceIdentifier(\"FAQApiClient\"),\r\n StatementApiClient: new AppServices.ServiceIdentifier(\"StatementApiClient\"),\r\n RecurringTradeRequestApiClient: new AppServices.ServiceIdentifier(\"RecurringTradeRequestApiClient\"),\r\n TradeRequestApiClient: new AppServices.ServiceIdentifier(\"TradeRequestApiClient\"),\r\n InstrumentApiClient: new AppServices.ServiceIdentifier(\"InstrumentApiClient\"),\r\n ReportingApiClient: new AppServices.ServiceIdentifier(\"ReportingApiClient\"),\r\n SourceOfFundsApiClient: new AppServices.ServiceIdentifier(\"SourceOfFundsApiClient\"),\r\n CartApiClient: new AppServices.ServiceIdentifier(\"CartApiClient\")\r\n },\r\n Services: {\r\n AppAuthenticationService: AppServices.NeoTypes.Security.AuthenticationService.asType(),\r\n AppDataCache: new AppServices.ServiceIdentifier(\"Services.AppDataCache\"),\r\n AppLayout: new AppServices.ServiceIdentifier(\"Services.AppLayout\"),\r\n RouteService: new AppServices.ServiceIdentifier(\"Services.RouteService\"),\r\n CurrentInvestorService: new AppServices.ServiceIdentifier(\"Services.CurrentInvestorService\"),\r\n OldSiteIntegration: new AppServices.ServiceIdentifier(\"Services.OldSiteIntegration\"),\r\n OtpService: new AppServices.ServiceIdentifier(\"Services.OtpService\"),\r\n UserInformationVM: new AppServices.ServiceIdentifier(\"Services.UserInformationVM\")\r\n },\r\n Config: AppServices.NeoTypes.Config.ConfigModel.asType(),\r\n Neo: NeoReactTypes,\r\n};\r\n\r\nexport default Types;","import { AppServices, Misc } from '@singularsystems/neo-core';\r\nimport Types from '../AppTypes';\r\n \r\nconst AppService: AppServices.IAppService = new AppServices.AppService();\r\n \r\nMisc.Globals.appService = AppService;\r\n \r\nexport { AppService, Types };","export enum InvestorTypes {\r\n Individual = 1,\r\n Minor = 2,\r\n Company = 3,\r\n Trust = 4,\r\n Club_Association_Stokvel = 5\r\n}","import { injectable } from 'inversify';\r\n\r\n@injectable()\r\nexport default class AuthorisationService {\r\n public hasRole(roleName: string) : boolean {\r\n return true;\r\n }\r\n public loadRoles() : Promise {\r\n return Promise.resolve();\r\n }\r\n}","import { Security } from '@singularsystems/neo-core';\r\nimport LoginResult from './LoginResult';\r\n\r\nexport default class AppUser implements Security.IUser {\r\n\r\n constructor(public userInfo: LoginResult) {\r\n\r\n }\r\n\r\n public get userName() {\r\n return this.userInfo.userName;\r\n }\r\n\r\n public get displayName() {\r\n return this.userInfo.fullName;\r\n }\r\n\r\n public get hasExpired() {\r\n return Date.now() >= this.userInfo.tokenInfo.expiryDate!.getTime();\r\n }\r\n\r\n public get accessToken() {\r\n return this.userInfo.tokenInfo.authToken;\r\n }\r\n \r\n public get investorID() : number | null {\r\n return this.userInfo.investorID;\r\n }\r\n}","import { EnumHelper } from \"@singularsystems/neo-core\";\r\n\r\nexport enum OtpType {\r\n Email = 1,\r\n CellNo = 2,\r\n Both = 3\r\n}\r\n\r\nEnumHelper.decorateEnum(OtpType, e => {\r\n e.describe(OtpType.Email, \"Email\", \"email\");\r\n e.describe(OtpType.CellNo, \"SMS\", \"SMS\");\r\n e.describe(OtpType.Both, \"Email and SMS\", \"email and SMS\");\r\n});","import { Attributes, LookupBase, NeoModel } from '@singularsystems/neo-core';\r\n\r\n@NeoModel\r\nexport default class InvestorLinkedPortfolioLookup extends LookupBase {\r\n\r\n public portfolioID: number = 0;\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n public portfolioType: string = \"\";\r\n\r\n public isPrimary: boolean = false;\r\n\r\n public reinvestDividends: boolean = false;\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.Observable()\r\n public pendingReinvestDividends: boolean = false;\r\n\r\n protected onDeserialiseCompleted(wasCreated: boolean): void {\r\n this.pendingReinvestDividends = this.reinvestDividends;\r\n }\r\n}","import { Attributes, EnumHelper, List, LookupBase, NeoModel } from '@singularsystems/neo-core';\r\nimport { InvestorTypes } from '../Registration/Enums/InvestorTypes';\r\nimport InvestorLinkedPortfolioLookup from './InvestorLinkedPortfolioLookup';\r\n\r\n@NeoModel\r\nexport default class InvestorLookup extends LookupBase {\r\n\r\n public investorID: number = 0;\r\n\r\n @Attributes.Observable()\r\n public investorStatusID: number = 0;\r\n\r\n public investorTypeID: number = 0;\r\n\r\n public firstName: string = \"\";\r\n\r\n public lastName: string = \"\";\r\n\r\n public hasRecurringTradeRequest: boolean = false;\r\n\r\n public ficaVerified: boolean = false;\r\n\r\n @Attributes.Observable()\r\n public portfolioList = new List(InvestorLinkedPortfolioLookup);\r\n\r\n // Client only properties / methods\r\n\r\n public get investorType() {\r\n return EnumHelper.getItemMetadata(InvestorTypes, this.investorTypeID).display;\r\n }\r\n\r\n public get fullName() {\r\n return `${this.firstName} ${this.lastName}`;\r\n }\r\n}","import { Attributes, DateUtils, LookupBase, Misc, ModelBase, NeoModel, Rules } from '@singularsystems/neo-core';\r\nimport InvestorLookup from '../Investors/InvestorLookup';\r\nimport { OtpType } from '../Registration/Enums/OtpType';\r\n\r\n@NeoModel\r\nexport class TokenInfo extends LookupBase {\r\n\r\n public authToken: string = \"\";\r\n\r\n /**\r\n * Gets the no of seconds until the token expires.\r\n */\r\n @Attributes.Integer()\r\n public expiresIn: number = 0;\r\n\r\n // Client only properties / methods\r\n \r\n @Attributes.Date()\r\n private createdOn = new Date();\r\n\r\n @Attributes.Date()\r\n public get expiryDate(): Date {\r\n return DateUtils.add(this.createdOn, { seconds: this.expiresIn });\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport default class LoginResult extends ModelBase {\r\n\r\n @Attributes.ChildObject(TokenInfo)\r\n public tokenInfo!: TokenInfo;\r\n\r\n public userID: number = 0;\r\n\r\n public userName: string = \"\";\r\n\r\n public fullName: string = \"\";\r\n\r\n public administrator: boolean = false;\r\n\r\n @Attributes.Date()\r\n @Rules.Required()\r\n public passwordChangeDate: Date | null = null;\r\n\r\n public emailAddress: string = \"\";\r\n\r\n public cellNo: string = \"\";\r\n\r\n public otpType: OtpType = OtpType.Email;\r\n\r\n public firstTimeLogin: boolean = false;\r\n\r\n @Attributes.Nullable()\r\n public investorID: number | null = 0;\r\n\r\n @Attributes.Nullable()\r\n @Attributes.Serialisation(Misc.SerialiseType.FullOnly)\r\n @Attributes.ChildObject(InvestorLookup)\r\n public investor: InvestorLookup | null = null;\r\n\r\n // Client only properties / methods\r\n\r\n public pendingOtpType: OtpType | null = null;\r\n\r\n public get displayOtpType() {\r\n return this.otpType;\r\n }\r\n public set displayOtpType(value: OtpType) {\r\n this.pendingOtpType = value;\r\n }\r\n\r\n public get canChangeOtpType() {\r\n return !!this.emailAddress && !!this.cellNo;\r\n }\r\n}","export enum NotificationDuration {\r\n Short = 1,\r\n Standard = 4,\r\n Long = 8\r\n}","import { Views } from \"@singularsystems/neo-react\";\r\nimport { AppService, Types } from \"../Services/AppService\";\r\n\r\nexport default abstract class ETInvestorVMBase extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public investorService = AppService.get(Types.Services.CurrentInvestorService),\r\n public oldSiteIntegration = AppService.get(Types.Services.OldSiteIntegration)) {\r\n super(taskRunner);\r\n }\r\n\r\n public get investorInfo () {\r\n return this.investorService.investorData!.investor;\r\n }\r\n\r\n public get portfolioBalance() {\r\n return this.investorService.portfolioData?.portfolioBalance ?? null;\r\n }\r\n}","import { Views } from \"@singularsystems/neo-react\";\r\nimport { RouteParameterObject } from \"@singularsystems/neo-react/dist/Routing/IRouteParameter\";\r\nimport ETInvestorVMBase from './ETInvestorVMBase';\r\n\r\ntype SidebarType = \"main-logo\" | \"menu\" | \"none\";\r\n\r\nexport interface IETViewBase {\r\n readonly hideHeader: boolean;\r\n readonly sidebarType: SidebarType;\r\n}\r\n\r\nexport default class ETViewBase = {}> extends Views.ViewBase {\r\n\r\n public hideHeader = false;\r\n public sidebarType: SidebarType = \"menu\";\r\n \r\n public get requiresInvestor() {\r\n return this.viewModel instanceof ETInvestorVMBase;\r\n }\r\n}","import { observable, action } from 'mobx';\r\nimport { Utils } from '@singularsystems/neo-core';\r\nimport { injectable } from 'inversify';\r\nimport { IETViewBase } from '../Views/ETViewBase';\r\nimport { Views } from '@singularsystems/neo-react';\r\n\r\nexport enum ScreenSize {\r\n ExtraSmall = 1,\r\n Small = 2,\r\n Medium = 3,\r\n Large = 4,\r\n ExtraLarge = 5,\r\n Huge = 6\r\n}\r\n\r\n/**\r\n * Contains logic about the layout of the app. E.g. screensize, theme etc.\r\n * Use AppLayout.current for the singleton instance.\r\n */\r\n@injectable()\r\nexport default class AppLayout {\r\n\r\n public static get globalTaskRunner() {\r\n return Views.ViewBase.currentView?.taskRunner;\r\n }\r\n\r\n @observable.ref\r\n public currentScreenSize = ScreenSize.Medium;\r\n\r\n @observable.ref\r\n public isScrollTop = true;\r\n\r\n @observable.ref\r\n public showMobileMenu = false;\r\n\r\n public get sidebarType() {\r\n return (Views.ViewBase.currentView as unknown as IETViewBase)?.sidebarType ?? \"menu\";\r\n }\r\n\r\n public get showHeader() {\r\n return !(Views.ViewBase.currentView as unknown as IETViewBase)?.hideHeader;\r\n }\r\n\r\n constructor() {\r\n window.addEventListener(\"resize\", this.onWindowResize.bind(this));\r\n \r\n document.addEventListener(\"scroll\", () => {\r\n // This event is fired a lot, which is why we are using peek().\r\n if ((window.scrollY === 0) !== Utils.peek(this, \"isScrollTop\")) {\r\n this.isScrollTop = window.scrollY === 0;\r\n }\r\n });\r\n }\r\n\r\n @action\r\n private onWindowResize() {\r\n \r\n if (window.innerWidth <= 576) {\r\n this.currentScreenSize = ScreenSize.ExtraSmall;\r\n } else if (window.innerWidth <= 768) {\r\n this.currentScreenSize = ScreenSize.Small;\r\n } else if (window.innerWidth <= 992) {\r\n this.currentScreenSize = ScreenSize.Medium;\r\n } else if (window.innerWidth <= 1200) {\r\n this.currentScreenSize = ScreenSize.Large;\r\n } else if (window.innerWidth <= 1360) {\r\n this.currentScreenSize = ScreenSize.ExtraLarge;\r\n } else {\r\n this.currentScreenSize = ScreenSize.Huge;\r\n }\r\n\r\n this.setContentHeight();\r\n this.setContainerMargin();\r\n }\r\n\r\n private header?: HTMLDivElement;\r\n private footer?: HTMLDivElement;\r\n private contentPanel?: HTMLDivElement;\r\n\r\n public setup() {\r\n this.header = document.getElementById(\"header-panel\") as HTMLDivElement;\r\n this.footer = document.getElementById(\"footer-panel\") as HTMLDivElement;\r\n this.contentPanel = document.getElementById(\"content-panel\") as HTMLDivElement;\r\n\r\n this.onWindowResize();\r\n }\r\n\r\n private setContentHeight() {\r\n if (this.contentPanel) {\r\n let headerHeight = 0;\r\n if (this.header) {\r\n headerHeight = this.header.clientHeight + parseInt(window.getComputedStyle(this.header).marginBottom);\r\n }\r\n this.contentPanel.style.minHeight = (window.innerHeight - headerHeight - this.footer!.clientHeight - 1) + \"px\";\r\n }\r\n }\r\n\r\n private setContainerMargin() {\r\n\r\n // Due to the fixed left menu, the bootstrap container needs to be shifted to the right, and narrowed when the screen gets too small.\r\n // Below the medium breakpoint, the menu will be hidden by default, so the behaviour only applies above this size.\r\n const containers = document.querySelectorAll(\".container\");\r\n \r\n const first = containers[0];\r\n if (first) {\r\n containers.forEach(c => (c as HTMLElement).style.width = \"100%\");\r\n const menuHidden = window.innerWidth <= 768;\r\n\r\n const windowWidth = window.innerWidth - 17;\r\n const remainingSpace = windowWidth - first.getBoundingClientRect().width;\r\n\r\n containers.forEach(c => {\r\n const element = c as HTMLElement;\r\n element.style.marginLeft = remainingSpace < 140 && !menuHidden ? \"70px\" : \"auto\";\r\n if (remainingSpace <= 70 && !menuHidden) {\r\n element.style.width = (windowWidth - 70) + \"px\";\r\n }\r\n });\r\n }\r\n }\r\n}","import { ModelBase } from \"@singularsystems/neo-core\";\r\n\r\nexport default abstract class APIModelBase extends ModelBase {\r\n\r\n}","import { NeoModel, Validation, Rules, Attributes } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class LoginDetails extends APIModelBase {\r\n\r\n @Rules.Required()\r\n @Attributes.Display(\"Username\")\r\n public userName: string = \"\";\r\n\r\n @Rules.Required()\r\n public password: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.userName) {\r\n return \"New login details\";\r\n } else {\r\n return this.userName;\r\n }\r\n }\r\n}","import { Utils } from '@singularsystems/neo-core';\r\nimport React from 'react';\r\nimport PopoutArrow from \"../../assets/img/arrow.svg\";\r\n\r\nexport interface IPopoverProps {\r\n anchorElement: HTMLElement;\r\n alignment: \"center\" | \"right\";\r\n onHide: (isInPopover: boolean) => void;\r\n yOffset: number;\r\n className?: string;\r\n maxElementNesting?: number;\r\n}\r\n\r\nexport default class Popover extends React.Component {\r\n\r\n constructor(props: IPopoverProps) {\r\n super(props);\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this);\r\n }\r\n\r\n private popoverRef = React.createRef();\r\n\r\n componentDidMount() {\r\n window.addEventListener(\"mousedown\", this.onMouseDown);\r\n\r\n const anchor = this.props.anchorElement;\r\n\r\n if (this.popoverRef.current) {\r\n\r\n const anchorRect = anchor.getBoundingClientRect();\r\n const thisRect = this.popoverRef.current.getBoundingClientRect();\r\n\r\n const left = this.props.alignment === \"center\" ?\r\n anchor.offsetLeft + (anchorRect.width / 2) - (thisRect.width / 2) :\r\n anchor.offsetLeft + anchorRect.width - thisRect.width;\r\n this.popoverRef.current.style.left = left + \"px\";\r\n\r\n const top = anchor.offsetTop + anchorRect.height + this.props.yOffset + 10; // Add arrow height\r\n this.popoverRef.current.style.top = top + \"px\";\r\n }\r\n\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener(\"mousedown\", this.onMouseDown);\r\n }\r\n\r\n private onMouseDown(e: MouseEvent) {\r\n let target = e.target as HTMLElement | null;\r\n let level = 0;\r\n do {\r\n if (target === this.props.anchorElement || target === this.popoverRef.current) {\r\n return;\r\n }\r\n target = target!.parentElement;\r\n } while (target && ++level < (this.props.maxElementNesting ? this.props.maxElementNesting : 5))\r\n\r\n this.props.onHide(false);\r\n }\r\n\r\n public render() {\r\n\r\n return (\r\n
this.props.onHide(true)}>\r\n \"\"\r\n
\r\n {this.props.children}\r\n
\r\n
\r\n )\r\n }\r\n}","import { observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport Popover from './Popover';\r\n\r\ninterface IPopoverButtonProps {\r\n menuItems: IPopoverMenuItem[];\r\n dropDownClassName?: string;\r\n}\r\n\r\nexport interface IPopoverMenuItem {\r\n text: string;\r\n subText?: string;\r\n onClick: () => void;\r\n isDivider?: boolean;\r\n}\r\n\r\n@observer\r\nexport default class PopoverButton extends React.Component {\r\n \r\n private anchorRef = React.createRef();\r\n\r\n @observable\r\n private show = false;\r\n\r\n public render() {\r\n\r\n return (\r\n <>\r\n
this.show = !this.show}>\r\n \r\n
\r\n {this.show && this.anchorRef.current && \r\n this.show = false} yOffset={10} className={this.props.dropDownClassName}>\r\n {this.props.menuItems.map(menuItem => (\r\n <>\r\n {menuItem.isDivider &&
}\r\n
\r\n {menuItem.text}\r\n {menuItem.subText && {menuItem.subText}}\r\n
\r\n \r\n ))}\r\n }\r\n \r\n )\r\n }\r\n}","export enum InvestmentType {\r\n OnceOffInvestment = 1,\r\n RecurringInvestment = 2\r\n}","export enum PaymentType {\r\n EFT = 1,\r\n OnceOffCollection = 2\r\n}","export enum InvestableType {\r\n Instrument =\t1,\r\n ModelPortfolio = 2\r\n}","import { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport PopoverButton from '../../../App/Components/PopoverButton';\r\nimport { AppService, Types } from \"../../../Services/AppService\";\r\nimport InvestorLinkedPortfolioLookup from '../../../Models/Investors/InvestorLinkedPortfolioLookup';\r\nimport AppLayout from '../../../Services/AppLayout';\r\n\r\ninterface IInvestmentSelectionComponentProps {\r\n hideInvestmentType?: boolean;\r\n}\r\n\r\n@observer\r\nexport default class InvestmentSelectionComponent extends React.Component {\r\n\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService);\r\n\r\n private onPortfolioClick(portfolio: InvestorLinkedPortfolioLookup) {\r\n this.investorService.investorData!.selectedPortfolio = portfolio;\r\n AppLayout.globalTaskRunner!.waitFor(this.investorService.getPortfolioAsync());\r\n }\r\n\r\n public render() {\r\n const investorData = this.investorService.investorData,\r\n investorInfo = investorData?.investor;\r\n\r\n return investorInfo && (\r\n
\r\n
\r\n
\r\n

{investorInfo.investorType} Account

\r\n {} }]} />\r\n
\r\n
\r\n {investorInfo.fullName}\r\n
\r\n
\r\n {!this.props.hideInvestmentType &&
\r\n
\r\n

Investment Type

\r\n ({ text: p.portfolioType, onClick: () => this.onPortfolioClick(p) }))} />\r\n
\r\n
\r\n {investorData!.selectedPortfolio?.portfolioType ?? \"\"}\r\n
\r\n
}\r\n
\r\n )\r\n }\r\n}","import { Attributes, DateUtils, Misc, NeoModel, Rules, Validation, ValueObject } from '@singularsystems/neo-core';\r\n\r\n@NeoModel\r\nexport default class StatementCriteria extends ValueObject {\r\n\r\n @Rules.Required()\r\n @Attributes.Display(\"Investment Type\")\r\n public portfolioTypeId: number = 0;\r\n\r\n @Rules.Required()\r\n @Attributes.Date(Misc.TimeZoneFormat.None)\r\n public startDate: Date | null = DateUtils.monthStart(new Date());\r\n\r\n @Rules.Required()\r\n @Attributes.Date(Misc.TimeZoneFormat.None)\r\n public endDate: Date | null = DateUtils.today();\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n return \"Statement Criteria\";\r\n }\r\n}","import { NeoModel } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class InvestorOTPDetails extends ApiModelBase {\r\n\r\n public emailAddress: string = \"\";\r\n\r\n public cellNo: string = \"\";\r\n\r\n public otpMethod: number = 0;\r\n}","import { ModelBase } from \"@singularsystems/neo-core\";\r\n\r\nexport default class APIModelBase extends ModelBase {\r\n\r\n // Client only properties / methods\r\n}","import { Attributes, LookupBase, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class TradeCost extends APIModelBase {\r\n\r\n @Attributes.Float()\r\n public strateCostPercentage: number = 0;\r\n\r\n @Attributes.Float()\r\n public strateCostMin: number = 0;\r\n\r\n @Attributes.Float()\r\n public strateCostMax: number = 0;\r\n\r\n @Attributes.Float()\r\n public investorProtectionLevy: number = 0;\r\n\r\n @Attributes.Float()\r\n public vat: number = 0;\r\n\r\n @Attributes.Float()\r\n public stt: number = 0;\r\n\r\n @Attributes.Float()\r\n public csdpCost: number = 0;\r\n\r\n @Attributes.Float()\r\n public brokerage: number = 0;\r\n\r\n @Attributes.Float()\r\n public moneyMarkedRate: number = 0;\r\n\r\n @Attributes.Float()\r\n public minLumpSumAmount: number = 0;\r\n\r\n @Attributes.Float()\r\n public annualContributionLimit: number = 0;\r\n\r\n @Attributes.Integer()\r\n public instrumentMinimumTradeValue: number = 0;\r\n\r\n @Attributes.Integer()\r\n public maximumTradeValue: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n public getBrokerage(tradeAmount: number): number {\r\n return Math.round(this.brokerage * tradeAmount * 100) / 100;\r\n }\r\n\r\n public getStrateFee(tradeAmount: number): number {\r\n return Math.round(Math.min(this.strateCostMax, Math.max(this.strateCostMin, tradeAmount * this.strateCostPercentage)) * 100) / 100;\r\n }\r\n\r\n public getFees(tradeAmount: number, feeMultiplier?: number | null): TradeFees {\r\n // trade fees multiplier for model portfolios, as multiple instruments are traded\r\n const effectiveMultiplier = Math.max(1, feeMultiplier ?? 1);\r\n const brokerage = this.getBrokerage(tradeAmount);\r\n const strateFee = this.getStrateFee(tradeAmount) * effectiveMultiplier;\r\n\r\n const fees = new TradeFees();\r\n fees.brokerage = brokerage;\r\n fees.strateFee = strateFee;\r\n fees.vat = Math.round((brokerage + strateFee) * this.vat * 100) / 100;\r\n return fees;\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew) {\r\n return \"New trade cost\";\r\n } else {\r\n return \"Trade Cost\";\r\n }\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class TradeFees extends LookupBase {\r\n\r\n @Attributes.Float()\r\n public brokerage: number = 0;\r\n\r\n @Attributes.Float()\r\n public strateFee: number = 0;\r\n\r\n @Attributes.Float()\r\n public vat: number = 0;\r\n\r\n @Attributes.Float()\r\n public get totalFees() {\r\n return this.brokerage + this.strateFee + this.vat;\r\n }\r\n}","export enum FicaStatus {\r\n NotSent = 1,\r\n Pending = 2,\r\n Rejected = 3,\r\n Approved = 4\r\n}","import { NeoModel, ModelBase, Attributes, Validation } from \"@singularsystems/neo-core\";\r\nimport { InvestableType } from \"../Base/Enums/InvestableType\";\r\nimport { TradeFees } from \"../Base/TradeCost\";\r\nimport { Switch, TradeRequest } from '../Base/TradeRequest';\r\nimport Instrument from \"./Instrument\";\r\n\r\nclass InstrumentDetail extends ModelBase {\r\n\r\n public instrumentID: number = 0;\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public instrument: string = \"\";\r\n\r\n @Attributes.NoTracking()\r\n public estimatedUnits: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public hasTradeCosts: boolean = true\r\n\r\n @Attributes.NoTracking()\r\n public tradeFees = new TradeFees();\r\n\r\n @Attributes.NoTracking()\r\n public instrumentMinimumTradeValue: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public minimumRandValue: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public minimumTradeValue: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public minimumEstimatedUnits: number = 1;\r\n\r\n @Attributes.NoTracking()\r\n public tradeCostMultiplier: number = 1;\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => c.instrumentID === null, \"Please choose an instrument.\");\r\n rules.failWhen(c => c.amount < c.minimumRandValue, \"Minimum amount has not been reached for this instrument. Please enter a higher amount.\");\r\n rules.failWhen(c => c.amount < c.minimumTradeValue, c => `Make sure the entered amount has reached R${c.instrumentMinimumTradeValue} for this instrument.`);\r\n rules.failWhen(c => c.estimatedUnits < c.minimumEstimatedUnits, `Estimated units need to be more than ${this.minimumEstimatedUnits}, please increase the amount for this instrument or choose a different instrument.`);\r\n }\r\n\r\n public setTradeValues(instrument: Instrument) {\r\n\r\n this.instrumentMinimumTradeValue = instrument.minimumInvestmentAmount;\r\n this.minimumRandValue = instrument.minimumInvestmentAmount;\r\n\r\n if (instrument.investableTypeID === InvestableType.ModelPortfolio) {\r\n this.minimumEstimatedUnits = 0; // model portfolios won't have a buy price, thus the estimated units shouldn't be validated\r\n this.tradeCostMultiplier = Math.max(1, instrument.underlyingInstrumentsCount);\r\n } else {\r\n this.tradeCostMultiplier = 1;\r\n }\r\n\r\n this.minimumTradeValue = this.minimumRandValue;\r\n this.minimumRandValue = this.minimumRandValue > instrument.buyPrice ? this.minimumRandValue : instrument.buyPrice;\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class SwitchInstrumentDetail extends InstrumentDetail {\r\n\r\n @Attributes.NoTracking()\r\n public percentage: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public minimumTradePercentage: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public minimumPercentageValue: number = 0;\r\n\r\n protected addBusinessRules(rules: Validation.Rules): void {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => c.percentage < c.minimumPercentageValue, \"Minimum amount has not been reached for this instrument. Please enter a higher percentage.\").onProperties(c => c.percentage);\r\n rules.failWhen(c => c.percentage < c.minimumTradePercentage, c => `Make sure the entered percentage equates to a trade amount of at least R${c.instrumentMinimumTradeValue}.`).onProperties(c => c.percentage);\r\n }\r\n\r\n public setSwitchTradeValues(parentSwitch: Switch, instrument: Instrument) {\r\n\r\n this.setTradeValues(instrument);\r\n this.amount = Math.trunc(this.amount * 100) / 100;\r\n this.minimumTradePercentage = this.minimumTradeValue / parentSwitch.valueAvailable;\r\n this.minimumPercentageValue = this.minimumRandValue / parentSwitch.valueAvailable;\r\n\r\n // Set estimated units and trade fees\r\n if (this.amount > 0) {\r\n this.tradeFees = instrument.hasTradeCosts ? parentSwitch.tradeCosts.getFees(this.amount, instrument.underlyingInstrumentsCount) : new TradeFees();\r\n\r\n if (instrument.investableTypeID === InvestableType.Instrument) {\r\n var estimatedUnitsCalculation = 0;\r\n var sellAmountFees = this.tradeFees.totalFees;\r\n var sellAmountMinusFees = this.amount - sellAmountFees;\r\n\r\n estimatedUnitsCalculation = ((sellAmountMinusFees * this.amount / this.amount) - this.tradeFees.totalFees) / instrument.buyPrice;\r\n this.estimatedUnits = instrument.buyPrice > 0 ? Math.floor(estimatedUnitsCalculation) : 0;\r\n } else {\r\n this.estimatedUnits = 0;\r\n }\r\n }\r\n\r\n parentSwitch.setTradeFees(parentSwitch.underlyingInstrumentsCount);\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class PurchaseInstrumentDetail extends InstrumentDetail {\r\n\r\n protected addBusinessRules(rules: Validation.Rules): void {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public setPurchaseTradeValues(tradeRequest: TradeRequest, instrument: Instrument) {\r\n\r\n this.setTradeValues(instrument);\r\n\r\n // Set estimated units and trade fees\r\n if (this.amount > 0) {\r\n this.tradeFees = instrument.hasTradeCosts ? tradeRequest.tradeCosts.getFees(this.amount, instrument.underlyingInstrumentsCount) : new TradeFees();\r\n\r\n if (instrument.investableTypeID === InvestableType.Instrument) {\r\n var estimatedUnitsCalculation = (this.amount - tradeRequest.tradeFees.totalFees) / instrument.buyPrice;\r\n this.estimatedUnits = instrument.buyPrice > 0 ? Math.floor(estimatedUnitsCalculation) : 0;\r\n } else {\r\n this.estimatedUnits = 0;\r\n }\r\n }\r\n\r\n tradeRequest.calculateFees();\r\n }\r\n}","import { Attributes, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from './APIModelBase';\r\n\r\nexport default abstract class PurchaseTradeRequestBase extends APIModelBase {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n @Attributes.Nullable()\r\n public sourceOfFundsID: number | null = null;\r\n\r\n public sourceOfFundsAdditionalInfo: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n}","import { Attributes, List, LookupBase, Misc, NeoModel, NumberUtils, Rules, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\nimport { PurchaseInstrumentDetail } from '../Instruments/InstrumentDetail';\r\nimport PurchaseTradeRequestBase from '../Library/PurchaseTradeRequestBase';\r\nimport TradeCost, { TradeFees } from './TradeCost';\r\nimport { InvestableType } from './Enums/InvestableType';\r\n\r\n@NeoModel\r\nexport class RecurringTradeRequest extends PurchaseTradeRequestBase {\r\n\r\n @Attributes.Integer()\r\n public debitOrderDay: number = 0;\r\n\r\n public instruments = new List(RecurringTradeRequestDetail);\r\n\r\n public otp: string = \"\";\r\n\r\n // Client only properties / methods\r\n \r\n @Attributes.NoTracking()\r\n public hasSentOtp = false;\r\n\r\n public pendingDebitOrderDay: number = 0;\r\n\r\n public get totalDebitOrderAmount() {\r\n return this.instruments.sum(c => c.amount);\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n rules.failWhen(c => c.hasSentOtp && !c.otp, \"Please enter your one time pin.\").onProperties(c => c.otp);\r\n }\r\n\r\n protected onDeserialiseCompleted(wasCreated: boolean): void {\r\n this.pendingDebitOrderDay = this.debitOrderDay;\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew) {\r\n return \"New recurring trade request\";\r\n } else {\r\n return \"Recurring Trade Request\";\r\n }\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class RecurringTradeRequestDetail extends LookupBase {\r\n\r\n public instrumentID: number = 0;\r\n\r\n public instrumentName: string = \"\";\r\n\r\n @Attributes.Observable()\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@NeoModel\r\nexport class RecurringTradeRequestPost extends PurchaseTradeRequestBase {\r\n\r\n @Attributes.Integer()\r\n public debitOrderDay: number = 0;\r\n\r\n @Attributes.Nullable()\r\n public selectedInstruments = new List(PurchaseInstrumentDetail)\r\n\r\n public otp: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.Float()\r\n @Attributes.NoTracking()\r\n public amount: number = 0;\r\n \r\n @Attributes.NoTracking()\r\n public tradeCosts: TradeCost | null = null;\r\n\r\n @Attributes.NoTracking()\r\n public instrumentName: string = \"\";\r\n\r\n @Attributes.NoTracking()\r\n public hasSentOtp = false;\r\n\r\n @Attributes.NoTracking()\r\n public investableType: InvestableType | null = null;\r\n\r\n @Attributes.NoTracking()\r\n public minimumInvestmentAmount: number = 0;\r\n\r\n public get fees() {\r\n return this.tradeCosts?.getFees(this.amount) ?? new TradeFees();\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => c.amount <= 0, \"Please enter an amount above zero.\");\r\n rules.failWhen(c => c.amount > c.tradeCosts?.maximumTradeValue!, c => `The entered amount is above the ${NumberUtils.format(c.tradeCosts?.maximumTradeValue!, Misc.NumberFormat.CurrencyDecimals)} limit.`)\r\n rules.failWhen(c => c.amount < c.minimumInvestmentAmount!, c => `The entered amount is below the minimum trade value of ${NumberUtils.format(c.minimumInvestmentAmount, Misc.NumberFormat.CurrencyDecimals)}.`)\r\n rules.failWhen(c => c.hasSentOtp && !c.otp, \"Please enter a one time pin.\").onProperties(c => c.otp);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.otp) {\r\n return \"New recurring trade request post\";\r\n } else {\r\n return this.otp;\r\n }\r\n }\r\n}\r\n@NeoModel\r\nexport class RecurringTradeRequestCancel extends ApiModelBase {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n public instrumentID: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew) {\r\n return \"New recurring trade request cancel\";\r\n } else {\r\n return \"Recurring Trade Request Cancel\";\r\n }\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class DebitOrderDays extends ApiModelBase {\r\n\r\n @Attributes.Integer()\r\n public dayOfMonth: number = 0;\r\n\r\n public description: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.description) {\r\n return \"New debit order days\";\r\n } else {\r\n return this.description;\r\n }\r\n }\r\n}\r\n@NeoModel\r\nexport class TAUDebitOrder extends ApiModelBase {\r\n public contractNumber: string = \"\";\r\n\r\n public selfLink: string = \"\";\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n @Rules.Required()\r\n @Attributes.Date(Misc.TimeZoneFormat.None)\r\n public startDate: Date | null = null;\r\n\r\n @Attributes.Date(Misc.TimeZoneFormat.None)\r\n public nextCollectionDate: Date | null = null;\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.contractNumber) {\r\n return \"New tau debit order\";\r\n } else {\r\n return this.contractNumber;\r\n }\r\n }\r\n}","import { Attributes, List, Misc, NeoModel, NumberUtils, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\nimport { InvestmentType } from '../Registration/Enums/InvestmentType';\r\nimport { PaymentType } from '../Registration/Enums/PaymentType';\r\nimport TradeCost, { TradeFees } from './TradeCost';\r\nimport { PurchaseInstrumentDetail, SwitchInstrumentDetail } from '../Instruments/InstrumentDetail';\r\nimport { RecurringTradeRequestPost } from './RecurringTradeRequest';\r\nimport PurchaseTradeRequestBase from '../Library/PurchaseTradeRequestBase';\r\n\r\n@NeoModel\r\nexport class TradeRequest extends PurchaseTradeRequestBase {\r\n\r\n @Attributes.OnChanged(c => c.investmentTypeChange, false)\r\n public investmentTypeID: InvestmentType = InvestmentType.OnceOffInvestment;\r\n\r\n public paymentMethodID: PaymentType = PaymentType.EFT;\r\n\r\n public debitOrderDay: number = 0;\r\n\r\n public otp: string = \"\";\r\n\r\n public selectedInstruments = new List(PurchaseInstrumentDetail);\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public isSourceOfFundsAdditionalInfoRequired: boolean = false;\r\n\r\n @Attributes.NoTracking()\r\n public initialSourceOfFundsID: number | null = null;\r\n\r\n @Attributes.NoTracking()\r\n public initialSourceOfFundsAdditionalInfo: string = \"\";\r\n\r\n public get totalPurchaseAmount() {\r\n return this.selectedInstruments.sum(c => c.amount);\r\n }\r\n\r\n public get estimatedFinalAmount() {\r\n return this.totalPurchaseAmount - this.tradeFees.totalFees;\r\n }\r\n\r\n public static validTradeRules: Validation.IRule | null = null;\r\n\r\n @Attributes.NoTracking()\r\n public get hasTradeCosts() {\r\n return this.selectedInstruments.sum(c => c.tradeFees.totalFees) > 0;\r\n }\r\n\r\n @Attributes.NoTracking()\r\n public tradeCosts = new TradeCost();\r\n\r\n @Attributes.NoTracking()\r\n public tradeFees = new TradeFees();\r\n\r\n @Attributes.NoTracking()\r\n public valueAvailable: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public instrumentName: string = \"\";\r\n\r\n @Attributes.NoTracking()\r\n public hasAcceptedTermsAndConditions: boolean = false;\r\n\r\n @Attributes.NoTracking()\r\n public hasAcceptedDebitOrderAuthority: boolean = false;\r\n\r\n private investmentTypeChange() {\r\n if (this.investmentTypeID === InvestmentType.RecurringInvestment) {\r\n this.paymentMethodID = PaymentType.OnceOffCollection;\r\n this.sourceOfFundsID = this.initialSourceOfFundsID;\r\n this.sourceOfFundsAdditionalInfo = this.initialSourceOfFundsAdditionalInfo;\r\n }\r\n }\r\n\r\n public toPurchase(): Purchase {\r\n return Purchase.mapFrom(this);\r\n }\r\n\r\n public toRecurringTradeRequest(): RecurringTradeRequestPost {\r\n let recurringTradeRequest = new RecurringTradeRequestPost();\r\n\r\n recurringTradeRequest.portfolioTypeID = this.portfolioTypeID;\r\n recurringTradeRequest.debitOrderDay = this.debitOrderDay;\r\n recurringTradeRequest.otp = this.otp;\r\n recurringTradeRequest.sourceOfFundsID = this.sourceOfFundsID;\r\n recurringTradeRequest.sourceOfFundsAdditionalInfo = this.sourceOfFundsAdditionalInfo;\r\n\r\n this.selectedInstruments.forEach(c => {\r\n let instrument = new PurchaseInstrumentDetail();\r\n\r\n instrument.instrumentID = c.instrumentID;\r\n instrument.amount = c.amount;\r\n recurringTradeRequest.selectedInstruments.push(instrument);\r\n });\r\n\r\n return recurringTradeRequest;\r\n }\r\n\r\n public ensureAtLeastOneInstrument() {\r\n if (this.selectedInstruments.length === 0) {\r\n this.selectedInstruments.addNew();\r\n }\r\n this.calculateFees();\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n TradeRequest.validTradeRules = rules.add(this.validTradeRules);\r\n }\r\n\r\n validTradeRules(rule: Validation.IRuleContext): void {\r\n if (this.selectedInstruments.length === 0) {\r\n rule.addError(\"Please choose an instrument to purchase.\");\r\n } else {\r\n if (this.selectedInstruments.some(c => c.amount <= 0)) {\r\n rule.addError(\"The amounts entered are too low. Please enter higher amounts.\");\r\n }\r\n if ((this.investmentTypeID === InvestmentType.RecurringInvestment || this.paymentMethodID === PaymentType.OnceOffCollection) && this.selectedInstruments.some(c => c.amount > this.tradeCosts.maximumTradeValue)) {\r\n rule.addError(`The entered amount is above the ${NumberUtils.format(this.tradeCosts.maximumTradeValue, Misc.NumberFormat.CurrencyDecimals)} limit.`);\r\n }\r\n if (this.investmentTypeID === InvestmentType.RecurringInvestment && this.debitOrderDay === 0) {\r\n rule.addError(\"The debit order day is required.\");\r\n }\r\n }\r\n\r\n if (!this.sourceOfFundsID || (this.isSourceOfFundsAdditionalInfoRequired && this.sourceOfFundsAdditionalInfo.trim() === \"\")) {\r\n rule.addError(\"Please specify the source of funds and the additional info if applicable.\");\r\n }\r\n\r\n if (!this.isSourceOfFundsAdditionalInfoRequired && this.sourceOfFundsAdditionalInfo.trim() !== \"\") {\r\n rule.addError(\"Please remove the source of funds additional info.\");\r\n }\r\n }\r\n\r\n calculateFees() {\r\n let tradeFees = new TradeFees();\r\n\r\n this.selectedInstruments.forEach(e => {\r\n if (e.instrumentID !== null) {\r\n tradeFees.brokerage += e.tradeFees.brokerage;\r\n tradeFees.strateFee += e.tradeFees.strateFee;\r\n tradeFees.vat += e.tradeFees.vat;\r\n }\r\n });\r\n\r\n this.tradeFees = tradeFees;\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class Purchase extends PurchaseTradeRequestBase {\r\n\r\n public paymentMethodID: PaymentType = PaymentType.EFT;\r\n\r\n public otp: string = \"\";\r\n\r\n public selectedInstruments = new List(PurchaseInstrumentDetail);\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@NeoModel\r\nexport class Sale extends APIModelBase {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n public instrumentID: number = 0;\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n public otp: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public tradeCosts = new TradeCost();\r\n\r\n @Attributes.NoTracking()\r\n public tradeFees = new TradeFees();\r\n\r\n @Attributes.NoTracking()\r\n public valueAvailable: number = 0;\r\n\r\n get isAboveThreshold() : boolean {\r\n return this.amount >= (this.valueAvailable * 0.9) && this.amount <= this.valueAvailable;\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => c.amount <= 0, \"The withdrawal amount can't be 0 or less. Please enter a higher amount.\");\r\n rules.failWhen(c => c.amount < c.tradeFees.totalFees, \"The withdrawal amount is lower than the total fees. Please enter a higher amount.\");\r\n rules.failWhen(c => c.amount > c.valueAvailable, \"The withdrawal amount exceeds the amount in this account. Please enter a lower amount.\");\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.otp) {\r\n return \"New sale\";\r\n } else {\r\n return this.otp;\r\n }\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class Switch extends APIModelBase {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n @Attributes.Integer()\r\n public instrumentID_From: number = 0;\r\n\r\n public switchToInstrumentDetails = new List(SwitchInstrumentDetail);\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n public otp: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public tradeCosts = new TradeCost();\r\n\r\n @Attributes.NoTracking()\r\n public tradeFees = new TradeFees();\r\n\r\n @Attributes.NoTracking()\r\n public valueAvailable: number = 0;\r\n\r\n @Attributes.NoTracking()\r\n public instrumentName: string = \"\";\r\n\r\n @Attributes.NoTracking()\r\n public hasTradeCosts: boolean = true;\r\n\r\n @Attributes.NoTracking()\r\n public underlyingInstrumentsCount: number = 0;\r\n\r\n get isAboveThreshold() : boolean {\r\n return this.amount >= (this.valueAvailable * 0.9) && this.amount <= this.valueAvailable;\r\n }\r\n \r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n Switch.validTradeRules = rules.add(this.validTradeRules);\r\n }\r\n\r\n private validTradeRules(rule: Validation.IRuleContext) {\r\n if (this.switchToInstrumentDetails.length < 1) {\r\n rule.addError(\"Please choose an instrument to switch with.\");\r\n } else {\r\n if (this.amount <= 0) {\r\n rule.addError(\"The amounts entered are too low. Please enter higher amounts.\");\r\n } else if (this.amount < this.tradeFees.totalFees) {\r\n rule.addError(\"The withdrawal amounts are lower than the total fees. Please enter higher amounts.\");\r\n } else if (this.amount > this.valueAvailable) {\r\n rule.addError(\"The total withdrawal amount exceeds the available holdings. Please enter lower amounts.\");\r\n }\r\n }\r\n }\r\n\r\n public static validTradeRules: Validation.IRule | null = null;\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.otp) {\r\n return \"New switch\";\r\n } else {\r\n return this.otp;\r\n }\r\n }\r\n\r\n public setTradeFees(switchFromUnderlyingInstrumentsCount: number) {\r\n var totalInstrumentToTradeFees = new TradeFees();\r\n\r\n // trade cost multiplier for the instrument from, use 1 if the instrument is not a model portfolio\r\n var multiplierFrom = Math.max(1, switchFromUnderlyingInstrumentsCount);\r\n\r\n // Calculate fees for each instrument to\r\n this.switchToInstrumentDetails.forEach(e => {\r\n totalInstrumentToTradeFees.brokerage += e.tradeFees.brokerage;\r\n totalInstrumentToTradeFees.strateFee += e.tradeFees.strateFee;\r\n totalInstrumentToTradeFees.vat += e.tradeFees.vat;\r\n });\r\n\r\n // Calculate fees for the instrument from\r\n this.tradeFees = this.hasTradeCosts ? this.tradeCosts.getFees(this.amount, multiplierFrom) : new TradeFees();\r\n this.tradeFees.brokerage += totalInstrumentToTradeFees.brokerage;\r\n this.tradeFees.strateFee += totalInstrumentToTradeFees.strateFee;\r\n this.tradeFees.vat += totalInstrumentToTradeFees.vat;\r\n }\r\n}","import { Attributes, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class Instrument extends ApiModelBase {\r\n\r\n public instrumentID: number = 0;\r\n\r\n public instrumentCode: string = \"\";\r\n\r\n public instrumentName: string = \"\";\r\n\r\n @Attributes.Float()\r\n public buyPrice: number = 0;\r\n\r\n @Attributes.Float()\r\n public sellPrice: number = 0;\r\n\r\n public moneyMarketInd: boolean = false;\r\n\r\n public oldInd: boolean = false;\r\n\r\n public isTradeable: boolean = true;\r\n\r\n public instrumentDescription: string = \"\";\r\n\r\n public instrumentRiskRatingID: number = 0;\r\n\r\n public cashInd: boolean = false;\r\n\r\n public hasTradeCosts: boolean = false;\r\n\r\n public smallImageID: number = 0;\r\n\r\n public largeImageID: number = 0;\r\n\r\n @Attributes.Float()\r\n public totalExpenseRatio: number = 0;\r\n\r\n public isin: string = \"\";\r\n\r\n @Attributes.Integer()\r\n public incomeTreatment: number = 0;\r\n\r\n public instrumentProviderID: number = 0;\r\n\r\n public assetClassID: number = 0;\r\n\r\n public strategyID: number = 0;\r\n\r\n public regionID: number = 0;\r\n\r\n public incomeTreatmentDescription: string = \"\";\r\n\r\n public investableTypeID: number = 0;\r\n\r\n public investableType: string = \"\";\r\n\r\n public instrumentProviderImageID: number = 0;\r\n\r\n public minimumInvestmentAmount: number = 0;\r\n\r\n public underlyingInstrumentsCount: number = 0;\r\n\r\n // Client only properties / methods\r\n @Attributes.NoTracking()\r\n public isExpanded: boolean = false;\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.instrumentCode) {\r\n return \"New instrument\";\r\n } else {\r\n return this.instrumentCode;\r\n }\r\n }\r\n}","class StringConstants {\r\n notFicadTooltip = \"You are not fica verified.\"\r\n notReadyToInvestTooltip = \"You are not ready to invest.\"\r\n pendingTradesTooltip = \"This instrument has current pending trades.\"\r\n noValueAvailable = \"This instrument is not available or has insufficient funds.\"\r\n\r\n getErrorNotificationText(message: string) {\r\n return `An error occured ${message}. Please contact ETFSA by email using hub@etfsa.co.za.`;\r\n }\r\n}\r\n\r\nexport default new StringConstants();","import { List, Misc, ModalUtils, NeoModel } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport InvestorOTPDetails from \"../../../Models/Investors/InvestorOTPDetails\";\r\nimport TradeCost, { TradeFees } from \"../../../Models/Base/TradeCost\";\r\nimport { Switch } from \"../../../Models/Base/TradeRequest\";\r\nimport { NotificationDuration } from \"../../../Models/Enums/NotificationDuration\";\r\nimport Instrument from '../../../Models/Instruments/Instrument';\r\nimport { SwitchInstrumentDetail } from '../../../Models/Instruments/InstrumentDetail';\r\nimport { PortfolioInstrumentBalance } from \"../../../Models/Portfolio/PortfolioBalance\";\r\nimport Investor from \"../../../Models/Registration/Investor\";\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport StringConstants from \"../../../Services/StringConstants\";\r\nimport Home from '../../Dashboard/Dashboard';\r\n\r\n@NeoModel\r\nexport default class SwitchVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n private otpService = AppService.get(Types.Services.OtpService),\r\n private tradeRequestApiClient = AppService.get(Types.ApiClients.TradeRequestApiClient),\r\n private appDataCache = AppService.get(Types.Services.AppDataCache),\r\n private currentInvestorService = AppService.get(Types.Services.CurrentInvestorService),\r\n private investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n private instrumentApiClient = AppService.get(Types.ApiClients.InstrumentApiClient)\r\n ) {\r\n super(taskRunner);\r\n }\r\n\r\n public currentSwitch = new Switch();\r\n public investor: Investor | null = null;\r\n public investorOTPDetails: InvestorOTPDetails | null = null;\r\n public showSuccessModal: boolean = false;\r\n public isPercentage: boolean = true;\r\n public toInstruments = new List(Instrument);\r\n public totalPercentage: number = 0;\r\n public hasTradeCosts: boolean = true;\r\n public hasTradeCostsList: boolean[] = [];\r\n\r\n public async load(portfolioInstrumentBalance: PortfolioInstrumentBalance | null) {\r\n if (portfolioInstrumentBalance !== null) {\r\n this.setCurrentSwitch(await this.taskRunner.waitFor(this.appDataCache.tradeCosts.getDataAsync()), portfolioInstrumentBalance);\r\n var instrumentResult = await this.taskRunner.waitFor(this.instrumentApiClient.getTradeableInstrumentList(this.currentSwitch.portfolioTypeID));\r\n\r\n this.toInstruments.set(instrumentResult.data);\r\n var switchInstrument = this.toInstruments.find(c => c.instrumentID === this.currentSwitch.instrumentID_From);\r\n this.hasTradeCosts = portfolioInstrumentBalance.hasTradeCosts;\r\n \r\n // Remove Instrument_From from the available switch instruments\r\n if (switchInstrument) {\r\n this.toInstruments.remove(switchInstrument);\r\n }\r\n \r\n if (!this.investor) {\r\n const investorResult = await this.taskRunner.waitFor(this.investorApiClient.getInvestorOTPDetails());\r\n\r\n this.investorOTPDetails = InvestorOTPDetails.fromJSObject(investorResult.data);\r\n if (!this.investorOTPDetails) {\r\n this.showNotificationAndClose(\"Error loading investor\", \"while opening the switch page\");\r\n }\r\n }\r\n } else {\r\n this.showNotificationAndClose(\"Error loading portfolio\", \"while opening the switch page\");\r\n }\r\n }\r\n\r\n private showNotificationAndClose(title: string, message: string) {\r\n this.notifications.addDanger(title, StringConstants.getErrorNotificationText(message), NotificationDuration.Long);\r\n this.navigateToDashboard();\r\n }\r\n\r\n public recalculateSwitch(currentInstrumentDetail: SwitchInstrumentDetail) {\r\n\r\n // Setting the rand amount before starting on the calculations\r\n if (!this.isPercentage) {\r\n currentInstrumentDetail.amount = this.currentSwitch.valueAvailable * currentInstrumentDetail.percentage;\r\n } else {\r\n currentInstrumentDetail.percentage = currentInstrumentDetail.amount / this.currentSwitch.valueAvailable;\r\n }\r\n\r\n // Setting the switch totals before doing the calculations\r\n this.currentSwitch.amount = this.currentSwitch.switchToInstrumentDetails.sum(c => c.amount);\r\n this.totalPercentage = this.currentSwitch.switchToInstrumentDetails.sum(c => c.percentage);\r\n this.currentSwitch.amount = Math.trunc(this.currentSwitch.amount * 100) / 100;\r\n this.hasTradeCostsList = [];\r\n\r\n if (this.currentSwitch.switchToInstrumentDetails.length > 0) {\r\n\r\n this.currentSwitch.switchToInstrumentDetails.forEach(instrumentDetail => {\r\n var currentInstrument = new Instrument();\r\n currentInstrument = this.toInstruments.find(i => i.instrumentID === instrumentDetail.instrumentID) ?? new Instrument();\r\n this.hasTradeCostsList.push(currentInstrument.hasTradeCosts);\r\n instrumentDetail.setSwitchTradeValues(this.currentSwitch, currentInstrument);\r\n });\r\n\r\n if (!this.hasTradeCostsList.find(c => c === true) && !this.currentSwitch.hasTradeCosts) {\r\n this.hasTradeCosts = false;\r\n } else {\r\n this.hasTradeCosts = true;\r\n }\r\n\r\n } else {\r\n this.setEmptySwitch();\r\n }\r\n }\r\n\r\n public onInstrumentSelected(currentInstrumentDetail: SwitchInstrumentDetail) {\r\n\r\n // Checking if the instrument added is not already in the list of switch instruments\r\n if (currentInstrumentDetail.instrumentID !== null && currentInstrumentDetail.instrumentID !== 0) {\r\n var duplicateCount = this.currentSwitch.switchToInstrumentDetails.filter(c => c.instrumentID === currentInstrumentDetail.instrumentID).length;\r\n if (duplicateCount > 1) {\r\n this.notifications.addDanger(\"Error loading instrument\", \"This instrument has already been chosen. Please choose another instrument.\", NotificationDuration.Long);\r\n this.currentSwitch.switchToInstrumentDetails.remove(currentInstrumentDetail);\r\n }\r\n this.recalculateSwitch(currentInstrumentDetail);\r\n } else {\r\n currentInstrumentDetail.estimatedUnits = 0;\r\n currentInstrumentDetail.amount = 0;\r\n currentInstrumentDetail.percentage = 0;\r\n currentInstrumentDetail.tradeFees = new TradeFees();\r\n this.recalculateSwitch(currentInstrumentDetail);\r\n }\r\n }\r\n\r\n public checkInstrumentInd(currentInstrumentDetail: SwitchInstrumentDetail, isDisabled: boolean) {\r\n return isDisabled || (currentInstrumentDetail.instrumentID === undefined || currentInstrumentDetail.instrumentID === 0);\r\n }\r\n\r\n public switchPreferredProportions() {\r\n this.isPercentage = this.isPercentage ? false : true;\r\n }\r\n\r\n public async sendOtp(sendOtp: boolean = true) {\r\n const result = await this.otpService.showOtpModal(this.investorOTPDetails!, sendOtp);\r\n\r\n if (result.otp) {\r\n this.currentSwitch.otp = result.otp;\r\n await this.SubmitSwitch();\r\n }\r\n return result;\r\n }\r\n\r\n public async showOtp(resendOtp: boolean = true) {\r\n const result = await this.sendOtp(resendOtp);\r\n if (result.cancelled) {\r\n if ((await ModalUtils.showYesNo(\"Cancel Switch\", \"Are you sure you want to cancel the switch?\")) === Misc.ModalResult.No) {\r\n this.showOtp(false);\r\n } else {\r\n this.otpService.currentModel = null;\r\n }\r\n }\r\n }\r\n\r\n private async SubmitSwitch() {\r\n if (this.currentSwitch.portfolioTypeID !== null) {\r\n const newSwitchInstruction = this.currentSwitch.toJSObject();\r\n await this.taskRunner.run(async (options) => {\r\n options.onError = (e) => {\r\n if (!e.isServerError) {\r\n var errorDetail = e.body.toLocaleLowerCase();\r\n if (errorDetail.includes(\"otp\")) {\r\n if (errorDetail.includes(\"locked out\")) {\r\n this.otpService.currentModel = null;\r\n this.navigateToDashboard();\r\n } else {\r\n this.showOtp(false);\r\n }\r\n };\r\n } else {\r\n this.notifications.addWarning(\"OTP\", StringConstants.getErrorNotificationText(\"during the submission of your OTP\"), NotificationDuration.Long);\r\n }\r\n };\r\n await this.tradeRequestApiClient.switch(newSwitchInstruction);\r\n this.otpService.currentModel = null;\r\n this.showSuccessModal = true;\r\n });\r\n } else {\r\n this.setEmptySwitch();\r\n this.notifications.addWarning(\"Encountered an issue during submission\", \"Please try again\", NotificationDuration.Long);\r\n }\r\n }\r\n\r\n private setEmptySwitch() {\r\n this.currentSwitch.switchToInstrumentDetails = new List(SwitchInstrumentDetail);\r\n this.currentSwitch.tradeFees = new TradeFees();\r\n this.currentSwitch.amount = 0;\r\n this.currentSwitch.switchToInstrumentDetails.addNew();\r\n this.hasTradeCosts = this.currentSwitch.hasTradeCosts;\r\n }\r\n\r\n private setCurrentSwitch(tradeCost: TradeCost, portfolioInstrumentBalance: PortfolioInstrumentBalance) {\r\n this.currentSwitch.tradeCosts = tradeCost;\r\n this.currentSwitch.valueAvailable = portfolioInstrumentBalance.valueAvailable;\r\n this.currentSwitch.instrumentID_From = portfolioInstrumentBalance.instrumentID;\r\n this.currentSwitch.instrumentName = portfolioInstrumentBalance.instrument;\r\n this.currentSwitch.portfolioTypeID = this.currentInvestorService.investorData!.selectedPortfolio!.portfolioTypeID;\r\n this.currentSwitch.hasTradeCosts = portfolioInstrumentBalance.hasTradeCosts;\r\n this.currentSwitch.underlyingInstrumentsCount = portfolioInstrumentBalance.underlyingInstrumentsCount;\r\n this.currentSwitch.switchToInstrumentDetails.addNew();\r\n }\r\n\r\n public navigateToDashboard(success: boolean = false) {\r\n if (success) {\r\n this.currentInvestorService.portfolioData!.resetPortfolioData();\r\n this.navigation.navigateToView(Home);\r\n } else {\r\n this.navigation.navigateToView(Home);\r\n }\r\n }\r\n}","import { NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class InvestorAddressDetail extends APIModelBase {\r\n\r\n @Rules.Required()\r\n public countryID: number | null = null;\r\n\r\n @Rules.Required()\r\n public provinceID: number | null = null;\r\n\r\n public addressLine1: string = \"\";\r\n\r\n @Rules.Required(\"Address Line 1 is required\")\r\n public addressLine2: string = \"\";\r\n\r\n public addressLine3: string = \"\";\r\n\r\n @Rules.Required()\r\n public city: string = \"\";\r\n\r\n @Rules.Required()\r\n public suburb: string = \"\";\r\n\r\n @Rules.Required()\r\n public postalCode: string = \"\";\r\n\r\n public documentId: number | null = null\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(iad => iad.postalCode.length > 10, \"Postal code must contain 10 or less characters\");\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.addressLine1) {\r\n return \"New investor address detail\";\r\n } else {\r\n return this.addressLine1;\r\n }\r\n }\r\n}","\r\nexport enum DataFrequency {\r\n Daily = 1,\r\n Weekly = 2,\r\n Monthly = 3,\r\n Quarterly = 4,\r\n Yearly = 5,\r\n}","import { Attributes, DateUtils, EnumHelper, NeoModel, Rules, Validation, ValueObject } from '@singularsystems/neo-core';\r\nimport { DataFrequency } from '../Enums/DataFrequency';\r\n\r\nexport enum TimeRange {\r\n Month,\r\n Year,\r\n ThreeYears\r\n}\r\n\r\nEnumHelper.decorateEnum(TimeRange, d => {\r\n d.describe(TimeRange.Month, \"Month\");\r\n d.describe(TimeRange.Year, \"Year\");\r\n d.describe(TimeRange.ThreeYears, \"3 Years\");\r\n})\r\n\r\n@NeoModel\r\nexport default class GraphDataCriteria extends ValueObject {\r\n\r\n @Rules.Required()\r\n @Attributes.Date()\r\n public fromDate: Date | null = DateUtils.add(DateUtils.today(), { months: -12 });\r\n\r\n @Rules.Required()\r\n @Attributes.Date()\r\n public toDate: Date | null = DateUtils.today();\r\n\r\n public frequency = DataFrequency.Monthly;\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.OnChanged(c => c.onTimeRangeChanged)\r\n @Attributes.NoTracking()\r\n public timeRange: TimeRange = TimeRange.Year;\r\n\r\n @Attributes.NoTracking()\r\n public seriesId: string = \"\";\r\n\r\n private onTimeRangeChanged() {\r\n if (this.timeRange === TimeRange.Month) {\r\n this.fromDate = DateUtils.add(DateUtils.today(), { months: -1 });\r\n this.frequency = DataFrequency.Daily;\r\n } else if (this.timeRange === TimeRange.Year) {\r\n this.fromDate = DateUtils.add(DateUtils.today(), { months: -12 });\r\n this.frequency = DataFrequency.Weekly;\r\n } else if (this.timeRange === TimeRange.ThreeYears) {\r\n this.fromDate = DateUtils.add(DateUtils.today(), { months: -36 });\r\n this.frequency = DataFrequency.Monthly;\r\n }\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n return \"Graph Data Criteria\";\r\n }\r\n}","import { NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport { FicaStatus } from '../Enums/FicaStatus';\r\nimport APIModelBase from '../Library/APIModelBase';\r\nimport Bank from '../Catalogue/Bank';\r\n\r\n@NeoModel\r\nexport default class InvestorBankDetail extends APIModelBase {\r\n\r\n public investorID: number = 0;\r\n\r\n @Rules.Required()\r\n public bankID: number | null = null;\r\n \r\n @Rules.Required()\r\n public accountNo: string = \"\";\r\n\r\n @Rules.Required()\r\n public bankAccountTypeID: number = 0;\r\n\r\n @Rules.Required()\r\n public branchCode: string = \"\";\r\n\r\n public firstName: string = \"\";\r\n\r\n public surname: string = \"\";\r\n \r\n public thirdPartyIDNo: string = \"\";\r\n\r\n public documentID: number | null = null;\r\n\r\n public ficaStatus: number = FicaStatus.Pending;\r\n\r\n public rejectedReason: string = \"\";\r\n\r\n public isThirdParty: boolean = false;\r\n\r\n // Client only properties / methods\r\n\r\n public setBranchCode(bank?: Bank | null) { \r\n this.branchCode = bank?.defaultBranchCode ?? \"\";\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(ibd => !ibd.firstName?.trim() && ibd.isThirdParty , \"First name is required\").onProperties(c => c.firstName);\r\n rules.failWhen(ibd => !ibd.surname?.trim() && ibd.isThirdParty , \"Surname is required\").onProperties(c => c.surname);\r\n rules.failWhen(ibd => !ibd.thirdPartyIDNo?.trim() && ibd.isThirdParty, \"ID number is required\").onProperties(c => c.thirdPartyIDNo);\r\n rules.failWhen(ibd => !ibd.documentID && ibd.isThirdParty, \"Document is required\").onProperties(c => c.documentID);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.accountNo) {\r\n return \"New investor bank detail\";\r\n } else {\r\n return this.accountNo;\r\n }\r\n }\r\n}","import { NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class InvestorForeignTax extends APIModelBase {\r\n\r\n public investorForeignTaxID: number = 0;\r\n\r\n @Rules.Required()\r\n public taxNumber: string = \"\";\r\n\r\n @Rules.Required()\r\n public countryID: number | null = null;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.taxNumber) {\r\n return \"New investor foreign tax\";\r\n } else {\r\n return this.taxNumber;\r\n }\r\n }\r\n\r\n}","import { Attributes, List, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../ApiModelBase';\r\nimport InvestorForeignTax from './InvestorForeignTax';\r\n\r\n@NeoModel\r\nexport default class InvestorTaxDetail extends APIModelBase {\r\n\r\n public taxNumber: string = \"\";\r\n\r\n public documentId: number | null = null;\r\n\r\n public investorForeignTaxes = new List(InvestorForeignTax);\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public isRegisteredForLocalTax: boolean | null = null;\r\n\r\n @Attributes.NoTracking()\r\n @Attributes.OnChanged(t => t.onForeignTaxChanged)\r\n public hasForeignTaxDetails: boolean | null = null;\r\n\r\n public removeForeignTaxItem(item: InvestorForeignTax) {\r\n this.investorForeignTaxes.remove(item);\r\n\r\n if (this.investorForeignTaxes.length === 0) {\r\n this.hasForeignTaxDetails = false;\r\n }\r\n }\r\n\r\n public validTaxNumber() {\r\n\r\n if (this.taxNumber) {\r\n var pattern = new RegExp('^[0-3][0-9]{9}$');\r\n return pattern.test(this.taxNumber);\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n public beforeSave() {\r\n if (!this.isRegisteredForLocalTax) {\r\n this.taxNumber = \"\";\r\n }\r\n }\r\n\r\n private onForeignTaxChanged() {\r\n if (this.hasForeignTaxDetails) {\r\n if (this.investorForeignTaxes.length === 0) {\r\n this.investorForeignTaxes.addNew();\r\n }\r\n } else {\r\n for (let i = this.investorForeignTaxes.length - 1; i >= 0; i--) {\r\n this.investorForeignTaxes.remove(this.investorForeignTaxes[i]);\r\n }\r\n }\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(it => it.isRegisteredForLocalTax === null, \"Please select whether you are registered for local tax.\");\r\n rules.failWhen(it => it.hasForeignTaxDetails === null, \"Please select whether you are a foreign tax resident.\");\r\n rules.failWhen(it => it.taxNumber !== \"\" && it.validTaxNumber() === false, \"Invalid tax number\");\r\n rules.failWhen(it => it.isRegisteredForLocalTax === true && it.taxNumber.trim() === \"\", \"Tax number is required\");\r\n rules.failWhen(it => it.isRegisteredForLocalTax === true && !it.documentId, \"SARS issued document is required.\");\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.taxNumber) {\r\n return \"New investor tax detail\";\r\n } else {\r\n return this.taxNumber;\r\n }\r\n }\r\n\r\n onDeserialiseCompleted() {\r\n this.isRegisteredForLocalTax = this.taxNumber !== \"0000000000\";\r\n this.hasForeignTaxDetails = this.investorForeignTaxes.length > 0;\r\n }\r\n}","import { Attributes, NeoModel, Utils, Validation } from '@singularsystems/neo-core';\r\nimport InvestorAddressDetail from '../Investors/InvestorAddressDetail';\r\nimport InvestorBankDetail from '../Investors/InvestorBankDetail';\r\nimport InvestorOTPDetails from \"../Investors/InvestorOTPDetails\";\r\nimport InvestorTaxDetail from '../Investors/InvestorTaxDetail';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class Investor extends APIModelBase implements InvestorOTPDetails {\r\n\r\n public investorID: number = 0;\r\n\r\n public guid: string = Utils.emptyGuid();\r\n\r\n public firstName: string = \"\";\r\n\r\n public surname: string = \"\";\r\n\r\n public emailAddress: string = \"\";\r\n\r\n @Attributes.Integer()\r\n public otpMethod: number = 0;\r\n\r\n public cellNo: string = \"\";\r\n\r\n public idNo: string = \"\";\r\n\r\n public passportCountryOfIssueID: number | null = null;\r\n\r\n @Attributes.Date()\r\n public birthDate: Date | null = null;\r\n\r\n public investorTypeID: number = 0;\r\n\r\n public investorStatusID: number = 0;\r\n\r\n @Attributes.Integer()\r\n public investorFICAStatusIdentity: number = 0;\r\n\r\n public identityStatusReason: string = \"\";\r\n\r\n @Attributes.Integer()\r\n public investorFICAStatusAddress: number = 0;\r\n\r\n public addressStatusReason: string = \"\";\r\n\r\n public hideTour: boolean = false;\r\n\r\n @Attributes.Integer()\r\n public investorFICAStatusTaxNumber: number = 0;\r\n\r\n public taxStatusReason: string = \"\";\r\n\r\n public requiresInvestmentAdvice: boolean = false;\r\n\r\n @Attributes.ChildObject(InvestorAddressDetail)\r\n public addressDetails = new InvestorAddressDetail();\r\n\r\n @Attributes.ChildObject(InvestorBankDetail)\r\n public primaryBankDetails: InvestorBankDetail | null = null;\r\n\r\n @Attributes.ChildObject(InvestorBankDetail)\r\n public thirdPartyBankDetails: InvestorBankDetail | null = null;\r\n\r\n @Attributes.ChildObject(InvestorTaxDetail)\r\n public investorTaxDetail = new InvestorTaxDetail();\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.guid) {\r\n return \"New investor\";\r\n } else {\r\n return this.guid;\r\n }\r\n }\r\n}","import { Misc, ModalUtils, NeoModel } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { injectable } from 'inversify';\r\nimport InvestorBankDetail from '../../../Models/Investors/InvestorBankDetail';\r\nimport { TradeFees } from '../../../Models/Base/TradeCost';\r\nimport { Sale } from '../../../Models/Base/TradeRequest';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport { PortfolioInstrumentBalance } from '../../../Models/Portfolio/PortfolioBalance';\r\nimport Investor from '../../../Models/Registration/Investor';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport StringConstants from \"../../../Services/StringConstants\";\r\nimport Home from '../../Dashboard/Dashboard';\r\n\r\n@injectable()\r\n@NeoModel\r\nexport default class WithdrawCashVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n public otpService = AppService.get(Types.Services.OtpService),\r\n private tradeRequestApiClient = AppService.get(Types.ApiClients.TradeRequestApiClient),\r\n private appDataCache = AppService.get(Types.Services.AppDataCache),\r\n private currentInvestorService = AppService.get(Types.Services.CurrentInvestorService),\r\n private investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n ) {\r\n super(taskRunner);\r\n }\r\n\r\n public currentSale = new Sale();\r\n public instrumentBalanceDetails: PortfolioInstrumentBalance | null = null;\r\n public investor: Investor | null = null;\r\n public bankDetails: InvestorBankDetail | null = null;\r\n private portfolioTypeID: number | null = 0;\r\n public isWithdrawAll: boolean = false;\r\n public showSuccessModal: boolean = false;\r\n\r\n public async initialise() {\r\n if(!this.instrumentBalanceDetails) {\r\n this.navigateToDashboard()\r\n } else {\r\n this.currentSale.tradeCosts = await this.taskRunner.waitFor(this.appDataCache.tradeCosts.getDataAsync());\r\n this.currentSale.valueAvailable = this.instrumentBalanceDetails!.valueAvailable;\r\n this.portfolioTypeID = this.currentInvestorService!.investorData!.selectedPortfolio!.portfolioTypeID;\r\n \r\n if (!this.investor) {\r\n const investorResult = await this.taskRunner.waitFor(this.investorApiClient.getInvestor());\r\n this.investor = Investor.fromJSObject(investorResult.data);\r\n if (!this.investor) {\r\n this.notifications.addDanger(\"Error loading investor\", StringConstants.getErrorNotificationText(\"opening the withdrawal page\"), NotificationDuration.Long);\r\n this.navigateToDashboard();\r\n }\r\n }\r\n }\r\n }\r\n\r\n public setPortfolioInstrumentBalance(portfolioInstrumentBalance: PortfolioInstrumentBalance | null){\r\n if (portfolioInstrumentBalance === null) {\r\n this.notifications.addDanger(\"Error loading portfolio\", StringConstants.getErrorNotificationText(\"opening the withdrawal page\"), NotificationDuration.Long);\r\n this.navigateToDashboard();\r\n } else {\r\n this.instrumentBalanceDetails = portfolioInstrumentBalance;\r\n }\r\n }\r\n\r\n public setTransactionFees() {\r\n const costMultiplier = this.instrumentBalanceDetails?.underlyingInstrumentsCount || 1;\r\n\r\n if (this.instrumentBalanceDetails!.hasTradeCosts) {\r\n if (this.currentSale.amount !== 0) {\r\n this.currentSale.tradeFees = this.currentSale.tradeCosts.getFees(this.currentSale.amount, costMultiplier);\r\n } else {\r\n this.setEmptyTransaction();\r\n }\r\n }\r\n }\r\n\r\n public setBankDetails(){\r\n this.bankDetails = this.investor!.primaryBankDetails!;\r\n }\r\n\r\n public editBankDetails(){\r\n this.bankDetails = null;\r\n this.currentInvestorService!.investorData!.accountInformationVM.beginEditBankDetails();\r\n this.navigateToDashboard();\r\n }\r\n\r\n private setEmptyTransaction() {\r\n this.currentSale.tradeFees = new TradeFees();\r\n this.currentSale.amount = 0;\r\n }\r\n\r\n public withdrawAvailableUnits(){\r\n this.currentSale.amount = this.currentSale.valueAvailable;\r\n this.setTransactionFees();\r\n if (this.isWithdrawAll) {\r\n this.currentSale.amount = 0;\r\n this.setEmptyTransaction();\r\n }\r\n this.isWithdrawAll = this.isWithdrawAll ? false : true;\r\n }\r\n\r\n private async SubmitSale() {\r\n if (this.instrumentBalanceDetails !== null && this.portfolioTypeID !== null) {\r\n // Populate sell instruction\r\n this.currentSale.instrumentID = this.instrumentBalanceDetails.instrumentID;\r\n this.currentSale.portfolioTypeID = this.portfolioTypeID!;\r\n\r\n // Check OTP then submit sell instruction\r\n const newSellInstruction = this.currentSale.toJSObject();\r\n await this.taskRunner.run(async (options) => {\r\n options.onError = (e) => {\r\n if (!e.isServerError) {\r\n var errorDetail = e.body.toLocaleLowerCase();\r\n if (errorDetail.includes(\"otp\")) {\r\n if (errorDetail.includes(\"locked out\")) {\r\n this.otpService.currentModel = null;\r\n this.navigateToDashboard();\r\n } else {\r\n this.showOtp(false);\r\n }\r\n };\r\n } else {\r\n this.notifications.addWarning(\"OTP\", StringConstants.getErrorNotificationText(\"during the submission of your OTP\"), NotificationDuration.Long);\r\n }\r\n }\r\n await this.tradeRequestApiClient.sale(newSellInstruction);\r\n this.otpService.currentModel = null;\r\n this.showSuccessModal = true;\r\n })\r\n } else {\r\n this.setEmptyTransaction();\r\n this.notifications.addWarning(\"Issue during submition of sale\", \"Please try again\", NotificationDuration.Long);\r\n }\r\n }\r\n\r\n public async sendOtp(sendOtp: boolean = true) {\r\n this.bankDetails = null;\r\n const result = await this.otpService.showOtpModal(this.investor!, sendOtp);\r\n\r\n if (result.otp) {\r\n this.currentSale.otp = result.otp;\r\n await this.SubmitSale();\r\n }\r\n return result;\r\n }\r\n\r\n public async showOtp(resendOtp: boolean = true) {\r\n const result = await this.sendOtp(resendOtp);\r\n if (result.cancelled) {\r\n if ((await ModalUtils.showYesNo(\"Cancel Withdrawal\", \"Are you sure you want to cancel the withdrawal?\")) === Misc.ModalResult.No) {\r\n this.showOtp(false);\r\n } else {\r\n this.otpService.currentModel = null;\r\n }\r\n }\r\n }\r\n\r\n public navigateToDashboard(success: boolean = false) {\r\n if (success) {\r\n this.currentInvestorService.portfolioData!.resetPortfolioData();\r\n this.navigation.navigateToView(Home);\r\n } else {\r\n this.navigation.navigateToView(Home);\r\n }\r\n }\r\n}","import { DateUtils, EnumHelper, FileUtils, NeoModel } from '@singularsystems/neo-core';\r\nimport { IGraphData } from '../../Models/Portfolio/GraphData';\r\nimport StatementCriteria from \"../../Models/Portfolio/StatementCriteria\";\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport ETInvestorVMBase from '../ETInvestorVMBase';\r\nimport SwitchVM from \"../Investor/Trades/SwitchVM\";\r\nimport WithdrawCashVM from '../Investor/Trades/WithdrawCashVM';\r\nimport Dashboard from './Dashboard';\r\nimport GraphDataCriteria, { TimeRange } from '../../Models/Portfolio/GraphDataCriteria';\r\nimport TradeCost from '../../Models/Base/TradeCost';\r\n\r\nexport enum DashboardViewType {\r\n Withdrawal = \"withdrawal\",\r\n Switch = \"switch\",\r\n Distributions = \"distributions\"\r\n}\r\n\r\nEnumHelper.decorateEnum(DashboardViewType, d => {\r\n d.describe(DashboardViewType.Withdrawal, \"Withdrawal\");\r\n d.describe(DashboardViewType.Switch, \"Switch\");\r\n d.describe(DashboardViewType.Distributions, \"Distribution\");\r\n});\r\n\r\n@NeoModel\r\nexport default class DashboardVM extends ETInvestorVMBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public reportingApiClient = AppService.get(Types.ApiClients.ReportingApiClient),\r\n public investorService = AppService.get(Types.Services.CurrentInvestorService),\r\n public catalogueApiClient = AppService.get(Types.ApiClients.CatalogueApiClient)\r\n ) {\r\n super(taskRunner);\r\n this.registerReaction(() => investorService.investorData!.selectedPortfolio?.portfolioID, () => this.setCanTransactAvailableCash());\r\n }\r\n\r\n public viewType: DashboardViewType | null = null;\r\n public instrumentGraphData: IGraphData | null = null;\r\n public instrumentGraphCriteria = new GraphDataCriteria();\r\n public withdrawCashVM: WithdrawCashVM | null = null;\r\n public switchVM: SwitchVM | null = null;\r\n public statementCriteria: StatementCriteria | null = null;\r\n public canWithdrawCash: boolean = false;\r\n public canSwitchCash: boolean = false;\r\n public readonly shareCashZAR = \"SHARECASHZAR\";\r\n public readonly disabledToolTip = \"Minimum requirements not met\";\r\n \r\n public instrumentGraphTask = AppService.get(Types.Neo.TaskRunner);\r\n public tradeCosts: TradeCost | null = new TradeCost();\r\n\r\n public async initialise() {\r\n this.tradeCosts = await this.catalogueApiClient.getTradeCosts();\r\n await this.setCanTransactAvailableCash();\r\n }\r\n\r\n public showInstrumentGraphData(instrumentCode: string, isModelPortfolio: boolean = false) {\r\n let portfolioData = this.investorService.portfolioData;\r\n\r\n if (portfolioData) {\r\n if (isModelPortfolio) {\r\n instrumentCode = portfolioData.getInstrumentName(instrumentCode) ?? '';\r\n }\r\n\r\n if (instrumentCode) {\r\n this.instrumentGraphData = portfolioData!.getGraphData(instrumentCode);\r\n this.instrumentGraphCriteria.seriesId = instrumentCode;\r\n this.instrumentGraphCriteria.timeRange = portfolioData.graphCriteria.timeRange;\r\n }\r\n }\r\n\r\n if (!this.instrumentGraphData) {\r\n this.notifications.showMessage(\"Graph\", \"Graph data not available for this instrument.\");\r\n }\r\n }\r\n\r\n public async setLineGraphTimeRange(timeRange: TimeRange) {\r\n if (timeRange !== this.instrumentGraphCriteria.timeRange) {\r\n this.instrumentGraphCriteria.timeRange = timeRange;\r\n this.instrumentGraphData = await this.investorService.portfolioData!.getGraphDataForInstrument(this.instrumentGraphTask, this.instrumentGraphCriteria)\r\n } \r\n }\r\n\r\n public async beginWithdraw(instrumentCode: string) {\r\n this.withdrawCashVM = this.registerViewModel(WithdrawCashVM);\r\n if (this.portfolioBalance !== null) {\r\n var currentInstrument = this.portfolioBalance?.instruments.find(c => c.instrumentCode === instrumentCode) ?? null;\r\n this.withdrawCashVM!.setPortfolioInstrumentBalance(currentInstrument);\r\n await this.withdrawCashVM.initialise();\r\n }\r\n else {\r\n this.navigation.navigateToView(Dashboard);\r\n }\r\n }\r\n\r\n public async beginSwitch(instrumentCode: string) {\r\n this.switchVM = this.registerViewModel(SwitchVM);\r\n if (this.portfolioBalance !== null) {\r\n var currentInstrument = this.portfolioBalance.instruments.find(c => c.instrumentCode === instrumentCode) ?? null;\r\n await this.switchVM.load(currentInstrument);\r\n }\r\n else {\r\n this.navigation.navigateToView(Dashboard);\r\n }\r\n }\r\n\r\n public setDistributionExportCriteria() {\r\n this.statementCriteria = new StatementCriteria();\r\n var today = DateUtils.today();\r\n this.statementCriteria.endDate = DateUtils.monthEnd(today);\r\n this.statementCriteria.startDate = DateUtils.monthStart(today);\r\n this.statementCriteria!.portfolioTypeId = this.investorService.portfolioData!.portfolio.portfolioTypeID;\r\n }\r\n\r\n public downloadDistributionReport() {\r\n if (this.statementCriteria) {\r\n this.taskRunner.run(\"Fetching distributions\", async () => {\r\n const response = await this.reportingApiClient.getDistributionReport(this.statementCriteria!.toQueryObject());\r\n FileUtils.showSaveFile(response);\r\n this.statementCriteria = null;\r\n });\r\n }\r\n }\r\n\r\n public beginViewStatement(portfolioTypeID?: number) {\r\n var today = DateUtils.today();\r\n\r\n this.investorService.toggleDocumentPanel();\r\n this.statementCriteria = new StatementCriteria();\r\n\r\n if (portfolioTypeID) {\r\n this.statementCriteria.portfolioTypeId = portfolioTypeID;\r\n this.statementCriteria.endDate = DateUtils.monthEnd(today);\r\n this.statementCriteria.startDate = DateUtils.monthStart(today);\r\n this.investorService.investorData?.documentsVM.statementCriteria.mapFrom(this.statementCriteria);\r\n this.investorService.investorData?.documentsVM.panelController.forward(\"Statement\");\r\n }\r\n }\r\n\r\n public async setCanTransactAvailableCash(){\r\n let valuePending = 0;\r\n let hasPendingShareCashTransaction = false;\r\n let portfolioBalance = await this.investorService.getPortfolioAsync();\r\n\r\n if (portfolioBalance) {\r\n valuePending = portfolioBalance.instruments\r\n .filter(c => c.isCashInstrument)\r\n .reduce((sum, currentValue) => sum + currentValue.valuePending, 0);\r\n }\r\n hasPendingShareCashTransaction = valuePending !== 0;\r\n\r\n if (this.investorInfo?.ficaVerified && !hasPendingShareCashTransaction) {\r\n const cashAvailable = portfolioBalance?.cashAvailable ?? 0;\r\n const minTradeValue = this.tradeCosts?.instrumentMinimumTradeValue ?? 0;\r\n \r\n this.canSwitchCash = cashAvailable > minTradeValue;\r\n this.canWithdrawCash = cashAvailable > 0;\r\n } else {\r\n this.canSwitchCash = false;\r\n this.canWithdrawCash = false;\r\n }\r\n }\r\n}","import { EnumHelper } from '@singularsystems/neo-core';\r\n\r\nexport enum MaintenanceDocumentType {\r\n NormalMandate =\t1,\r\n TaxFreeMandate = 2,\r\n TermsAndConditions = 3,\r\n PrivacyPolicy = 4,\r\n RetirementAnnuityMandate = 5,\r\n DebitOrderAuthority = 6,\r\n InvestmentAdviceMandate = 7,\r\n ThirdPartyDebitOrderAuthority = 8\r\n}\r\n\r\nEnumHelper.decorateEnum(MaintenanceDocumentType, decorator => {\r\n decorator.describe(MaintenanceDocumentType.TermsAndConditions, \"Terms & Conditions\");\r\n decorator.describe(MaintenanceDocumentType.ThirdPartyDebitOrderAuthority, \"3rd Party Debit Order Authority\");\r\n});","import React from 'react';\r\n\r\ninterface ETLoaderProps {\r\n palette?: \"red\" | \"blue\";\r\n}\r\n\r\nexport default class ETLoader extends React.Component {\r\n\r\n private canvasRef = React.createRef();\r\n private drawContext!: CanvasRenderingContext2D;\r\n\r\n constructor(props: {}) {\r\n super(props);\r\n\r\n this.animate = this.animate.bind(this);\r\n this.colors = this.props.palette === \"blue\" ? \r\n [\"#369AFE\", \"#1fd0a3\", \"#2e3643\", \"#FFC800\"] : \r\n [\"#fa6464\", \"#fb996d\", \"#2e3643\", \"#FFC800\"];\r\n }\r\n\r\n componentDidMount() {\r\n if (this.canvasRef.current) {\r\n this.drawContext = this.canvasRef.current.getContext(\"2d\")!;\r\n\r\n window.requestAnimationFrame(this.animate);\r\n }\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n private endTime: number = 0;\r\n private colors: string[];\r\n private colorOffset = -1;\r\n\r\n private animate() {\r\n const context = this.drawContext;\r\n\r\n const radius = context.canvas.height / 2,\r\n speed = 1000,\r\n count = this.colors.length,\r\n countMinus1 = count - 1,\r\n gap = (context.canvas.width - (radius * 2)) / (count - 2);\r\n\r\n context.clearRect(0, 0, context.canvas.width, context.canvas.height);\r\n\r\n const now = Date.now();\r\n if (now >= this.endTime) {\r\n this.endTime = now + speed;\r\n this.colorOffset += 1;\r\n if (this.colorOffset === count) {\r\n this.colorOffset = 0;\r\n }\r\n }\r\n\r\n const start = this.endTime - speed;\r\n const progress = Math.max(0, Math.min(1, (now - start) / (this.endTime - start))),\r\n easeValue = this.easeOutQuart(progress);\r\n\r\n context.fillStyle = this.colors[countMinus1 - (this.colorOffset % count)];\r\n context.beginPath();\r\n context.arc(radius + (gap * (count - 2)), radius, (1 - easeValue) * radius, 0, 90);\r\n context.fill();\r\n\r\n context.fillStyle = this.colors[countMinus1 - ((this.colorOffset + count - 1) % count)];\r\n context.beginPath();\r\n context.arc(radius, radius, easeValue * radius, 0, 90);\r\n context.fill();\r\n\r\n for (let i = 0; i < count - 2; i++) {\r\n\r\n context.fillStyle = this.colors[countMinus1 - ((this.colorOffset + count - (i + 2)) % count)];\r\n context.beginPath();\r\n context.arc(radius + (gap * i) + (easeValue * gap), radius, radius, 0, 90);\r\n context.fill();\r\n }\r\n\r\n window.requestAnimationFrame(this.animate);\r\n }\r\n\r\n private easeOutQuart(x: number): number {\r\n return 1 - Math.pow(1 - x, 4);\r\n }\r\n}","import React from 'react';\r\n\r\ninterface IClickLinkProps extends React.DetailedHTMLProps, HTMLAnchorElement> {\r\n onClick: (e: React.MouseEvent) => void;\r\n tooltip?: string;\r\n softDisable?: boolean;\r\n}\r\n\r\nexport default class ClickLink extends React.Component {\r\n\r\n constructor(props: IClickLinkProps) {\r\n super(props);\r\n\r\n this.onClick = this.onClick.bind(this);\r\n }\r\n\r\n private onClick(e: React.MouseEvent) {\r\n e.preventDefault();\r\n\r\n this.props.onClick(e);\r\n }\r\n\r\n public render() {\r\n if (this.props.softDisable) {\r\n return {this.props.children}\r\n }\r\n const { onClick, ...rest } = this.props;\r\n\r\n return {this.props.children}\r\n }\r\n}","// tslint:disable: max-classes-per-file\r\nimport React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { Routing, Views } from '@singularsystems/neo-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\n\r\ninterface IBreadCrumbProps {\r\n rootItem: Routing.BreadCrumbItem;\r\n}\r\n\r\nclass BreadCrumbUIItem {\r\n\r\n public label: string;\r\n\r\n constructor(public breadCrumb: Routing.BreadCrumbItem, public isLast?: boolean) {\r\n this.label = breadCrumb.label instanceof Function ? breadCrumb.label() : breadCrumb.label;\r\n }\r\n}\r\n\r\n@observer\r\nexport default class BreadCrumb extends React.Component {\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService);\r\n\r\n public render() {\r\n\r\n let items: BreadCrumbUIItem[] = [];\r\n if (Views.ViewBase.currentView) {\r\n\r\n items = Views.ViewBase.currentView.getBreadCrumbList().map(b => new BreadCrumbUIItem(b));\r\n items.splice(1, 0, new BreadCrumbUIItem({\r\n label: this.investorService.investorData?.selectedPortfolio?.portfolioType!,\r\n }),\r\n );\r\n\r\n if (items.length) {\r\n items[items.length - 1].isLast = true;\r\n }\r\n }\r\n\r\n return (\r\n
\r\n\r\n \r\n\r\n {items.filter(b => b.label).map((item, index) => (\r\n
\r\n \r\n \r\n
\r\n ))}\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\nclass BreadCrumbItem extends React.Component<{ item: BreadCrumbUIItem; }>{\r\n public render() {\r\n const item = this.props.item;\r\n const breadCrumb = this.props.item.breadCrumb;\r\n\r\n return (\r\n !item.isLast && breadCrumb.link ? {item.label} :\r\n !item.isLast && breadCrumb.onClick ? {item.label} :\r\n {item.label}\r\n );\r\n }\r\n}","export const chartColors = [\"#fa6464\", \"#fb996d\", \"#2e3643\", \"#FFC800\", \"#1FD0A3\", \"#369AFE\", \"#6863FB\"];","import React from 'react';\r\nimport HighchartsReact from 'highcharts-react-official';\r\nimport Highcharts, { PlotAreaOptions } from 'highcharts';\r\nimport { observer } from 'mobx-react';\r\nimport { IGraphData } from '../../../Models/Portfolio/GraphData';\r\nimport { chartColors } from './ChartColors';\r\nimport { observable } from 'mobx';\r\n\r\ninterface ILineChartProps {\r\n graphData: IGraphData;\r\n}\r\n\r\n@observer\r\nexport default class LineChart extends React.Component {\r\n\r\n @observable\r\n private hasMounted = false;\r\n\r\n public render() {\r\n const { graphData } = this.props;\r\n\r\n return (\r\n <>\r\n {graphData && this.hasMounted && }\r\n \r\n );\r\n }\r\n\r\n componentDidMount() {\r\n // Without this, the graph doesn't take up the full width of it's container.\r\n this.hasMounted = true;\r\n }\r\n\r\n private getChartOptions(graphData: IGraphData) {\r\n\r\n const symbol = \"R\";\r\n const seriesData = graphData.seriesData;\r\n const chartType = seriesData.length === 1 ? \"area\" : \"line\";\r\n const tooltipHeader = seriesData.length === 1 ? \"{point.x:%d %b %Y}
\" : \"{point.series.name}
{point.x:%d %b %Y}
\";\r\n\r\n const chartOptions = {\r\n chart: { type: chartType, backgroundColor: \"transparent\" },\r\n title: { text: undefined },\r\n xAxis: {\r\n type: \"datetime\",\r\n labels: { format: \"{value:%d %b %y}\" },\r\n },\r\n yAxis: {\r\n labels: { format: \"R{value:,.0f}\" },\r\n title: { text: undefined },\r\n },\r\n series: seriesData.map((s, index) => ({\r\n animation: true,\r\n marker: { enabled: false },\r\n tooltip: { valueDecimals: 0, headerFormat: tooltipHeader, pointFormat: \"\" + symbol + \"{point.y}\" },\r\n name: s.seriesName,\r\n type: chartType,\r\n data: s.values.map(c => [c.valueDate!.getTime(), c.value]),\r\n dataLabels: [{ enabled: false }],\r\n lineWidth: 3,\r\n color: chartColors[index % chartColors.length]\r\n })),\r\n legend: { enabled: seriesData.length > 1 },\r\n credits: { enabled: false }\r\n } as Highcharts.Options;\r\n\r\n if (chartOptions.series!.length === 1) {\r\n const series = chartOptions.series![0] as PlotAreaOptions;\r\n series.color = \"#369afe\";\r\n\r\n series.fillColor = {\r\n linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\r\n stops: [\r\n [0, 'rgba(54, 154, 254, 0.2)'],\r\n [0.5, 'rgba(54, 154, 254, 0.05)'],\r\n [1, 'rgba(54, 154, 254, 0)']\r\n ]\r\n };\r\n }\r\n\r\n return chartOptions;\r\n }\r\n}","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { IGraphData } from '../../../Models/Portfolio/GraphData';\r\nimport PopoverButton from '../../../App/Components/PopoverButton';\r\nimport GraphDataCriteria, { TimeRange } from '../../../Models/Portfolio/GraphDataCriteria';\r\nimport { EnumHelper, ITaskRunner } from '@singularsystems/neo-core';\r\nimport LineChart from './LineChart';\r\nimport ETLoader from '../../../App/Components/ETLoader';\r\n\r\ninterface IModalLineChartProps {\r\n graphTask: ITaskRunner;\r\n graphState: IGraphData;\r\n graphCriteria: GraphDataCriteria;\r\n setLineGraphTimeRange(timeRange: TimeRange): void;\r\n}\r\n\r\n@observer\r\nexport default class ModalLineChart extends React.Component {\r\n \r\n public render() {\r\n const graphState = this.props.graphState,\r\n criteria = this.props.graphCriteria;\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n\r\n {graphState && !this.props.graphTask.isBusy &&\r\n
\r\n
\r\n Period: {EnumHelper.getItemMetadata(TimeRange, criteria.timeRange).display}\r\n ({ text: c.name, onClick: () => this.props.setLineGraphTimeRange(c.id as TimeRange) }))} />\r\n
\r\n
}\r\n
\r\n {this.props.graphTask.isBusy && }\r\n \r\n \r\n\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, NeoGrid } from '@singularsystems/neo-react';\r\nimport DashboardVM from '../DashboardVM';\r\nimport { PortfolioBalance, PortfolioInstrumentBalance } from '../../../Models/Portfolio/PortfolioBalance';\r\nimport { IGraphData } from '../../../Models/Portfolio/GraphData';\r\nimport { observer } from 'mobx-react';\r\nimport StringConstants from '../../../Services/StringConstants';\r\nimport { TransformMetaType } from '@singularsystems/neo-core/dist/Model';\r\nimport { IButtonDropDownItem } from '@singularsystems/neo-core/dist/Components';\r\nimport ModalLineChart from './ModalLineChart';\r\n\r\ninterface IETPGridComponentProps {\r\n viewModel: DashboardVM;\r\n balance: PortfolioBalance;\r\n onWithdraw: (instrumentCode: string) => void;\r\n onSwitch: (instrumentCode: string) => void;\r\n onPurchase: (instrumentCode: string) => void;\r\n}\r\n\r\n@observer\r\nexport default class ETPGrid extends React.Component {\r\n\r\n getButtonOptions(item: PortfolioInstrumentBalance, meta: TransformMetaType) {\r\n let options: IButtonDropDownItem[] = [{ text: \"Buy More\", onClick: () => this.props.onPurchase(item.instrumentCode) }];\r\n\r\n if (!item.valuePending) {\r\n options.push({ text: \"Withdraw\", onClick: () => this.props.onWithdraw(item.instrumentCode) });\r\n meta.valueAvailable.value > 0 && options.push({ text: \"Switch\", onClick: () => this.props.onSwitch(item.instrumentCode) });\r\n }\r\n\r\n return options;\r\n }\r\n \r\n public render() {\r\n const { viewModel, balance } = this.props;\r\n const isFicad = viewModel.investorInfo?.ficaVerified;\r\n const isReadyToInvest = viewModel.investorService.investorData?.readyToInvest;\r\n\r\n return (\r\n
\r\n
\r\n !c.isCashInstrument)}>\r\n {(item, meta) => (\r\n \r\n \r\n \"logo\"\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n viewModel.showInstrumentGraphData(item.instrumentCode, item.isModelPortfolio)}>View Graph\r\n \r\n \r\n 0)} menuItems={this.getButtonOptions(item, meta)}>Transact\r\n \r\n \r\n )}\r\n \r\n
\r\n\r\n \r\n {(graphData: IGraphData) => (\r\n
\r\n viewModel.setLineGraphTimeRange(timeRange)}\r\n />\r\n
\r\n )}\r\n \r\n
\r\n );\r\n }\r\n\r\n private addToolTip(hasPending: boolean, isFicad: boolean, isReadyToInvest: boolean, hasAvailableValue: boolean) {\r\n return hasPending ? StringConstants.pendingTradesTooltip : (!isFicad ? StringConstants.notFicadTooltip : (!isReadyToInvest ? StringConstants.notReadyToInvestTooltip : (!hasAvailableValue ? StringConstants.noValueAvailable : \"\")));\r\n }\r\n\r\n}","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { Utils } from '@singularsystems/neo-core';\r\n\r\ninterface IInfoIconProps extends React.HTMLProps {\r\n toolTip?: string;\r\n}\r\n\r\n@observer\r\nexport default class InfoIcon extends React.Component {\r\n\r\n public render() {\r\n const { toolTip, ...props} = this.props;\r\n\r\n props.className = Utils.joinWithSpaces(props.className, \"info-icon\");\r\n\r\n return (\r\n \r\n );\r\n }\r\n}","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { IValueByClass } from '../../../Models/Portfolio/ValueByClass';\r\nimport { chartColors } from './ChartColors';\r\nimport { observable } from 'mobx';\r\nimport HighchartsReact from 'highcharts-react-official';\r\nimport Highcharts from 'highcharts';\r\n\r\ninterface IPieChartProps {\r\n graphData: IValueByClass[];\r\n animate: boolean;\r\n}\r\n\r\n@observer\r\nexport default class PieChart extends React.Component {\r\n\r\n @observable\r\n private hasMounted = false;\r\n\r\n public render() {\r\n return (\r\n
\r\n {this.hasMounted && \r\n }\r\n
\r\n );\r\n }\r\n\r\n componentDidMount() {\r\n this.hasMounted = true;\r\n }\r\n\r\n private getPieChartOptions(data: IValueByClass[]) {\r\n const symbol = \"R\";\r\n\r\n return {\r\n chart: { type: \"pie\", backgroundColor: \"#efefef\" },\r\n plotOptions: { pie: { innerSize: \"70%\", borderWidth: 0 }},\r\n title: { text: undefined },\r\n series: [{\r\n animation: this.props.animate,\r\n tooltip: { valueDecimals: 0, pointFormat: \"\" + symbol + \"{point.y}\" },\r\n type: \"pie\",\r\n name: \"Value\",\r\n data: data.map(c => [c.assetClass, c.value]),\r\n colors: chartColors,\r\n showInLegend: true,\r\n dataLabels: [{ enabled: true, format: symbol + \"{y:,.0f}\", style: { fontSize: \"10px\", textOutline: false } },]\r\n }],\r\n credits: { enabled: false }\r\n } as Highcharts.Options;\r\n }\r\n}","export enum InstrumentProvider {\r\n Invest = 1,\r\n ABSA = 2,\r\n Ashburton = 3,\r\n Cloud = 4,\r\n CoreShares = 5,\r\n FirstRand = 6,\r\n etfSA = 7,\r\n Coronation = 8,\r\n Investec = 9,\r\n Satrix = 10,\r\n Sygnia = 11,\r\n StandardBank = 12\r\n}\r\n","import { AxiosResponse } from 'axios';\r\n\r\nexport default class DocumentHandler {\r\n\r\n // takes in an array buffer and a download indicator which specifies if it will download or open a new window with the document.\r\n // converts to array buffer into a Uint8ArrayConstructor which is then used to create a blob which can be used to create an objectURL \r\n // so that the file can be downloaded or opened in a new window\r\n public static convertAndDownloadDocument(response: AxiosResponse, download: boolean) {\r\n const arr = new Uint8Array(response.data);\r\n const blob = new Blob([arr], { type: response.headers[\"content-type\"] });\r\n let downloadUrl = URL.createObjectURL(blob),\r\n filename = response.headers.x_filename;\r\n let a = document.createElement('a');\r\n\r\n if (typeof a.download === \"undefined\") {\r\n window.location.href = downloadUrl;\r\n } else {\r\n a.href = downloadUrl;\r\n a.download = filename;\r\n document.body.append(a);\r\n if (download) {\r\n a.click();\r\n } else {\r\n window.open(a.href);\r\n }\r\n }\r\n }\r\n\r\n}\r\n","import { Neo } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { MaintenanceDocumentType } from '../../../Models/Base/Enums/MaintenanceDocumentType';\r\nimport InvestorBankDetail from '../../../Models/Investors/InvestorBankDetail';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport DocumentHandler from '../../../Services/DocumentHandler';\r\n\r\ninterface IBankAccountDetailsProps {\r\n bankAccount: InvestorBankDetail;\r\n readOnly?: boolean;\r\n registration?: boolean;\r\n hideRequiredStatement?: boolean;\r\n}\r\n\r\nexport default class BankAccountDetails extends React.Component {\r\n\r\n private appDataCache = AppService.get(Types.Services.AppDataCache);\r\n\r\n public render() {\r\n const { bankAccount, readOnly, hideRequiredStatement } = this.props;\r\n\r\n return (\r\n
\r\n \r\n bankAccount.setBranchCode(bank) }} label={<>Bank} />\r\n Bank account type} />\r\n Account Number} />\r\n Branch code} />\r\n
\r\n )\r\n }\r\n}\r\n\r\n@observer\r\nexport class ThirdPartyBankAccountDetails extends React.Component {\r\n\r\n private downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n\r\n private async downloadDebitOrderAuthorityForm() {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.fetchMaintenanceDocument(MaintenanceDocumentType.ThirdPartyDebitOrderAuthority))\r\n DocumentHandler.convertAndDownloadDocument(response, true);\r\n }\r\n\r\n public render() {\r\n const { bankAccount, readOnly, registration } = this.props;\r\n\r\n return (\r\n
\r\n \r\n\r\n First name} />\r\n\r\n Surname} />\r\n\r\n \r\n\r\n ID Number} />\r\n\r\n {!readOnly &&\r\n
\r\n

Debit order authority

\r\n\r\n

You will need to download, complete and upload the form below

\r\n\r\n this.downloadDebitOrderAuthorityForm()}>DOWNLOAD DEBIT ORDER AUTHORITY FORM\r\n\r\n
\r\n \r\n bankAccount.documentID = docId}\r\n allowedExtensions={this.documentApiClient.allowedInvestorDocumentExtensions}\r\n taskRunnerLoadingText={\"Uploading Proof of Address\"}>\r\n \r\n \r\n {bankAccount.documentID &&\r\n

Upload complete

\r\n }\r\n

Drag your file here or browse to {!bankAccount.documentID ? \"upload\" : \"update\"}.

\r\n

Jpeg or pdf

\r\n \r\n
\r\n \r\n
\r\n
}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class ReadOnlyBankAccountDetails extends React.Component {\r\n\r\n private appDataCache = AppService.get(Types.Services.AppDataCache);\r\n\r\n public render() {\r\n const { bankAccount } = this.props;\r\n\r\n return (\r\n
\r\n \r\n \r\n
{bankAccount.meta.accountNo.value}
\r\n
{bankAccount.meta.branchCode.value}
\r\n
\r\n )\r\n }\r\n}","import { Misc } from '@singularsystems/neo-core';\r\nimport NumberUtils from '@singularsystems/neo-core/dist/NumberUtils';\r\nimport React from 'react';\r\nimport { TradeFees } from '../../../Models/Base/TradeCost';\r\n\r\ninterface ITradeFeesProps {\r\n tradeFees: TradeFees;\r\n}\r\n\r\nexport default class TradeCostDetails extends React.Component {\r\n\r\n private renderFee(label: string, amount: number) {\r\n return
\r\n
{label}:
\r\n
{NumberUtils.format(amount, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n }\r\n\r\n public render() {\r\n const tradeFees = this.props.tradeFees;\r\n \r\n return (\r\n
\r\n {this.renderFee(\"Brokerage\", tradeFees.brokerage)}\r\n {this.renderFee(\"STRATE\", tradeFees.strateFee)}\r\n {this.renderFee(\"VAT\", tradeFees.vat)}\r\n {this.renderFee(\"Estimated Total Fees\", tradeFees.totalFees)}\r\n
\r\n )\r\n }\r\n}","import React from 'react';\r\nimport WithdrawCashVM from './WithdrawCashVM';\r\nimport { observer } from 'mobx-react';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport { ReadOnlyBankAccountDetails } from '../Components/BankAccountDetails';\r\nimport { ModalUtils } from '@singularsystems/neo-core/dist/Components/Modal/ModalUtils';\r\nimport { Misc, NumberUtils } from '@singularsystems/neo-core';\r\nimport '../../../Styles/Registration/OTPComponent.scss';\r\nimport InvestorBankDetail from '../../../Models/Investors/InvestorBankDetail';\r\nimport TradeCostDetails from \"../Components/TradeCostDetails\";\r\n\r\ninterface IWithdrawCashProps {\r\n viewModel: WithdrawCashVM;\r\n}\r\n\r\n@observer\r\nexport default class WithdrawCash extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n
\r\n

{\"Withdraw from \" + viewModel.instrumentBalanceDetails?.instrument}

\r\n\r\n
\r\n\r\n
\r\n
\r\n viewModel.setBankDetails()} className=\"p-2\">\r\n\r\n

Total Costs for this Transaction

\r\n\r\n \r\n\r\n viewModel.setTransactionFees()}/>\r\n\r\n {(viewModel.currentSale.isAboveThreshold && !viewModel.isWithdrawAll)&&
Please note a sale of over 90% of your holdings will lead to a 100% withdrawal
}\r\n
\r\n viewModel.withdrawAvailableUnits()}>{viewModel.isWithdrawAll ? \"ENTER SPECIFIC AMOUNT\" : \"WITHDRAW ALL\"}\r\n
\r\n\r\n \r\n\r\n
\r\n\r\n
\r\n
Estimated Final Amount:
\r\n
{NumberUtils.format(viewModel.currentSale.amount - viewModel.currentSale.tradeFees.totalFees, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n\r\n
\r\n Confirm\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
{NumberUtils.format(viewModel.instrumentBalanceDetails?.valueAvailable ?? 0, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n \r\n {(bankDetails: InvestorBankDetail) => (\r\n
\r\n
\r\n \r\n
\r\n
\r\n this.beginEditBankDetails()}>Edit Bank Details\r\n
\r\n
\r\n { viewModel.showOtp(); }}>\r\n Submit\r\n \r\n
\r\n
\r\n
\r\n
\r\n )}\r\n
\r\n\r\n viewModel.navigateToDashboard(true)}\r\n closeButton={false}\r\n acceptButton={{ text: \"GO TO MY DASHBOARD\", onClick: () => viewModel.navigateToDashboard(true)}}>\r\n
\r\n Your withdrawal has been actioned and will be deposited into the following bank account.\r\n\r\n {viewModel.investor?.primaryBankDetails && \r\n
\r\n \r\n
}\r\n\r\n Contact us at hub@etfsa.co.za for queries and changes.\r\n
\r\n \r\n \r\n\r\n
\r\n );\r\n }\r\n \r\n private beginEditBankDetails() {\r\n this.props.viewModel.bankDetails = null;\r\n ModalUtils.showYesNoDismissible(\r\n \"Cancel Withdrawal\",\r\n
\r\n

\r\n Please note that your new bank details needs to be verified before you can submit this withdrawal instruction. \r\n Please look out for the verification email from hub@etfsa.co.za. \r\n Once received, please reload your withdrawal instruction. Do you want to continue?\r\n

\r\n
,\r\n () => this.props.viewModel.editBankDetails());\r\n }\r\n} ","import React from 'react';\r\nimport SwitchVM from './SwitchVM';\r\nimport { observer } from 'mobx-react';\r\nimport { Neo, NeoGrid } from \"@singularsystems/neo-react\";\r\nimport NumberUtils from \"@singularsystems/neo-core/dist/NumberUtils\";\r\nimport { Misc } from \"@singularsystems/neo-core\";\r\nimport TradeCostDetails from \"../Components/TradeCostDetails\";\r\nimport { Switch } from \"../../../Models/Base/TradeRequest\";\r\nimport { AppService, Types } from \"../../../Services/AppService\";\r\nimport { ScreenSize } from '../../../Services/AppLayout';\r\n\r\ninterface ISwitchProps {\r\n viewModel: SwitchVM;\r\n}\r\n\r\n@observer\r\nexport default class SwitchComponent extends React.Component {\r\n private layoutService = AppService.get(Types.Services.AppLayout);\r\n\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n const validation = viewModel.currentSwitch.validator.getRuleResult(Switch.validTradeRules);\r\n const amountExceedsAvailable = viewModel.currentSwitch.valueAvailable < viewModel.currentSwitch.amount;\r\n\r\n return (\r\n
\r\n\r\n

{\"Switching from \" + viewModel.currentSwitch.instrumentName + \" to:\"}

\r\n\r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n viewModel.showOtp()} className=\"p-2\">\r\n\r\n
\r\n \r\n
\r\n viewModel.switchPreferredProportions()}>{viewModel.isPercentage ? \"Switch To % Value\" : \"Switch To Rand Value (R)\"}\r\n
\r\n }>\r\n {(item, meta) => (\r\n \r\n \r\n viewModel.onInstrumentSelected(item)}\r\n items={viewModel.toInstruments}\r\n />\r\n \r\n = ScreenSize.Medium ? \"20%\" : \"30%\"}\r\n label=\"%\"\r\n hidden={viewModel.isPercentage}\r\n disabled={viewModel.checkInstrumentInd(item, viewModel.isPercentage)}\r\n onChange={() => viewModel.recalculateSwitch(item)}\r\n />\r\n = ScreenSize.Medium ? \"20%\" : \"30%\"}\r\n label=\"Amount\"\r\n hidden={!viewModel.isPercentage && this.layoutService.currentScreenSize <= ScreenSize.Medium}\r\n disabled={viewModel.checkInstrumentInd(item, !viewModel.isPercentage)}\r\n onChange={() => viewModel.recalculateSwitch(item)}\r\n />\r\n \r\n viewModel.recalculateSwitch(item)} buttonSize=\"sm\" />\r\n \r\n )}\r\n
\r\n
\r\n\r\n
\r\n {viewModel.currentSwitch.isAboveThreshold &&
Please note a switch of over 90% of your holdings will lead to a 100% switch
}\r\n \r\n\r\n
\r\n\r\n
\r\n
Estimated Final Amount:
\r\n
{NumberUtils.format(viewModel.currentSwitch.amount - viewModel.currentSwitch.tradeFees.totalFees, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n
\r\n\r\n
\r\n Confirm\r\n
\r\n\r\n
\r\n {this.layoutService.currentScreenSize < ScreenSize.Medium &&
\r\n \r\n
{NumberUtils.format(viewModel.currentSwitch.valueAvailable ?? 0, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n {!viewModel.isPercentage &&\r\n
\r\n \r\n
\r\n {NumberUtils.format(viewModel.totalPercentage ?? 0, Misc.NumberFormat.PercentDecimals, \"%\")}
\r\n
\r\n
}\r\n \r\n
\r\n {NumberUtils.format(viewModel.currentSwitch.amount ?? 0, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
}\r\n\r\n
\r\n\r\n
\r\n {this.layoutService.currentScreenSize >= ScreenSize.Medium &&
\r\n \r\n
{NumberUtils.format(viewModel.currentSwitch.valueAvailable ?? 0, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n {!viewModel.isPercentage &&\r\n
\r\n \r\n
\r\n {NumberUtils.format(viewModel.totalPercentage ?? 0, Misc.NumberFormat.PercentDecimals, \"%\")}
\r\n
\r\n
}\r\n \r\n
\r\n {NumberUtils.format(viewModel.currentSwitch.amount ?? 0, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
}\r\n
\r\n
\r\n
\r\n\r\n viewModel.navigateToDashboard(true)}\r\n closeButton={false}\r\n acceptButton={{ text: \"GO TO MY DASHBOARD\", onClick: () => viewModel.navigateToDashboard(true) }}>\r\n
\r\n Please note switches can take 5-7 days.\r\n
\r\n Contact us at hub@etfsa.co.za for any queries.\r\n
\r\n \r\n\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, NeoGrid } from '@singularsystems/neo-react';\r\nimport DashboardVM from '../DashboardVM';\r\nimport { observer } from 'mobx-react';\r\nimport StatementCriteria from '../../../Models/Portfolio/StatementCriteria';\r\n\r\ninterface IDistributionGridComponentProps {\r\n viewModel: DashboardVM;\r\n}\r\n\r\n@observer\r\nexport default class DistributionGrid extends React.Component {\r\n\r\n public render() {\r\n const { viewModel } = this.props;\r\n\r\n return (\r\n
\r\n
\r\n viewModel.setDistributionExportCriteria()}>Download Transactions\r\n
\r\n
\r\n \r\n \r\n {(item, meta) => (\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
Note: Financial transactions are limited to the last 5 years
\r\n
\r\n\r\n viewModel.downloadDistributionReport() }}>\r\n {(distributionExportCriteria: StatementCriteria) => (\r\n
\r\n \r\n \r\n
\r\n )}\r\n \r\n
\r\n )\r\n }\r\n}","import { Attributes, List, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\nimport { InvestmentType } from '../Registration/Enums/InvestmentType';\r\nimport { PaymentType } from \"../Registration/Enums/PaymentType\";\r\nimport { TradeRequest } from \"../Base/TradeRequest\";\r\n\r\n@NeoModel\r\nexport class Cart extends APIModelBase {\r\n\r\n public portfolioID: number = 0;\r\n\r\n public sourceOfFundsID: number = 0;\r\n\r\n public sourceOfFundsDescription: string = \"\";\r\n\r\n @Attributes.Integer()\r\n public investmentType: InvestmentType = InvestmentType.OnceOffInvestment;\r\n\r\n public paymentMethodID: PaymentType = PaymentType.EFT;\r\n\r\n @Attributes.Integer()\r\n @Attributes.Nullable()\r\n public debitOrderDay: number | null = 0;\r\n\r\n public sourceOfFundsDescriptionRequired: boolean = false;\r\n\r\n public cartDetails = new List(CartDetail);\r\n\r\n // Client only properties / methods\r\n\r\n public updateFromTradeRequest(tradeRequest: TradeRequest) {\r\n this.debitOrderDay = tradeRequest.debitOrderDay;\r\n this.investmentType = tradeRequest.investmentTypeID;\r\n this.sourceOfFundsID = tradeRequest.sourceOfFundsID!;\r\n this.sourceOfFundsDescription = tradeRequest.sourceOfFundsAdditionalInfo;\r\n this.paymentMethodID = tradeRequest.paymentMethodID;\r\n\r\n tradeRequest.selectedInstruments.forEach(instrument => {\r\n var existingCartDetail = this.cartDetails.find(c => c.instrumentID === instrument.instrumentID)\r\n\r\n if (existingCartDetail) {\r\n existingCartDetail.amount = instrument.amount;\r\n } else {\r\n var cartItem = this.cartDetails.addNew();\r\n cartItem.instrumentID = instrument.instrumentID;\r\n cartItem.amount = instrument.amount;\r\n }\r\n });\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.sourceOfFundsDescription) {\r\n return \"New cart\";\r\n } else {\r\n return this.sourceOfFundsDescription;\r\n }\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class CartDetail extends APIModelBase {\r\n\r\n public cartDetailID: number = 0;\r\n\r\n public cartID: number = 0;\r\n\r\n public instrumentID: number = 0;\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew) {\r\n return \"New investor cart details\";\r\n } else {\r\n return \"Investor Cart Details\";\r\n }\r\n }\r\n}","import { Attributes, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class CartDetailLookup extends APIModelBase {\r\n\r\n public instrumentID: number = 0;\r\n\r\n public instrumentName: string = \"\";\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.instrumentName) {\r\n return \"New cart detail lookup\";\r\n } else {\r\n return this.instrumentName;\r\n }\r\n }\r\n}","import { Views } from '@singularsystems/neo-react';\r\nimport { Attributes, List, Model, ModelBase, NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport Instrument from '../../../Models/Instruments/Instrument';\r\nimport PortfolioCatalogue from '../../../Models/Catalogue/PortfolioCatalogue';\r\nimport { Cart } from \"../../../Models/Cart/Cart\";\r\nimport CartDetailLookup from \"../../../Models/Cart/CartDetailLookup\";\r\nimport { NotificationDuration } from \"../../../Models/Enums/NotificationDuration\";\r\nimport { InstrumentProvider } from '../../../Models/Registration/Enums/InstrumentProvider';\r\n\r\n@NeoModel\r\nexport class FilterCriteria extends ModelBase {\r\n\r\n public instrumentID: number | null = null;\r\n\r\n @Attributes.Display(\"Region\")\r\n public regionID: number | null = null;\r\n\r\n @Attributes.Display(\"Asset Class\")\r\n public assetClassID: number | null = null;\r\n\r\n @Attributes.NoTracking()\r\n public instrumentProviders: Model.ISelectedItem[] = [];\r\n\r\n @Attributes.Display(\"Provider\")\r\n public instrumentProviderIDs: number[] = [];\r\n\r\n @Attributes.Display(\"Strategy\")\r\n public strategyID: number | null = null;\r\n}\r\n\r\n@NeoModel\r\nexport default class ProductsVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public appDataCache = AppService.get(Types.Services.AppDataCache),\r\n public oldSiteIntegration = AppService.get(Types.Services.OldSiteIntegration),\r\n public investorService = AppService.get(Types.Services.CurrentInvestorService),\r\n private config = AppService.get(Types.Config),\r\n public cartApiClient = AppService.get(Types.ApiClients.CartApiClient),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n ) {\r\n super(taskRunner);\r\n }\r\n\r\n public instruments = new List(Instrument);\r\n public filterCriteria = new FilterCriteria();\r\n public portfolioCatalogue: PortfolioCatalogue | null = null;\r\n public researchPageUrl = this.config.researchPageUrl;\r\n public cart: Cart | null = new Cart();\r\n public cartDetailLookups = new List(CartDetailLookup);\r\n public showPopover = false;\r\n public totalCartAmount = 0;\r\n\r\n public async initialise() {\r\n this.instruments = await this.investorService.portfolioData?.fetchInstruments()!\r\n this.appendSelectAllInstrument();\r\n this.clearFilterCriteria();\r\n\r\n var cartResult = await this.taskRunner.waitFor(this.cartApiClient.getCartDetailLookup(this.investorService.portfolioData!.portfolio.portfolioID));\r\n if (cartResult.data) {\r\n this.cartDetailLookups.set(cartResult.data);\r\n this.totalCartAmount = this.cartDetailLookups.sum(c => c.amount);\r\n }\r\n this.setDefaultInstrumentProvider();\r\n }\r\n\r\n public setDefaultInstrumentProvider() {\r\n let defaultInstrumentProvider = this.appDataCache.providers.data.find(c => c.instrumentProviderID === InstrumentProvider.etfSA)\r\n\r\n if (defaultInstrumentProvider) {\r\n this.filterCriteria.instrumentProviders.push({ id: defaultInstrumentProvider.instrumentProviderID, display: defaultInstrumentProvider.instrumentProviderName });\r\n this.filterCriteria.instrumentProviderIDs.push(InstrumentProvider.etfSA);\r\n this.filterCriteria.isSelfDirty = true;\r\n }\r\n }\r\n\r\n public appendSelectAllInstrument() {\r\n let instrument = new Instrument();\r\n\r\n instrument.instrumentID = -1;\r\n instrument.instrumentName = \"All\";\r\n this.instruments.unshift(instrument);\r\n }\r\n\r\n public get filteredList() {\r\n let searchListResult = Array.from(this.instruments);\r\n\r\n searchListResult = searchListResult.filter(i =>\r\n (!this.filterCriteria.instrumentID || (i.instrumentID === this.filterCriteria.instrumentID || this.filterCriteria.instrumentID === -1)) &&\r\n (!this.filterCriteria.regionID || i.regionID === this.filterCriteria.regionID) &&\r\n (!this.filterCriteria.assetClassID || i.assetClassID === this.filterCriteria.assetClassID) &&\r\n (!this.filterCriteria.strategyID || i.strategyID === this.filterCriteria.strategyID) &&\r\n (this.filterCriteria.instrumentProviders.length === 0 || this.filterCriteria.instrumentProviders.find(c => c.id === i.instrumentProviderID))\r\n );\r\n\r\n return this.filterCriteria.isSelfDirty ? searchListResult.filter(c => c.instrumentID !== -1) : [];\r\n }\r\n\r\n public clearFilterCriteria() {\r\n this.filterCriteria = new FilterCriteria();\r\n this.filterCriteria.markOld(true);\r\n }\r\n\r\n public onItemSelect() {\r\n this.filterCriteria.isSelfDirty = true;\r\n\r\n if (!this.filterCriteria.regionID && !this.filterCriteria.assetClassID && !this.filterCriteria.strategyID && this.filterCriteria.instrumentProviders.length === 0) {\r\n this.filterCriteria.isSelfDirty = false;\r\n }\r\n }\r\n\r\n public async deleteCartItem(instrumentID: number | null) {\r\n var portfolioId = this.investorService.portfolioData!.portfolio.portfolioID;\r\n if (instrumentID) {\r\n await this.taskRunner.run(async () => {\r\n this.cartApiClient.deleteCartDetail(portfolioId, instrumentID)\r\n this.notifications.addSuccess(\"Delete successful\", \"The cart item was successfully deleted\", NotificationDuration.Standard);\r\n })\r\n } else {\r\n await this.taskRunner.run(async () => {\r\n this.cartApiClient.deleteCartDetail(portfolioId, instrumentID)\r\n this.notifications.addSuccess(\"Delete successful\", \"All cart items was successfully deleted\", NotificationDuration.Long);\r\n this.cartDetailLookups.length = 0;\r\n this.showPopover = false;\r\n })\r\n }\r\n this.refreshCartInfo()\r\n }\r\n\r\n private refreshCartInfo() {\r\n this.totalCartAmount = 0;\r\n\r\n if (this.cartDetailLookups.length > 0) {\r\n this.totalCartAmount = this.cartDetailLookups.sum(c => c.amount)\r\n } else {\r\n this.showPopover = false\r\n }\r\n }\r\n}","import { Neo } from \"@singularsystems/neo-react\";\r\nimport { observer } from \"mobx-react\";\r\nimport React, { Component } from \"react\";\r\nimport Instrument from \"../../../Models/Instruments/Instrument\";\r\nimport ProductsVM from \"../Trades/ProductsVM\";\r\nimport caret from '../../../assets/img/caret.png'\r\nimport { Misc, NumberUtils } from \"@singularsystems/neo-core\";\r\n\r\ninterface IProductAccordionProps {\r\n instrument: Instrument;\r\n viewModel: ProductsVM;\r\n onSelect(instrumentCode: string): void\r\n}\r\n\r\n@observer\r\nexport default class ProductAccordion extends Component {\r\n\r\n render() {\r\n const { instrument, viewModel, onSelect } = this.props;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {instrument.totalExpenseRatio}%\r\n {instrument.instrumentCode}\r\n
\r\n
instrument.isExpanded = !instrument.isExpanded}>\r\n

{instrument.instrumentName}

\r\n \"caret\"\r\n
\r\n \r\n \r\n onSelect(instrument.instrumentCode)}>\r\n Invest\r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { EnumHelper, Misc, ModalUtils, NeoModel, NumberUtils } from '@singularsystems/neo-core';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport { MaintenanceDocumentType } from \"../../../Models/Base/Enums/MaintenanceDocumentType\";\r\nimport { Neo, NeoGrid, Views } from '@singularsystems/neo-react';\r\nimport { injectable } from 'inversify';\r\nimport DocumentHandler from '../../../Services/DocumentHandler';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { ReadOnlyBankAccountDetails } from '../../Investor/Components/BankAccountDetails';\r\nimport { InvestmentType } from '../../../Models/Registration/Enums/InvestmentType';\r\nimport { PaymentType } from '../../../Models/Registration/Enums/PaymentType';\r\nimport PurchaseVM from '../../Investor/Trades/PurchaseVM';\r\n\r\ninterface ITradeConfirmationComponentProps {\r\n viewModel: PurchaseVM,\r\n tradeConfirmationVM: TradeConfirmationVM;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class TradeConfirmationVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n public taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public otpService = AppService.get(Types.Services.OtpService),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public recurringTradeRequest = AppService.get(Types.ApiClients.RecurringTradeRequestApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n ) {\r\n super(taskRunner);\r\n }\r\n\r\n public showTradeConfirmationModal: boolean = false;\r\n public showSuccessModal: boolean = false;\r\n public showBankDetails: boolean = false;\r\n\r\n public showHideConfirmationModal() {\r\n this.showTradeConfirmationModal = !this.showTradeConfirmationModal;\r\n }\r\n\r\n public downloadMaintenanceDocument(maintenanceDocumentType: MaintenanceDocumentType) {\r\n this.taskRunner.run(\"Fetching Document\", async () => {\r\n var response = await this.documentApiClient.fetchPublicMaintenanceDocument(maintenanceDocumentType);\r\n\r\n if (response) {\r\n DocumentHandler.convertAndDownloadDocument(response, true);\r\n }\r\n });\r\n };\r\n}\r\n\r\n@observer\r\nexport default class TradeConfirmationComponent extends React.Component {\r\n private config = AppService.get(Types.Config);\r\n\r\n public render() {\r\n const { viewModel } = this.props;\r\n\r\n return (\r\n
\r\n {viewModel.tradeRequest.paymentMethodID === PaymentType.EFT\r\n ? this.renderETFModal()\r\n : this.renderOnceOffCollectionModal()}\r\n {this.renderBrokerBankDetails()}\r\n {this.renderSuccessModal()}\r\n
\r\n );\r\n }\r\n\r\n private beginEditBankDetails() {\r\n this.dismissModal();\r\n ModalUtils.showYesNoDismissible(\r\n \"Cancel Purchase\",\r\n
\r\n

\r\n Please note that your new bank details needs to be verified before you can submit this purchase instruction.\r\n Please look out for the verification email from hub@etfsa.co.za. \r\n Once received, please reload your purchase instruction. Do you want to continue?\r\n

\r\n
,\r\n () => this.props.viewModel.editBankDetails());\r\n }\r\n\r\n private dismissModal(isTradeComplete: boolean = false) {\r\n if (!isTradeComplete) {\r\n this.props.tradeConfirmationVM.showTradeConfirmationModal = false;\r\n this.props.viewModel.tradeRequest.hasAcceptedDebitOrderAuthority = false;\r\n this.props.viewModel.tradeRequest.hasAcceptedTermsAndConditions = false;\r\n } else {\r\n this.props.tradeConfirmationVM.showBankDetails = false;\r\n this.props.viewModel.navigateToDashboard(isTradeComplete);\r\n }\r\n }\r\n\r\n private onSubmit(viewModel: PurchaseVM) {\r\n this.dismissModal();\r\n viewModel.showOtp();\r\n }\r\n\r\n private renderOnceOffCollectionModal() {\r\n const { viewModel } = this.props;\r\n const investor = viewModel.accountInformation?.appInvestorData.accountInformationVM.investor;\r\n const investorBankDetails = investor?.thirdPartyBankDetails ?? investor?.primaryBankDetails;\r\n const message = {\r\n debitFrequency: viewModel.tradeRequest.investmentTypeID === InvestmentType.RecurringInvestment ? \"per month\" : \"\",\r\n amountInRands: NumberUtils.format(viewModel.tradeRequest.totalPurchaseAmount, Misc.NumberFormat.CurrencyDecimals, \"R\")\r\n };\r\n\r\n return (\r\n this.dismissModal()}\r\n className=\"trade-confirmation\"\r\n buttons={[{ text: \"Submit\", variant: \"info\", disabled: !(viewModel.tradeRequest.hasAcceptedDebitOrderAuthority && viewModel.tradeRequest.hasAcceptedTermsAndConditions), onClick: () => this.onSubmit(viewModel) }]}>\r\n \r\n
You are investing in:
\r\n \r\n {(item, meta) => (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n

Your account will be debited with an estimated {message.amountInRands} {message.debitFrequency}. You will be notified when your investment has been completed.

\r\n \r\n this.props.tradeConfirmationVM.downloadMaintenanceDocument(MaintenanceDocumentType.DebitOrderAuthority)}>debit order authority} />\r\n
\r\n
Debit Order Account Details
\r\n \r\n
\r\n \r\n this.beginEditBankDetails()}>Edit Bank Details\r\n \r\n
\r\n \r\n );\r\n }\r\n\r\n private renderBrokerBankDetails() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n this.dismissModal(true)}>\r\n
\r\n
\r\n

Please deposit {NumberUtils.format(viewModel.tradeRequest.totalPurchaseAmount, Misc.NumberFormat.CurrencyDecimals, \"R\")} into the etfSA bank account.

\r\n
Account name: {this.config.brokerBankDetails.accountName}
\r\n
Bank: {this.config.brokerBankDetails.bank}
\r\n
Account number: {this.config.brokerBankDetails.accountNumber}
\r\n
Universal branch code: {this.config.brokerBankDetails.branchCode}
\r\n
Account Type: {this.config.brokerBankDetails.accountType}
\r\n
Reference number: {viewModel.accountInformation?.investor?.idNo}
\r\n
\r\n

You will be notified when your funds have cleared and your investment has been completed.

\r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n private renderETFModal() {\r\n const { viewModel } = this.props;\r\n\r\n return (\r\n this.dismissModal()}\r\n className=\"trade-confirmation\"\r\n buttons={[{ text: \"Submit\", variant: \"info\", disabled: !viewModel.tradeRequest.hasAcceptedTermsAndConditions, onClick: () => this.onSubmit(viewModel)}]}>\r\n \r\n
You are investing in:
\r\n \r\n {(item, meta) => (\r\n \r\n \r\n \r\n \r\n )}\r\n \r\n \r\n

After you have confirmed this trade, banking details will be provided to deposit funds

\r\n \r\n
\r\n
\r\n \r\n );\r\n }\r\n\r\n private renderSuccessModal () {\r\n const { viewModel } = this.props;\r\n\r\n return (\r\n viewModel.navigateToDashboard(true)}\r\n closeButton={false}\r\n acceptButton={{ text: \"GO TO MY DASHBOARD\", onClick: () => viewModel.navigateToDashboard(true)}}>\r\n

\r\n Please note your purchase request has been submitted. Contact us at hub@etfsa.co.za for any queries.\r\n

\r\n \r\n )\r\n }\r\n}","import { List, Misc, ModalUtils } from \"@singularsystems/neo-core\";\r\nimport { Views } from \"@singularsystems/neo-react\";\r\nimport Instrument from \"../../../Models/Instruments/Instrument\";\r\nimport InvestorOTPDetails from \"../../../Models/Investors/InvestorOTPDetails\";\r\nimport { TradeRequest } from \"../../../Models/Base/TradeRequest\";\r\nimport { NotificationDuration } from \"../../../Models/Enums/NotificationDuration\";\r\nimport Investor from \"../../../Models/Registration/Investor\";\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport StringConstants from \"../../../Services/StringConstants\";\r\nimport ProductView from \"./Product\";\r\nimport Dashboard from '../../Dashboard/Dashboard';\r\nimport { RecurringTradeRequest } from \"../../../Models/Base/RecurringTradeRequest\";\r\nimport InvestmentInfoVM from \"../../InformationPanel/Components/InvestmentInfoVM\";\r\nimport InvestorLinkedPortfolioLookup from \"../../../Models/Investors/InvestorLinkedPortfolioLookup\";\r\nimport { TradeConfirmationVM } from \"../../Registration/Components/TradeConfirmationComponent\";\r\nimport AccountInformationVM from \"../../InformationPanel/AccountInformationVM\";\r\nimport { InvestmentType } from \"../../../Models/Registration/Enums/InvestmentType\";\r\nimport { PaymentType } from \"../../../Models/Registration/Enums/PaymentType\";\r\nimport { PurchaseInstrumentDetail } from \"../../../Models/Instruments/InstrumentDetail\";\r\nimport SourceOfFunds from \"../../../Models/Catalogue/SourceOfFunds\";\r\nimport { Cart } from \"../../../Models/Cart/Cart\";\r\nimport { runInAction } from \"mobx\";\r\n\r\nexport default class PurchaseVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private currentInvestorService = AppService.get(Types.Services.CurrentInvestorService),\r\n public appDataCache = AppService.get(Types.Services.AppDataCache),\r\n private investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n private recurringTradeRequestApiClient = AppService.get(Types.ApiClients.RecurringTradeRequestApiClient),\r\n private otpService = AppService.get(Types.Services.OtpService),\r\n private tradeRequestApiClient = AppService.get(Types.ApiClients.TradeRequestApiClient),\r\n private cartApiClient = AppService.get(Types.ApiClients.CartApiClient),\r\n ) {\r\n super(taskRunner);\r\n }\r\n\r\n public tradeRequest = new TradeRequest();\r\n public investorOTPDetails: InvestorOTPDetails | null = null;\r\n public instruments = new List(Instrument);\r\n public recurringTradeRequest: RecurringTradeRequest | null = null;\r\n public investmentVM: InvestmentInfoVM | null = null;\r\n public portfolio: InvestorLinkedPortfolioLookup | null = null;\r\n public accountInformation: AccountInformationVM | null = null;\r\n public tradeConfirmation = new TradeConfirmationVM();\r\n public cart = new Cart();\r\n public purchaseSubmitted = false;\r\n\r\n get availableInstruments() {\r\n return this.instruments.filter(i => i.instrumentID !== -1 && !this.tradeRequest.selectedInstruments.find(c => c.instrumentID === i.instrumentID));\r\n }\r\n\r\n get sourceOfFundPlaceholder() {\r\n return this.appDataCache.sourceOfFunds.currentData.find(c => c.sourceOfFundsID === this.tradeRequest.sourceOfFundsID)?.additionalInfoPrompt ?? \"\";\r\n }\r\n\r\n get showFreeTextInput() {\r\n return this.appDataCache.sourceOfFunds.currentData.find(c => c.sourceOfFundsID === this.tradeRequest.sourceOfFundsID)?.requiresAdditionalInfo ?? false;\r\n }\r\n\r\n public async load(instrumentCode: string) {\r\n this.portfolio = this.currentInvestorService.investorData!.selectedPortfolio;\r\n this.accountInformation = this.currentInvestorService.investorData?.accountInformationVM!;\r\n this.instruments = await this.currentInvestorService.portfolioData?.fetchInstruments()!;\r\n\r\n this.appDataCache.debitOrderDays.get();\r\n this.appDataCache.sourceOfFunds.get();\r\n\r\n let results = await this.taskRunner.waitForAll({\r\n tc: this.appDataCache.tradeCosts.getDataAsync(),\r\n rtr: this.recurringTradeRequestApiClient.getRecurringTradeRequestDetails(this.portfolio?.portfolioTypeID!)\r\n });\r\n\r\n this.tradeRequest.portfolioTypeID = this.portfolio!.portfolioTypeID;\r\n this.tradeRequest.tradeCosts = results.tc;\r\n\r\n if (results.rtr.data) {\r\n this.recurringTradeRequest = RecurringTradeRequest.fromJSObject(results.rtr.data);\r\n this.tradeRequest.debitOrderDay = this.recurringTradeRequest.debitOrderDay;\r\n this.tradeRequest.initialSourceOfFundsID = this.recurringTradeRequest.sourceOfFundsID;\r\n this.tradeRequest.initialSourceOfFundsAdditionalInfo = this.recurringTradeRequest.sourceOfFundsAdditionalInfo;\r\n }\r\n\r\n var cartResult = await this.taskRunner.waitFor(this.cartApiClient.getCart(this.portfolio!.portfolioID));\r\n if (cartResult.data) {\r\n this.cart.set(cartResult.data);\r\n }\r\n\r\n if (instrumentCode.length > 0) {\r\n this.preloadInstrument(instrumentCode);\r\n }\r\n\r\n if (!this.cart.isNew) {\r\n runInAction(() => this.setTradeRequestFromCart());\r\n }\r\n\r\n if (!this.investorOTPDetails || !this.accountInformation.investor) {\r\n const results = await this.taskRunner.waitForAll({ otpDetails: this.investorApiClient.getInvestorOTPDetails(), investor: this.investorApiClient.getInvestor() });\r\n\r\n this.investorOTPDetails = InvestorOTPDetails.fromJSObject(results.otpDetails.data);\r\n this.accountInformation.investor = Investor.fromJSObject(results.investor.data);\r\n } else {\r\n ModalUtils.showMessage('Error loading investor details', 'Please try again.');\r\n }\r\n }\r\n\r\n public calculateTradeFees() {\r\n this.tradeRequest.selectedInstruments.forEach(si => {\r\n const instrument = this.instruments.find(i => i.instrumentID === si.instrumentID);\r\n\r\n if (instrument) {\r\n si.setPurchaseTradeValues(this.tradeRequest, instrument);\r\n } else {\r\n // Instrument in the dropdown was cleared.\r\n this.tradeRequest.calculateFees();\r\n }\r\n });\r\n }\r\n\r\n public editBankDetails() {\r\n this.currentInvestorService!.investorData!.accountInformationVM.investor!.primaryBankDetails = null;\r\n this.currentInvestorService!.investorData!.accountInformationVM.beginEditBankDetails();\r\n this.tradeRequest = new TradeRequest();\r\n this.navigateToDashboard();\r\n }\r\n\r\n public navigateToDashboard(success: boolean = false) {\r\n if (success) {\r\n this.currentInvestorService.portfolioData!.resetPortfolioData();\r\n this.navigation.navigateToView(Dashboard);\r\n } else {\r\n this.navigation.navigateToView(ProductView);\r\n }\r\n }\r\n\r\n public preloadInstrument(selectedInstrumentCode: string | null, amount: number = 0, instrumentID: number | null = 0) {\r\n\r\n let foundInstrument: Instrument | undefined;\r\n\r\n if (selectedInstrumentCode) {\r\n foundInstrument = this.instruments.find(c => c.instrumentCode === selectedInstrumentCode);\r\n } else if (instrumentID) {\r\n foundInstrument = this.instruments.find(c => c.instrumentID === instrumentID);\r\n }\r\n\r\n if (foundInstrument) {\r\n if (!this.tradeRequest.selectedInstruments.find(c => c.instrumentID === foundInstrument?.instrumentID)) {\r\n let instrument = new PurchaseInstrumentDetail();\r\n\r\n instrument.amount = amount;\r\n instrument.instrumentID = foundInstrument.instrumentID;\r\n instrument.instrument = foundInstrument.instrumentName;\r\n\r\n this.tradeRequest.selectedInstruments.push(instrument);\r\n }\r\n } else {\r\n this.notifications.addDanger(\"Error Loading Instrument\", \"One or more supplied instrument codes does not exist or is currently not tradeable.\", NotificationDuration.Standard);\r\n }\r\n }\r\n\r\n public async showOtp(resendOtp: boolean = true) {\r\n const result = await this.sendOtp(resendOtp);\r\n if (result.cancelled) {\r\n if ((await ModalUtils.showYesNo(\"Cancel Trade Request\", \"Are you sure you want to cancel the trade request?\")) === Misc.ModalResult.No) {\r\n this.showOtp(false);\r\n } else {\r\n this.otpService.currentModel = null;\r\n }\r\n }\r\n }\r\n\r\n private async sendOtp(sendOtp: boolean = true) {\r\n const result = await this.otpService.showOtpModal(this.investorOTPDetails!, sendOtp);\r\n\r\n if (result.otp) {\r\n this.tradeRequest.otp = result.otp;\r\n this.submitInstruction();\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private async submitInstruction() {\r\n if (this.tradeRequest.portfolioTypeID !== null) {\r\n await this.taskRunner.run(async (options) => {\r\n options.onError = (e) => {\r\n if (!e.isServerError) {\r\n var errorDetail = e.body.toLocaleLowerCase();\r\n if (errorDetail.includes(\"otp\")) {\r\n if (errorDetail.includes(\"locked out\")) {\r\n this.otpService.currentModel = null;\r\n this.navigateToDashboard();\r\n } else {\r\n this.showOtp(false);\r\n }\r\n };\r\n } else {\r\n this.notifications.addWarning(\"OTP\", StringConstants.getErrorNotificationText(\"during the submission of your OTP\"), NotificationDuration.Long);\r\n }\r\n };\r\n\r\n if (this.tradeRequest.investmentTypeID === InvestmentType.OnceOffInvestment) {\r\n await this.tradeRequestApiClient.purchase(this.tradeRequest.toPurchase().toJSObject());\r\n } else {\r\n this.tradeRequest.paymentMethodID = PaymentType.OnceOffCollection;\r\n await this.recurringTradeRequestApiClient.postRecurringTradeRequest(this.tradeRequest.toRecurringTradeRequest().toJSObject());\r\n }\r\n\r\n this.otpService.currentModel = null;\r\n\r\n this.tradeRequest.paymentMethodID === PaymentType.OnceOffCollection\r\n ? this.tradeConfirmation.showSuccessModal = true\r\n : this.tradeConfirmation.showBankDetails = true;\r\n\r\n this.cartApiClient.deleteCartDetail(this.cart.portfolioID, null)\r\n\r\n this.cart = new Cart();\r\n this.tradeRequest = new TradeRequest();\r\n this.tradeConfirmation = new TradeConfirmationVM();\r\n\r\n this.purchaseSubmitted = true;\r\n });\r\n } else {\r\n this.notifications.addWarning(\"Issue during submission of purchase\", \"Please try again\", NotificationDuration.Long);\r\n }\r\n }\r\n\r\n public showAccountInformationPanel() {\r\n this.currentInvestorService.toggleAccountInformationPanel();\r\n this.accountInformation!.selectPortfolio(this.portfolio!);\r\n }\r\n\r\n public setSourceOfFundsValues(item: SourceOfFunds) {\r\n this.tradeRequest.isSourceOfFundsAdditionalInfoRequired = item.requiresAdditionalInfo;\r\n\r\n if (!item.requiresAdditionalInfo) {\r\n this.tradeRequest.sourceOfFundsAdditionalInfo = \"\";\r\n }\r\n }\r\n\r\n public setTradeRequestFromCart() {\r\n this.tradeRequest.debitOrderDay = this.cart.debitOrderDay ?? 0;\r\n this.tradeRequest.investmentTypeID = this.cart.investmentType;\r\n this.tradeRequest.sourceOfFundsID = this.cart.sourceOfFundsID;\r\n this.tradeRequest.isSourceOfFundsAdditionalInfoRequired = this.cart.sourceOfFundsDescriptionRequired;\r\n this.tradeRequest.sourceOfFundsAdditionalInfo = this.cart.sourceOfFundsDescription;\r\n this.tradeRequest.paymentMethodID = this.cart.paymentMethodID;\r\n\r\n if (this.cart.cartDetails.length > 0) {\r\n this.cart.cartDetails.forEach(instrument => {\r\n this.preloadInstrument(null, instrument.amount, instrument.instrumentID);\r\n });\r\n } else {\r\n this.tradeRequest.ensureAtLeastOneInstrument();\r\n }\r\n\r\n this.calculateTradeFees();\r\n }\r\n\r\n public checkAndSaveCart() {\r\n var validation = this.tradeRequest.validator.getRuleResult(TradeRequest.validTradeRules);\r\n\r\n if (validation!.isValid && this.tradeRequest.isValid) {\r\n runInAction(() => this.saveCart());\r\n return null;\r\n }\r\n else {\r\n if (!this.purchaseSubmitted) {\r\n this.notifications.addDanger(\"Unable to save information\", validation?.errors, NotificationDuration.Standard);\r\n return validation?.errors;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n public async saveCart() {\r\n if (this.tradeRequest.isDirty) {\r\n this.cart.portfolioID = this.currentInvestorService.portfolioData!.portfolio.portfolioID;\r\n this.cart.updateFromTradeRequest(this.tradeRequest);\r\n\r\n await this.taskRunner.run(async () => {\r\n this.cartApiClient.putCart(this.cart.toJSObject());\r\n this.notifications.addSuccess(\"Information updated\", \"Investment information updated successfully\", NotificationDuration.Standard);\r\n });\r\n }\r\n }\r\n\r\n public async deleteCartDetail(instrumentId: number) {\r\n if (instrumentId !== 0) {\r\n await this.taskRunner.run(async () => {\r\n this.cartApiClient.deleteCartDetail(this.cart.portfolioID, instrumentId)\r\n this.notifications.addSuccess(\"Instrument deleted\", \"The instrument was successfully deleted\", NotificationDuration.Standard);\r\n this.cart.cartDetails.removeWithoutTracking(this.cart.cartDetails.find(c => c.instrumentID === instrumentId)!);\r\n })\r\n }\r\n\r\n this.tradeRequest.ensureAtLeastOneInstrument();\r\n }\r\n}","import { EnumHelper, Misc, NumberUtils, Validation } from \"@singularsystems/neo-core\";\r\nimport { Neo, NeoGrid, Routing, Views } from \"@singularsystems/neo-react\";\r\nimport { observer } from \"mobx-react\";\r\nimport React from \"react\";\r\nimport { TradeRequest } from \"../../../Models/Base/TradeRequest\";\r\nimport { InvestmentType } from \"../../../Models/Registration/Enums/InvestmentType\";\r\nimport { PaymentType } from \"../../../Models/Registration/Enums/PaymentType\";\r\nimport TradeCostDetails from \"../Components/TradeCostDetails\";\r\nimport PurchaseVM from \"./PurchaseVM\";\r\nimport ClickLink from \"../../../App/Components/ClickLink\";\r\nimport TradeConfirmationComponent from \"../../Registration/Components/TradeConfirmationComponent\";\r\nimport BreadCrumb from \"../../../App/Components/BreadCrumb\";\r\nimport { AppService, Types } from \"../../../Services/AppService\";\r\nimport { ScreenSize } from \"../../../Services/AppLayout\";\r\n\r\nclass PurchaseParams {\r\n instrumentCode = {};\r\n}\r\n\r\nEnumHelper.decorateEnum(PaymentType, (d) => {\r\n d.describe(PaymentType.EFT, \"EFT\");\r\n d.describe(PaymentType.OnceOffCollection, \"Once Off Collection\");\r\n});\r\n\r\n@observer\r\nexport default class PurchaseView extends Views.ViewBase {\r\n static params = new PurchaseParams();\r\n\r\n private layoutService = AppService.get(Types.Services.AppLayout);\r\n\r\n constructor(props: any) {\r\n super(\"Buys\", PurchaseVM, props);\r\n }\r\n\r\n async beforeRouteChanged(props: Routing.IRouteChangedProps) {\r\n if (!this.viewModel.purchaseSubmitted) {\r\n var errorInfo = this.viewModel.checkAndSaveCart();\r\n if (errorInfo) {\r\n props.leavePrompt = \"Leaving without fixing the following issues will result in not saving your information: \" + errorInfo;\r\n }\r\n }\r\n }\r\n\r\n public getBreadCrumbList() {\r\n const breadcrumbs = super.getBreadCrumbList();\r\n\r\n breadcrumbs.splice(0, 0, {\r\n label: 'Product',\r\n link: '/product'\r\n });\r\n\r\n return breadcrumbs;\r\n }\r\n\r\n protected async viewParamsUpdated() {\r\n await this.viewModel.load(this.viewParams.instrumentCode.asString() === \"none\" ? \"\" : this.viewParams.instrumentCode.asString());\r\n }\r\n\r\n render() {\r\n const viewModel = this.viewModel;\r\n const validation = viewModel.tradeRequest.validator.getRuleResult(TradeRequest.validTradeRules);\r\n const debitOrderDays = viewModel.appDataCache.debitOrderDays.currentData;\r\n\r\n return (\r\n
\r\n \r\n
\r\n
You are investing in:
\r\n
\r\n viewModel.navigateToDashboard(false)}>\r\n
\r\n Search\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n viewModel.tradeConfirmation.showHideConfirmationModal()} validationDisplayMode={Validation.DisplayMode.Always}>\r\n
\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n {viewModel.tradeRequest.investmentTypeID === InvestmentType.OnceOffInvestment\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 viewModel.setSourceOfFundsValues(i!)\r\n }} suppressLabel />\r\n
\r\n
\r\n
\r\n
\r\n viewModel.tradeRequest.selectedInstruments.addNew() }} className=\"mb-1\">\r\n {(item, meta) => (\r\n \r\n (item.instrumentID !== 0 && item.amount > 0) && viewModel.checkAndSaveCart()}>\r\n \r\n viewModel.calculateTradeFees()}\r\n valueMember=\"instrumentID\"\r\n />\r\n \r\n = ScreenSize.Medium ? \"20%\" : \"30%\"}\r\n label=\"Amount\"\r\n disabled={item.instrumentID === null}\r\n onChange={() => viewModel.calculateTradeFees()}\r\n />\r\n \r\n viewModel.deleteCartDetail(item.meta.instrumentID.value)}\r\n buttonSize=\"sm\"\r\n />\r\n \r\n )}\r\n \r\n
\r\n {(viewModel.tradeRequest.investmentTypeID === InvestmentType.RecurringInvestment && viewModel.recurringTradeRequest) &&\r\n
\r\n
\r\n \r\n
\r\n
\r\n }\r\n \r\n
\r\n
\r\n
Estimated Final Amount:
\r\n
{NumberUtils.format(viewModel.tradeRequest.estimatedFinalAmount, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
\r\n\r\n {this.layoutService.currentScreenSize < ScreenSize.Medium &&\r\n
\r\n \r\n
{NumberUtils.format(viewModel.tradeRequest.totalPurchaseAmount, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
}\r\n
\r\n
\r\n \r\n Confirm\r\n \r\n
\r\n
\r\n
\r\n
\r\n {this.layoutService.currentScreenSize >= ScreenSize.Medium &&\r\n
\r\n \r\n
{NumberUtils.format(viewModel.tradeRequest.totalPurchaseAmount, Misc.NumberFormat.CurrencyDecimals, \"R\")}
\r\n
}\r\n
\r\n
\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n","export enum PortfolioType {\r\n Discretionary = 1,\r\n TaxFree = 3\r\n}","import React from \"react\";\r\nimport { Neo, NeoGrid, Views } from \"@singularsystems/neo-react\";\r\nimport ProductsVM from \"./ProductsVM\";\r\nimport { observer } from \"mobx-react\";\r\nimport Funnel from \"../../../assets/img/funnel.svg\";\r\nimport ProductAccordion from \"../Components/ProductAccordion\";\r\nimport closeIcon from \"../../../assets/img/close-icon.svg\";\r\nimport BreadCrumb from \"../../../App/Components/BreadCrumb\";\r\nimport PurchaseView from \"./Purchase\";\r\nimport { Misc, NumberUtils } from \"@singularsystems/neo-core\";\r\nimport Popover from \"../../../App/Components/Popover\";\r\n\r\n@observer\r\nexport default class ProductView extends Views.ViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"Products\", ProductsVM, props);\r\n }\r\n\r\n public getBreadCrumbList() {\r\n return super.getBreadCrumbList();\r\n }\r\n\r\n private containerRef = React.createRef();\r\n\r\n render() {\r\n const viewModel = this.viewModel;\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n \r\n window.open(`${viewModel.researchPageUrl}`, \"_blank\")\r\n }>\r\n Research Page\r\n \r\n { this.viewModel.showPopover = true }}\r\n onClick={() => this.navigation.navigateToView(PurchaseView, { instrumentCode: \"none\" })}>\r\n
\r\n \r\n {NumberUtils.format(this.viewModel.totalCartAmount, Misc.NumberFormat.CurrencyDecimals, \"R\")}\r\n
\r\n \r\n
\r\n
\r\n\r\n
Products
\r\n
\r\n
\r\n
\r\n \r\n {viewModel.filterCriteria.isSelfDirty && (\r\n viewModel.clearFilterCriteria()}\r\n />\r\n )}\r\n
\r\n \r\n viewModel.onItemSelect(),\r\n }}\r\n />\r\n viewModel.onItemSelect(),\r\n }}\r\n />\r\n \r\n viewModel.onItemSelect()}\r\n placeholder=\"Choose the provider\"\r\n />\r\n \r\n viewModel.onItemSelect(),\r\n }}\r\n />\r\n \r\n
\r\n {viewModel.filteredList.length > 0 ? (\r\n viewModel.filteredList.map((i) => (\r\n this.navigation.navigateToView(PurchaseView, { instrumentCode: ic })}\r\n />\r\n ))\r\n ) : (\r\n <>\r\n \"funnel\"\r\n

Use the filters above to find products

\r\n \r\n )}\r\n
\r\n
\r\n
\r\n\r\n {this.viewModel.showPopover && this.containerRef.current &&\r\n {\r\n if (!isInPopover) {\r\n this.viewModel.showPopover = false\r\n }\r\n }}>\r\n {viewModel.cartDetailLookups.length > 0 ?\r\n
\r\n \r\n
\r\n this.navigation.navigateToView(PurchaseView, { instrumentCode: \"none\" })} variant=\"info\" className=\"ml-3\">Purchase\r\n await viewModel.deleteCartItem(null)} variant=\"info\" className=\"mr-3\">Delete All\r\n
\r\n } showAddButton={false}>\r\n {(item, meta) => (\r\n \r\n \r\n \r\n await viewModel.deleteCartItem(item.meta.instrumentID.value)} buttonSize=\"sm\" />\r\n \r\n )}\r\n
\r\n
\r\n\r\n : Your cart is empty\r\n }\r\n \r\n }\r\n
\r\n );\r\n }\r\n}","import { EnumHelper } from \"@singularsystems/neo-core\";\r\n\r\nexport enum RegistrationState {\r\n PersonalDetails = 1,\r\n AccountType = 2,\r\n Identification = 3,\r\n PoliticalSensitivity = 4,\r\n ProofOfResidence = 5,\r\n BankDetails = 6,\r\n TaxDetails = 7,\r\n Mandate = 8,\r\n AccountCreated = 9\r\n}\r\n\r\nEnumHelper.decorateEnum(RegistrationState, e => {\r\n e.describe(RegistrationState.AccountCreated, \"Completion\")\r\n})","import React from 'react';\r\nimport { TimeRange } from '../../../Models/Portfolio/GraphDataCriteria';\r\nimport PopoverButton from '../../../App/Components/PopoverButton';\r\nimport { EnumHelper } from '@singularsystems/neo-core';\r\nimport ETLoader from '../../../App/Components/ETLoader';\r\nimport AppPortfolioData from '../../../Models/Portfolio/AppPortfolioData';\r\nimport { observer } from 'mobx-react';\r\nimport { IGraphData } from '../../../Models/Portfolio/GraphData';\r\nimport LineChart from './LineChart';\r\n\r\ninterface IDashboardLineChartProps {\r\n data: AppPortfolioData;\r\n graphData?: IGraphData;\r\n suppressSeriesOptions?: boolean;\r\n}\r\n\r\n@observer\r\nexport default class DashboardLineChart extends React.Component {\r\n\r\n public render() {\r\n \r\n const data = this.props.data,\r\n showSeriesOptions = !this.props.suppressSeriesOptions,\r\n graphData = this.props.graphData ?? data.getGraphData(data.graphCriteria.seriesId);\r\n \r\n return (\r\n
\r\n
\r\n\r\n
\r\n {showSeriesOptions &&\r\n <>\r\n

Performance

\r\n Your Investment over a period of time\r\n }\r\n
\r\n {data.graphData && !data.graphTask.isBusy &&\r\n
\r\n
\r\n Period: {EnumHelper.getItemMetadata(TimeRange, data.graphCriteria.timeRange).display}\r\n ({ text: c.name, onClick: () => data.setLineGraphTimeRange(c.id as TimeRange) }))} />\r\n
\r\n {showSeriesOptions &&\r\n
\r\n {graphData?.title}\r\n \r\n
}\r\n
}\r\n {data.graphTask.isBusy && }\r\n
\r\n \r\n
\r\n )\r\n }\r\n}","import * as React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport InvestmentSelectionComponent from './Components/InvestmentSelectionComponent';\r\nimport DashboardVM, { DashboardViewType } from './DashboardVM';\r\nimport openBox from '../../assets/img/opened-white-box.svg';\r\nimport etpIcon from '../../assets/img/et-ps-icon.svg';\r\nimport calendarIcon from '../../assets/img/calendar-icon.svg';\r\nimport cashIcon from '../../assets/img/cash-icon.svg';\r\nimport valueIcon from '../../assets/img/total-value-icon.svg';\r\nimport caret from \"../../assets/img/caret.svg\";\r\nimport { EnumHelper, Misc, NumberUtils } from '@singularsystems/neo-core';\r\nimport AppPortfolioData from '../../Models/Portfolio/AppPortfolioData';\r\nimport { PortfolioBalance } from '../../Models/Portfolio/PortfolioBalance';\r\nimport ETLoader from '../../App/Components/ETLoader';\r\nimport ClickLink from '../../App/Components/ClickLink';\r\nimport BreadCrumb from '../../App/Components/BreadCrumb';\r\nimport ETPGrid from './Components/ETPGrid';\r\nimport InfoIcon from '../../App/Components/InfoIcon';\r\nimport PieChart from './Components/PieChart';\r\nimport StringConstants from '../../Services/StringConstants';\r\nimport WithdrawCash from '../Investor/Trades/WithdrawCash';\r\nimport Switch from \"../Investor/Trades/Switch\";\r\nimport DistributionGrid from './Components/DistributionGrid';\r\nimport ProductView from '../Investor/Trades/Product';\r\nimport PurchaseView from '../Investor/Trades/Purchase';\r\nimport { PortfolioType } from '../../Models/Portfolio/PortfolioType';\r\nimport DashboardLineChart from './Components/DashboardLineChart';\r\n\r\nclass DashboardParams {\r\n viewType = {};\r\n instrumentCode = {};\r\n}\r\n\r\n@observer\r\nexport default class Dashboard extends Views.ViewBase {\r\n static params = new DashboardParams();\r\n\r\n constructor(props: unknown) {\r\n super(\"\", DashboardVM, props);\r\n }\r\n\r\n viewParamsUpdated() {\r\n this.viewModel.viewType = this.viewParams.viewType.value as DashboardViewType;\r\n this.viewParams.viewType.description = this.viewModel.viewType ? EnumHelper.getItemMetadata(DashboardViewType, this.viewModel.viewType).display : \"\";\r\n\r\n if (this.viewParams.viewType.value === DashboardViewType.Withdrawal && this.viewParams.instrumentCode !== null) {\r\n this.viewModel.beginWithdraw(this.viewParams.instrumentCode.asString());\r\n } else if (this.viewParams.viewType.value === DashboardViewType.Switch && this.viewParams.instrumentCode !== null) {\r\n this.viewModel.beginSwitch(this.viewParams.instrumentCode.asString());\r\n } else if (this.viewModel.withdrawCashVM !== null) {\r\n this.viewModel.withdrawCashVM = null;\r\n }\r\n }\r\n\r\n public render() {\r\n const viewModel = this.viewModel,\r\n portfolioData = viewModel.investorService.portfolioData,\r\n portfolioBalance = viewModel.portfolioBalance,\r\n hasInvestments = !portfolioBalance || portfolioBalance.hasInvestments,\r\n isFicad = viewModel.investorInfo?.ficaVerified;\r\n\r\n return (\r\n
\r\n
\r\n \r\n\r\n {portfolioBalance &&\r\n (\r\n
\r\n \r\n \r\n \r\n {NumberUtils.format(Math.abs(portfolioBalance.irr / 100), Misc.NumberFormat.PercentDecimals)}\r\n \r\n this.navigation.navigateToView(ProductView)}>Invest\r\n
\r\n )\r\n }\r\n
\r\n\r\n {portfolioData &&\r\n
\r\n {!hasInvestments &&\r\n
\r\n
\r\n \"Invest\r\n
\r\n\r\n this.navigation.navigateToView(ProductView)}>Invest Now\r\n
}\r\n\r\n {hasInvestments &&\r\n <>\r\n {!viewModel.viewType && this.renderPortfolioSummary(portfolioData, portfolioBalance)}\r\n {viewModel.viewType &&\r\n <>\r\n
\r\n \r\n
\r\n\r\n {viewModel.viewType === DashboardViewType.Withdrawal && viewModel.withdrawCashVM !== null &&\r\n \r\n }\r\n\r\n {viewModel.viewType === DashboardViewType.Switch && viewModel.switchVM !== null &&\r\n \r\n }\r\n\r\n {viewModel.viewType === DashboardViewType.Distributions &&\r\n \r\n }\r\n }\r\n }\r\n
}\r\n
\r\n );\r\n }\r\n\r\n private getTotalContributionSummary(portfolioTypeID: number, netContributions: number | undefined, taxYearContributions: number | undefined) {\r\n\r\n return (\r\n
\r\n
\r\n {'Total\r\n
\r\n
\r\n {[\r\n { header: \"Current Tax Year Contributions\", contributions: taxYearContributions, showFor: [PortfolioType.TaxFree] },\r\n { header: \"Total Contributions to Date\", contributions: netContributions, showFor: [PortfolioType.Discretionary, PortfolioType.TaxFree] }\r\n ].map(c => this.renderValue(c.header, c.contributions, !c.showFor.includes(portfolioTypeID)))}\r\n
\r\n
\r\n );\r\n }\r\n\r\n\r\n private GetCashCardLinks() {\r\n\r\n return [\r\n this.viewParams.setValues({ viewType: DashboardViewType.Switch, instrumentCode: this.viewModel.shareCashZAR })}>{\"Reinvest\"}\r\n ,\r\n this.viewParams.setValues({ viewType: DashboardViewType.Withdrawal, instrumentCode: this.viewModel.shareCashZAR })}>{\"Withdraw\"}\r\n ,\r\n ];\r\n }\r\n\r\n private renderPortfolioSummary(data: AppPortfolioData, balance: PortfolioBalance | null) {\r\n\r\n const allocationByClass = data.assetAllocationByClass;\r\n const portfolioData = this.viewModel.investorService.portfolioData;\r\n\r\n return (\r\n
\r\n
\r\n \r\n {this.getValueSummary(\"ETPs\", etpIcon, balance?.availableBalance, this.viewModel.beginViewStatement(portfolioData?.portfolio.portfolioTypeID)}>Download Statement)}\r\n {this.getTotalContributionSummary(balance?.portfolioTypeID!, balance?.netContributions, balance?.currentTaxYearContributions)}\r\n {this.getValueSummary(\"Cash\", cashIcon, (balance?.cashAvailable ?? 0) + (balance?.cashReserved ?? 0), this.GetCashCardLinks())}\r\n {this.getValueSummary(\"Total value of investments\", valueIcon, balance?.totalBalance,\r\n this.viewParams.viewType.value = DashboardViewType.Distributions}>See Dividend and Fee Transactions)\r\n }\r\n \r\n
\r\n\r\n {balance &&\r\n
\r\n {portfolioData &&\r\n <>\r\n this.viewParams.setValues({ viewType: DashboardViewType.Withdrawal, instrumentCode: instrumentCode })}\r\n onSwitch={instrumentCode => this.viewParams.setValues({ viewType: DashboardViewType.Switch, instrumentCode: instrumentCode })}\r\n onPurchase={instrumentCode => this.navigation.navigateToView(PurchaseView, { instrumentCode: instrumentCode })} />\r\n
\r\n
\r\n \r\n
\r\n
\r\n {allocationByClass &&\r\n
\r\n

Asset Allocation

\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 private getValueSummary(header: string, icon: string, value?: number, link?: JSX.Element | Array) {\r\n return (\r\n
\r\n
\r\n {header}\r\n
\r\n
\r\n {this.renderValue(header, value)}\r\n
\r\n
\r\n {link &&\r\n (Array.isArray(link)\r\n ? link.map(c =>
{c}\"link
)\r\n :
{link}\"link
\r\n )\r\n }\r\n
\r\n
\r\n );\r\n }\r\n\r\n private renderValue(header: string, value: number | undefined, IsVisible: boolean = false) {\r\n return (\r\n !IsVisible && (\r\n
\r\n {header}\r\n {value === undefined && }\r\n {value !== undefined &&\r\n
\r\n {value === 0 ? \"-\" : NumberUtils.format(value, Misc.NumberFormat.CurrencyDecimals)}\r\n
\r\n }\r\n
\r\n )\r\n );\r\n }\r\n}","import { ModelBase, NeoModel } from '@singularsystems/neo-core';\r\n\r\n@NeoModel\r\nexport default class OTPRegistrationVerification extends ModelBase {\r\n\r\n public registrationId: number = 0;\r\n\r\n public otp: string = \"\";\r\n\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { ITaskRunner, NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport OtpInput from 'react-otp-input';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport { OtpType } from '../../../Models/Registration/Enums/OtpType';\r\nimport Home from '../../Dashboard/Dashboard';\r\nimport OTPRegistrationVerification from '../../../Models/Security/OTPRegistrationVerification';\r\nimport Registration from '../../../Models/Registration/Registration';\r\n\r\nexport interface IOTPComponentProps {\r\n taskRunner: ITaskRunner;\r\n registration: Registration;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class OTPComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public registration: Registration,\r\n public securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications)) {\r\n\r\n super(taskRunner);\r\n\r\n this.sendNewOtp = this.sendNewOtp.bind(this);\r\n this.checkOTP = this.checkOTP.bind(this);\r\n this.sendNewOtpQuestion = this.sendNewOtpQuestion.bind(this);\r\n\r\n this.otpRegistrationVerification.registrationId = registration.registrationId;\r\n }\r\n\r\n public showResendOTPModal: boolean = false;\r\n\r\n public otpRegistrationVerification = new OTPRegistrationVerification();\r\n\r\n public sendNewOtp() {\r\n this.taskRunner.run(async () => {\r\n var response = await this.securityApiClient.resendOtp(this.otpRegistrationVerification.toJSObject());\r\n if (response.data) {\r\n if (response.data.success) {\r\n this.sendNewOtpQuestion();\r\n this.notifications.addSuccess(\"OTP\", \"OTP Resent\", NotificationDuration.Standard);\r\n } else {\r\n this.notifications.addDanger(\"OTP\", \"OTP Resend failed. Please retry\", NotificationDuration.Standard);\r\n }\r\n }\r\n });\r\n }\r\n\r\n public checkOTP() {\r\n this.taskRunner.run(async () => {\r\n var response = await this.securityApiClient.checkRegistrationOTPVerification(this.otpRegistrationVerification.toJSObject());\r\n if (response.data) {\r\n if (response.data.success) {\r\n // Not understanding why you need an email verification after just confirming cell phone otp?\r\n this.registration.otpTypeId = OtpType.Email;\r\n this.registerWithEmail();\r\n } else {\r\n this.notifications.addDanger(\"OTP\", \"OTP Incorrect\", NotificationDuration.Standard);\r\n }\r\n }\r\n }).catch((ex: string) => {\r\n this.notifications.addDanger(\"OTP\", \"An error has occurred\", NotificationDuration.Standard);\r\n });\r\n }\r\n\r\n public async registerWithEmail() {\r\n this.registration.otpTypeId = OtpType.Email;\r\n this.registration.sendEmailOnly = true;\r\n\r\n const response = await this.securityApiClient.register(this.registration.toJSObject());\r\n if (response.data)\r\n if (response.data.success) {\r\n if (response.data.additionalData) {\r\n this.otpRegistrationVerification.registrationId = parseInt(response.data.additionalData);\r\n }\r\n } else {\r\n this.notifications.addDanger(\"Sign Up Error\", \"Validation error\", NotificationDuration.Standard);\r\n }\r\n }\r\n\r\n public sendNewOtpQuestion() {\r\n this.showResendOTPModal = !this.showResendOTPModal;\r\n }\r\n}\r\n\r\n@observer\r\nexport default class OTPComponent extends React.Component {\r\n\r\n constructor(props: IOTPComponentProps) {\r\n super(props);\r\n\r\n this.dismiss = this.dismiss.bind(this);\r\n }\r\n\r\n private viewModel = new OTPComponentVM(this.props.taskRunner, this.props.registration); \r\n\r\n // Not used?\r\n // public async fetchInvestor() {\r\n // var response = await this.viewModel.investorApiClient.fetchInvestorFromRegistration(this.viewModel.otpRegistrationVerification.toJSObject());\r\n // if (response.data !== null) {\r\n // this.registerViewParams.investor.set(response.data);\r\n // this.registerViewParams.registerParams.registrationState = RegistrationState.AccountType;\r\n // } else {\r\n // this.viewModel.notifications.addDanger(\"Fetching Investor\", \"Fetching investor failed\", NotificationDuration.Standard);\r\n // }\r\n // }\r\n\r\n state = { otp: '' };\r\n\r\n handleChange = (otp: string) => {\r\n this.setState({ otp })\r\n if (otp.length === 4) {\r\n this.viewModel.otpRegistrationVerification.otp = otp;\r\n this.viewModel.checkOTP();\r\n }\r\n };\r\n\r\n public dismiss() {\r\n this.viewModel.navigation.navigateToView(Home);\r\n }\r\n\r\n public render() {\r\n\r\n return (\r\n
\r\n\r\n \r\n Would you like a new OTP to be re-sent to {this.props.registration.cellNo}?\r\n \r\n\r\n
\r\n
\r\n
\r\n {this.props.registration.otpTypeId === OtpType.CellNo &&\r\n
\r\n

One Time Pin (OTP)

\r\n

Sent to your cellphone

\r\n
\r\n }\r\n inputStyle={\"otp\"}\r\n isInputNum={true}\r\n containerStyle={\"otp-container\"}\r\n />\r\n
\r\n \r\n
}\r\n {this.props.registration.otpTypeId === OtpType.Email &&\r\n
\r\n

Verify E-mail

\r\n

Verify your email address by clicking on the link in the mail sent to you

\r\n DISMISS\r\n
}\r\n
\r\n
\r\n
\r\n\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { NeoModel } from '@singularsystems/neo-core';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport Registration from '../../../Models/Registration/Registration';\r\nimport { injectable } from 'inversify';\r\nimport OTPComponent, { OTPComponentVM } from './OTPComponent';\r\nimport RegisterVM from '../RegisterVM';\r\n\r\nexport interface IRegistrationPersonalDetailsComponentProps {\r\n viewModel: RegistrationPersonalDetailsComponentVM;\r\n registerVM: RegisterVM;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class RegistrationPersonalDetailsComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n registerVM: RegisterVM,\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(registerVM.taskRunner);\r\n\r\n this.registration = registerVM.registration;\r\n this.otpComponentVM = new OTPComponentVM(this.taskRunner, this.registration);\r\n\r\n this.register = this.register.bind(this);\r\n }\r\n\r\n public registration: Registration;\r\n\r\n public otpComponentVM: OTPComponentVM;\r\n\r\n public showOtpPanel = false;\r\n\r\n public register() {\r\n this.taskRunner.run(async () => {\r\n\r\n var response = await this.securityApiClient.register(this.registration.toJSObject());\r\n if (response.data) {\r\n if (response.data.success) {\r\n if (response.data.additionalData) {\r\n this.registration.registrationId = parseInt(response.data.additionalData);\r\n this.showOtpPanel = true;\r\n }\r\n } else {\r\n this.notifications.addDanger(\"Sign Up Error\", \"validation error\", NotificationDuration.Standard);\r\n }\r\n }\r\n }).catch((ex: string) => {\r\n this.notifications.addDanger(\"Sign Up Error\", \"An error has occurred\", NotificationDuration.Standard);\r\n });\r\n }\r\n}\r\n\r\n@observer\r\nexport default class RegistrationPersonalDetailsComponent extends React.Component {\r\n\r\n public render() {\r\n\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n\r\n

Personal Information

\r\n

* indicates a required field

\r\n \r\n * Name} />\r\n * Surname} />\r\n \r\n\r\n

Contact Information

\r\n \r\n * E-mail address} />\r\n * Cellphone} />\r\n \r\n\r\n

Security

\r\n \r\n * Password} />\r\n * Re-enter password} />\r\n \r\n\r\n

* Where would you like to receive your OTP?

\r\n \r\n \r\n \r\n \r\n\r\n
\r\n NEXT STEP\r\n
\r\n
\r\n
\r\n\r\n
\r\n\r\n {viewModel.showOtpPanel && }\r\n
\r\n );\r\n }\r\n}\r\n","import { Attributes, NeoModel, Rules, Utils, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\nimport { OtpType } from './Enums/OtpType';\r\n\r\n@NeoModel\r\nexport default class Registration extends APIModelBase {\r\n\r\n public guid: string = Utils.emptyGuid();\r\n\r\n @Rules.Required()\r\n public firstName: string = \"\";\r\n\r\n @Rules.Required()\r\n public surname: string = \"\";\r\n\r\n @Rules.Required()\r\n @Rules.EmailAddress()\r\n public emailAddress: string = \"\";\r\n \r\n @Rules.Required()\r\n @Attributes.OnChanged(c => c.validCellPhone)\r\n public cellNo: string = \"\";\r\n\r\n @Rules.Required()\r\n public password: string = \"\";\r\n\r\n public otpTypeId: OtpType = 0;\r\n\r\n public sendEmailOnly: boolean = false;\r\n\r\n // Client only properties / methods\r\n \r\n public registrationId: number = 0;\r\n \r\n @Rules.Required()\r\n public renterPassword: string = \"\";\r\n\r\n public get cellphoneOtp() {\r\n return this.otpTypeId === OtpType.CellNo;\r\n }\r\n public set cellphoneOtp(value: boolean) {\r\n this.otpTypeId = OtpType.CellNo;\r\n }\r\n\r\n public get emailOtp() {\r\n return this.otpTypeId === OtpType.Email;\r\n }\r\n public set emailOtp(value: boolean) {\r\n this.otpTypeId = OtpType.Email;\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n\r\n rules.failWhen(registration => registration.renterPassword !== registration.password, \"Passwords are not the same\");\r\n\r\n rules.failWhen(registration => registration.cellphoneOtp === false && registration.emailOtp === false, \"You must select an OTP option.\")\r\n\r\n rules.failWhen(registration => registration.validCellPhone(registration.cellNo) === false, \"Invalid phone number\")\r\n }\r\n\r\n public validCellPhone(cellphone: string) {\r\n\r\n if (cellphone) {\r\n var pattern = new RegExp('^([0]|\\\\+[0-9]{1,3})[0-9]{9}$');\r\n return pattern.test(cellphone);\r\n } else {\r\n return true\r\n }\r\n }\r\n\r\n}","import { Attributes, ModelBase, NeoModel, Utils, Validation } from '@singularsystems/neo-core';\r\nimport { MaintenanceDocumentType } from '../Base/Enums/MaintenanceDocumentType';\r\n\r\n@NeoModel\r\nexport class Portfolio extends ModelBase {\r\n\r\n public guid: string = Utils.emptyGuid();\r\n\r\n public portfolioID: number = 0;\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n @Attributes.Date()\r\n public termsAcceptedDate: Date | null = null;\r\n\r\n public reinvestDividends: boolean = false;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.guid) {\r\n return \"New portfolio\";\r\n } else {\r\n return this.guid;\r\n }\r\n }\r\n}\r\n\r\nexport class PostPortfolio {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@NeoModel\r\nexport class PortfolioSign extends ModelBase {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public acceptTerms: boolean = false;\r\n\r\n @Attributes.NoTracking()\r\n public maintenanceDocumentType: MaintenanceDocumentType = MaintenanceDocumentType.TermsAndConditions;\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => !c.acceptTerms, \"You must accept the investment mandate.\")\r\n }\r\n\r\n public toString(): string {\r\n return \"Open investment account\";\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class PortfolioReinvestDividends extends ModelBase {\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n public reinvestDividends: boolean = false;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew) {\r\n return \"New portfolio reinvest dividends\";\r\n } else {\r\n return \"Portfolio Reinvest Dividends\";\r\n }\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { NeoModel } from '@singularsystems/neo-core';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport RegisterVM from '../RegisterVM';\r\nimport { InvestorTypes } from '../../../Models/Registration/Enums/InvestorTypes';\r\nimport { PortfolioSign } from '../../../Models/Registration/Portfolio';\r\nimport { PortfolioType } from '../../../Models/Portfolio/PortfolioType';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\n\r\nexport interface IAccountTypeComponentProps {\r\n viewModel: AccountTypeComponentVM;\r\n registerVM: RegisterVM;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class AccountTypeComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n public portfolioApiClient = AppService.get(Types.ApiClients.PortfolioApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public individualType: boolean = false;\r\n public companyType: boolean = false;\r\n public trustType: boolean = false;\r\n public clubType: boolean = false;\r\n public discretionaryInvestment: boolean = false;\r\n public taxFreeInvestment: boolean = false;\r\n\r\n public PortfolioSignTaxFree = new PortfolioSign();\r\n public PortfolioSignDiscrentionary = new PortfolioSign();\r\n public AccountOpened: boolean = false;\r\n}\r\n\r\n@observer\r\nexport default class AccountTypeComponent extends React.Component {\r\n\r\n public checkTypeValid() {\r\n if (this.props.viewModel.individualType && (this.props.viewModel.discretionaryInvestment || this.props.viewModel.taxFreeInvestment)) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n }\r\n\r\n public updateAccountType() {\r\n this.props.viewModel.taskRunner.run(async () => {\r\n\r\n if (this.props.viewModel.individualType) {\r\n this.props.registerVM.investor.investorTypeID = InvestorTypes.Individual\r\n }\r\n var response = await this.props.viewModel.investorApiClient.putInvestor(this.props.registerVM.investor.toJSObject());\r\n if (response.data !== null) {\r\n if (response.data.success) {\r\n this.openPortfolio()\r\n this.props.registerVM.registrationState = RegistrationState.Identification;\r\n } else {\r\n this.props.viewModel.notifications.addDanger(\"Investor\", \"An error occured when selecting your investor type. Please try again\", NotificationDuration.Standard);\r\n }\r\n }\r\n }).catch((ex: string) => {\r\n this.props.viewModel.notifications.addDanger(\"Investor\", \"An error occured when selecting your investor type. Please try again\", NotificationDuration.Standard);\r\n });\r\n }\r\n\r\n public async openPortfolio() {\r\n if (this.props.viewModel.meta.discretionaryInvestment.value) {\r\n this.props.viewModel.PortfolioSignDiscrentionary.portfolioTypeID = PortfolioType.Discretionary\r\n this.createPortfolio(this.props.viewModel.PortfolioSignDiscrentionary);\r\n };\r\n\r\n if (this.props.viewModel.meta.taxFreeInvestment.value) {\r\n this.props.viewModel.PortfolioSignTaxFree.portfolioTypeID = PortfolioType.TaxFree\r\n this.createPortfolio(this.props.viewModel.PortfolioSignTaxFree);\r\n };\r\n if (this.props.viewModel.AccountOpened) {\r\n }\r\n\r\n };\r\n\r\n public async createPortfolio(portfolioSign: PortfolioSign) {\r\n var response = await this.props.viewModel.portfolioApiClient.portfolioOpen(portfolioSign.toJSObject());\r\n var account = portfolioSign.portfolioTypeID === PortfolioType.TaxFree ? \"Tax free\" : \"Discretionary\";\r\n if (response.data.success) {\r\n this.props.viewModel.notifications.addSuccess(\"Account Selected\", account + \" account selected successfully\", NotificationDuration.Standard);\r\n this.props.viewModel.AccountOpened = true;\r\n } else {\r\n this.props.viewModel.notifications.addDanger(\"Account Selected\", \"An error occured when selecting your \" + account + \" account. Please retry resubmit\", NotificationDuration.Standard);\r\n this.props.viewModel.AccountOpened = false;\r\n }\r\n }\r\n\r\n public render() {\r\n\r\n return (\r\n
\r\n

* indicates a required field

\r\n
\r\n * Choose your account type
}>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n * Your investment type
}>\r\n \r\n \r\n \r\n \r\n \r\n\r\n
\r\n Next Step\r\n
\r\n
\r\n
\r\n\r\n );\r\n }\r\n}\r\n","import { EnumHelper } from '@singularsystems/neo-core';\r\n\r\nexport enum IDType {\r\n IDBook = 1,\r\n IDCard = 2,\r\n Passport = 3\r\n}\r\n\r\nEnumHelper.decorateEnum(IDType, decorator => {\r\n decorator.describe(IDType.IDBook, \"ID Book / Birth Certificate\");\r\n decorator.describe(IDType.IDCard, \"ID Card\");\r\n});","\r\nexport enum IDCheckResult {\r\n Ok = 1,\r\n InvalidIDNumber = 2,\r\n IdAlreadyExists = 3,\r\n}","import { NeoModel } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport { RegistrationPersonalDetailsComponentVM } from './Components/RegistrationPersonalDetailsComponent';\r\nimport Registration from '../../Models/Registration/Registration';\r\nimport { AccountTypeComponentVM } from './Components/AccountTypeComponent';\r\nimport Investor from '../../Models/Registration/Investor';\r\nimport { NotificationDuration } from '../../Models/Enums/NotificationDuration';\r\nimport { RegistrationState } from '../../Models/Registration/Enums/RegistrationState';\r\n\r\n@NeoModel\r\nexport default class RegisterVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public registration = new Registration();\r\n public investor = new Investor()\r\n\r\n public registrationState: number = 0;\r\n\r\n // components\r\n public registrationPersonalDetailsComponentVM = new RegistrationPersonalDetailsComponentVM(this);\r\n public accountTypeComponentVM = new AccountTypeComponentVM(this.taskRunner);\r\n\r\n public async initialise() {\r\n const investorData = this.investorService.investorData;\r\n if (investorData) {\r\n const investorInfo = await this.taskRunner.waitFor(investorData.getInvestorAsync());\r\n\r\n const response = await this.taskRunner.waitFor(this.investorApiClient.getInvestor());\r\n if (response.data !== null) {\r\n this.investor.set(response.data);\r\n } else {\r\n this.notifications.addDanger(\"Investor\", \"Failed to fetch investor\", NotificationDuration.Standard);\r\n }\r\n\r\n this.registrationState = investorInfo.investorStatusID + 1;\r\n } else {\r\n this.registrationState = RegistrationState.PersonalDetails;\r\n }\r\n }\r\n}","export enum Gender {\r\n Male = 1,\r\n Female = 2,\r\n}","import { Attributes, Misc, NeoModel, Rules, Validation, ValueObject } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport { IDCheckResult } from '../Enums/IDCheckResult';\r\nimport { IDType } from '../Registration/Enums/IDType';\r\nimport { Gender } from '../Registration/Enums/Gender';\r\n\r\n@NeoModel\r\nexport default class UpdateIdentityCommand extends ValueObject {\r\n\r\n constructor(public investorId: number) {\r\n super();\r\n }\r\n\r\n @Rules.Required(\"Identity required\")\r\n public idNo: string = \"\";\r\n\r\n public gender: Gender | null = null;\r\n \r\n @Attributes.Date(Misc.TimeZoneFormat.None)\r\n public birthDate: Date | null = new Date('1980-01-01');\r\n\r\n @Rules.Required()\r\n public idType: IDType | null = null;\r\n\r\n @Rules.Required()\r\n public documentId: number | null = null;\r\n\r\n public idCardCombined: boolean = false;\r\n\r\n @Attributes.Nullable()\r\n public additionalDocumentId: number | null = null;\r\n\r\n @Attributes.Nullable()\r\n public countryId: number | null = null\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => c.idType === IDType.IDCard && !c.idCardCombined && c.additionalDocumentId === null, \"Back side of Id card must be provided.\").onModel();\r\n rules.add(this.checkIDNo).onProperties(c => c.idNo);\r\n rules.failWhen(c => c.countryId === null && c.idType === IDType.Passport, \"Country is required\")\r\n rules.failWhen(c => c.idType === IDType.Passport && c.gender === null, \"Gender is required.\");\r\n rules.failWhen(c => c.idType === IDType.Passport && c.birthDate === null, \"Birth Date is required.\");\r\n }\r\n\r\n private checkIDNo(context: Validation.IRuleContext) {\r\n \r\n if (this.idNo) {\r\n context.beginAsync(\"Checking identification...\", async asyncContext => {\r\n\r\n if (this.idNo) {\r\n const result = await AppService.get(Types.ApiClients.InvestorApiClient).checkIDNumber(this.investorId, this.idNo);\r\n if (result.data === IDCheckResult.IdAlreadyExists) {\r\n asyncContext.addError(\"This ID number already exists\");\r\n } else if (result.data === IDCheckResult.InvalidIDNumber && this.idType !== IDType.Passport) {\r\n asyncContext.addError(\"ID number is invalid\");\r\n }\r\n }\r\n \r\n asyncContext.endAsync();\r\n\r\n }, { delayMs: 1000 });\r\n }\r\n }\r\n\r\n public toString(): string {\r\n return \"Update Identity Command\";\r\n }\r\n}","export enum YesNo{\r\n Yes = 1,\r\n No = 2\r\n}\r\n\r\nexport const YesNoList = [{ id: true, text: \"Yes\"}, { id: false, text: \"No\" }];","import { Neo } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport UpdateIdentityCommand from '../../../Models/Investors/UpdateIdentityCommand';\r\nimport { Gender } from '../../../Models/Registration/Enums/Gender';\r\nimport { IDType } from '../../../Models/Registration/Enums/IDType';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport { FileUtils } from '@singularsystems/neo-core';\r\n\r\ninterface IIdentityDetailsProps {\r\n command: UpdateIdentityCommand;\r\n}\r\n\r\n@observer\r\nexport default class IdentityDetails extends React.Component {\r\n\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n private downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n private appDataCache = AppService.get(Types.Services.AppDataCache);\r\n\r\n private async downloadDocument(documentID: number) {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getInvestorDocumentById(documentID));\r\n FileUtils.showSaveFile(response);\r\n }\r\n\r\n public renderDownloadButton(documentId: number | null) {\r\n return (\r\n documentId &&\r\n

\r\n this.downloadDocument(documentId!)}>Download \r\n

\r\n )\r\n }\r\n\r\n public render() {\r\n const { command } = this.props;\r\n\r\n return (\r\n
\r\n\r\n \r\n

* indicates a required field

\r\n \r\n {command.idType !== null &&\r\n * {command.idType === IDType.Passport ? \"Passport Number\" : \"ID Number\"} } />\r\n }\r\n {command.idType !== null && command.idType === IDType.Passport &&\r\n * Country } />\r\n }\r\n {command.idType !== null && command.idType === IDType.Passport &&\r\n * Date of birth }/>\r\n } \r\n {command.idType !== null && command.idType === IDType.Passport && \r\n * Gender } />\r\n } \r\n {command.idType === IDType.IDCard &&\r\n \r\n }\r\n\r\n
\r\n\r\n {command.idType !== null &&\r\n
\r\n \r\n command.documentId = docId}\r\n allowedExtensions={this.documentApiClient.allowedInvestorDocumentExtensions}\r\n taskRunnerLoadingText={\"Uploading ID\"}>\r\n\r\n \r\n \r\n

\r\n {command.documentId && \r\n

Upload complete

\r\n } \r\n Drag {command.idType === IDType.IDCard ? \"the front of your card\" : \"your file\"} here or browse to {!command.documentId ? \"upload\" : \"update\"}.\r\n

\r\n

Jpeg or pdf

\r\n {this.renderDownloadButton(command.documentId)}\r\n \r\n
\r\n \r\n
}\r\n\r\n {command.idType !== null && command.idType === IDType.IDCard && !command.idCardCombined &&\r\n
\r\n \r\n command.additionalDocumentId = docId}\r\n allowedExtensions={this.documentApiClient.allowedInvestorDocumentExtensions}>\r\n \r\n \r\n {command.additionalDocumentId &&\r\n

Upload complete

\r\n }\r\n

Drag the back of your card here or browse to {!command.additionalDocumentId ? \"upload\" : \"update\"}.

\r\n

Jpeg or pdf

\r\n {this.renderDownloadButton(command.additionalDocumentId)}\r\n \r\n
\r\n \r\n
\r\n }\r\n
\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { EnumHelper, ITaskRunner, NeoModel, NotifyUtils } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\nimport { IDType } from '../../../Models/Registration/Enums/IDType';\r\nimport UpdateIdentityCommand from '../../../Models/Investors/UpdateIdentityCommand';\r\nimport IdentityDetails from '../../Investor/Components/IdentityDetails';\r\nimport Investor from '../../../Models/Registration/Investor';\r\n\r\ninterface IIdentificationComponentProps {\r\n taskRunner: ITaskRunner;\r\n investor: Investor;\r\n onRegisterStateChange: (state: RegistrationState) => void;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class IdentificationComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n investor: Investor,\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n\r\n this.command = new UpdateIdentityCommand(investor.investorID);\r\n this.command.idNo = investor.idNo;\r\n this.command.countryId = investor.passportCountryOfIssueID;\r\n }\r\n\r\n \r\n public command: UpdateIdentityCommand;\r\n\r\n public async saveIdentity() {\r\n if (this.command.isValid) {\r\n await this.taskRunner.run(() => this.investorApiClient.updateInvestorIdentity(this.command.toJSObject()));\r\n }\r\n }\r\n}\r\n\r\n@observer\r\nexport default class IdentificationComponent extends React.Component {\r\n\r\n private viewModel = new IdentificationComponentVM(this.props.investor, this.props.taskRunner);\r\n\r\n private async saveIdentity() {\r\n await this.viewModel.saveIdentity();\r\n\r\n const msg = \"You have successfully uploaded your \" + EnumHelper.getItemMetadata(IDType, this.viewModel.command.idType!).display;\r\n NotifyUtils.addSuccess(\"Success\", msg, NotificationDuration.Standard);\r\n this.props.onRegisterStateChange(RegistrationState.PoliticalSensitivity);\r\n }\r\n\r\n public render() {\r\n\r\n const viewModel = this.viewModel;\r\n\r\n return (\r\n
\r\n

Upload your ID

\r\n\r\n \r\n \r\n
\r\n this.saveIdentity()} \r\n disabled={!viewModel.command.isValid}>Next Step\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class PoliticalSensitivity extends APIModelBase {\r\n\r\n public politicalSensitivityID: number = 0;\r\n\r\n public investorID: number = 0;\r\n\r\n public associatedInd: boolean = false;\r\n\r\n public jurisdiction: string = \"\";\r\n\r\n public duration: string = \"\";\r\n\r\n public year: string = \"\";\r\n\r\n public position: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(ps => ps.jurisdiction.trim().length === 0 && ps.associatedInd, \"Jurisdiction is required\")\r\n rules.failWhen(ps => ps.duration.trim().length === 0 && ps.associatedInd, \"Duration is required\")\r\n rules.failWhen(ps => ps.year.trim().length === 0 && ps.associatedInd, \"Year is required\")\r\n rules.failWhen(ps => ps.position.trim().length === 0 && ps.associatedInd, \"Position is required\")\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.jurisdiction) {\r\n return \"New political sensitivity\";\r\n } else {\r\n return this.jurisdiction;\r\n }\r\n }\r\n}","import { Data } from '@singularsystems/neo-core';\r\nimport { injectable } from 'inversify';\r\nimport Bank from '../Models/Catalogue/Bank';\r\nimport BankAccountType from '../Models/Catalogue/BankAccountType';\r\nimport Country from '../Models/Catalogue/Country';\r\nimport Province from '../Models/Catalogue/Province';\r\nimport Region from '../Models/Catalogue/Region';\r\nimport AssetClass from '../Models/Catalogue/AssetClass';\r\nimport PortfolioCatalogue from '../Models/Catalogue/PortfolioCatalogue';\r\nimport { AppService, Types } from './AppService';\r\nimport { DebitOrderDays } from '../Models/Base/RecurringTradeRequest';\r\nimport TradeCost from '../Models/Base/TradeCost';\r\nimport Strategy from '../Models/Catalogue/Strategy';\r\nimport InstrumentProvider from '../Models/Instruments/InstrumentProvider';\r\nimport SourceOfFunds from '../Models/Catalogue/SourceOfFunds';\r\n\r\nexport enum LifeTime {\r\n Short = 30,\r\n Long = 240\r\n}\r\n\r\n@injectable()\r\nexport class AppDataService extends Data.CachedDataService {\r\n\r\n // TODO: Consider combining all maintenance data into one controller / api client.\r\n\r\n constructor(\r\n private countryApiClient = AppService.get(Types.ApiClients.CountryApiClient),\r\n private provinceApiClient = AppService.get(Types.ApiClients.ProvinceApiClient),\r\n private bankApiClient = AppService.get(Types.ApiClients.BankApiClient),\r\n private bankAccountTypeApiClient = AppService.get(Types.ApiClients.BankAccountTypeApiClient),\r\n private catalogueApiClient = AppService.get(Types.ApiClients.CatalogueApiClient),\r\n private debitOrderApiClient = AppService.get(Types.ApiClients.RecurringTradeRequestApiClient),\r\n private sourceOfFundsApiClient = AppService.get(Types.ApiClients.SourceOfFundsApiClient)) {\r\n super();\r\n }\r\n\r\n public countries = this.registerList(Country, this.countryApiClient.getCountryList, LifeTime.Long);\r\n public provinces = this.registerList(Province, this.provinceApiClient.getProvinceList, LifeTime.Long);\r\n public banks = this.registerList(Bank, this.bankApiClient.getBankList, LifeTime.Long);\r\n public bankAccountTypes = this.registerList(BankAccountType, this.bankAccountTypeApiClient.getBankAccountTypeList, LifeTime.Long);\r\n public sourceOfFunds = this.registerList(SourceOfFunds, this.sourceOfFundsApiClient.getSourceOfFundsList, LifeTime.Long) \r\n\r\n private portfolioCataloguePromise: Promise | null = null;\r\n \r\n public async getPortfolioCatalogue() {\r\n if (!this.portfolioCataloguePromise) {\r\n this.portfolioCataloguePromise = this.catalogueApiClient.getPortfolioCatalogue();\r\n }\r\n return this.portfolioCataloguePromise;\r\n }\r\n\r\n public debitOrderDays = this.registerList(DebitOrderDays, this.debitOrderApiClient.getDebitOrderDaysList, LifeTime.Long);\r\n public tradeCosts = this.register(new Data.CallbackDataSource(this.catalogueApiClient.getTradeCosts, new TradeCost()), LifeTime.Long);\r\n public assetClasses = new Data.CallbackDataSource(async () => (await this.getPortfolioCatalogue()).assetClasses, [] as AssetClass[]);\r\n public regions = new Data.CallbackDataSource(async () => (await this.getPortfolioCatalogue()).regions, [] as Region[]);\r\n public strategies = new Data.CallbackDataSource(async () => (await this.getPortfolioCatalogue()).strategies, [] as Strategy[]);\r\n public providers = new Data.CallbackDataSource(async () => (await this.getPortfolioCatalogue()).instrumentProviders, [] as InstrumentProvider[]);\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { ITaskRunner, NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\nimport PoliticalSensitivity from '../../../Models/Base/PoliticalSensitivity';\r\nimport { YesNo } from '../../../Models/Enums/YesNo';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\n\r\nexport interface IPoliticalSensitivityComponentProps {\r\n taskRunner: ITaskRunner;\r\n onRegisterStateChange: (state: RegistrationState) => void;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class PoliticalSensitivityComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n public politicalSensitivityApiClient = AppService.get(Types.ApiClients.PoliticalSensitivityApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public politicalSensitivity: PoliticalSensitivity = new PoliticalSensitivity();\r\n\r\n public yesNoSelection: YesNo | null = null;\r\n\r\n public agree: boolean = false;\r\n\r\n}\r\n\r\n@observer\r\nexport default class PoliticalSensitivityComponent extends React.Component {\r\n\r\n private viewModel = new PoliticalSensitivityComponentVM(this.props.taskRunner);\r\n\r\n public putPoliticalSensitivity() {\r\n this.viewModel.taskRunner.run(\"Saving Political Sensitivity\", async () => {\r\n var response = await this.viewModel.politicalSensitivityApiClient.saveInvestorPoliticalSensitivity(this.viewModel.politicalSensitivity.toJSObject());\r\n if (response.data) {\r\n if (response.data.success) {\r\n this.viewModel.notifications.addSuccess(\"Political Sensitivity\", \"You have successfully updated your political sensitivity\", NotificationDuration.Standard);\r\n this.props.onRegisterStateChange(RegistrationState.ProofOfResidence);\r\n }\r\n } else {\r\n this.viewModel.notifications.addDanger(\"Sign Up Error\", \"validation error\", NotificationDuration.Standard);\r\n }\r\n });\r\n }\r\n\r\n public setAssociation() {\r\n this.viewModel.politicalSensitivity.associatedInd = this.viewModel.yesNoSelection === YesNo.Yes;\r\n if (!this.viewModel.politicalSensitivity.associatedInd){\r\n this.viewModel.politicalSensitivity.duration = \"\";\r\n this.viewModel.politicalSensitivity.jurisdiction = \"\";\r\n this.viewModel.politicalSensitivity.position = \"\";\r\n this.viewModel.politicalSensitivity.year = \"\";\r\n }\r\n }\r\n\r\n private tcTextColor() {\r\n return this.viewModel.agree ? \"#369afe\" : \"#636e95\";\r\n }\r\n\r\n public render() {\r\n\r\n const viewModel = this.viewModel;\r\n return (\r\n
\r\n

Politically sensitive persons details as follows

\r\n\r\n

Domestic Prominent Influential Person (DPIP) or Foreign Prominent Public Official (FPPO) A DPIP is an individual who holds, including in an acting position for a period exceeding 6 (six) months or has held at any time in the preceding 12 (twelve) months, in the Republic of South Africa a prominent public function.

\r\n

A FPPO is an individual who currently holds or has held at any time in the preceding 12 (twelve) months, in any foreign country a prominent public function.

\r\n

* indicates a required field

\r\n\r\n * I consider myself to be, or to be associated with a DPIP or FPPO?}\r\n radioList={{ enumType: YesNo }}\r\n onChange={this.setAssociation.bind(this)} />\r\n\r\n \r\n\r\n \r\n * I undertake to notify etfSA in writing if these circumstances change} style={{ color: this.tcTextColor() }} disabled={viewModel.yesNoSelection === null} />\r\n\r\n
\r\n NEXT STEP\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import { Neo } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport InvestorAddressDetail from '../../../Models/Investors/InvestorAddressDetail';\r\nimport UpdateAddressCommand from '../../../Models/Investors/UpdateAddressCommand';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport { FileUtils } from '@singularsystems/neo-core';\r\n\r\ninterface IUpdatableAddressDetailsProps {\r\n command: UpdateAddressCommand;\r\n}\r\n\r\n@observer\r\nexport class UpdatableAddressDetails extends React.Component {\r\n\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n private downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n\r\n private async downloadDocument(documentID: number) {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getInvestorDocumentById(documentID));\r\n FileUtils.showSaveFile(response);\r\n }\r\n\r\n public render() {\r\n const command = this.props.command,\r\n addressDetail = command.addressDetail;\r\n\r\n return (\r\n
\r\n \r\n\r\n
\r\n \r\n\r\n command.documentId = docId}\r\n allowedExtensions={this.documentApiClient.allowedInvestorDocumentExtensions}\r\n taskRunnerLoadingText={\"Uploading Proof of Address\"}>\r\n \r\n \r\n {command.documentId &&\r\n

Upload complete

\r\n }\r\n

Drag your file here or browse to {!command.documentId ? \"upload\" : \"update\"}.

\r\n

Jpeg or pdf

\r\n {command.documentId &&\r\n

\r\n this.downloadDocument(command.documentId!)}>Download \r\n

\r\n }\r\n \r\n
\r\n \r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\ninterface IAddressDetailsProps {\r\n addressDetail: InvestorAddressDetail;\r\n readOnly?: boolean;\r\n maxColumns: 1 | 2;\r\n}\r\n\r\nexport class AddressDetails extends React.Component {\r\n\r\n private appDataCache = AppService.get(Types.Services.AppDataCache);\r\n\r\n public render() {\r\n const { addressDetail, maxColumns, readOnly } = this.props;\r\n\r\n return (\r\n \r\n \r\n \r\n Street address 1} />\r\n \r\n Suburb} />\r\n\r\n \r\n City} />\r\n Province} />\r\n Country} />\r\n Postal code} />\r\n \r\n \r\n )\r\n }\r\n}","import { NeoModel, Validation, ValueObject, Rules } from '@singularsystems/neo-core';\r\nimport InvestorAddressDetail from './InvestorAddressDetail';\r\n\r\n@NeoModel\r\nexport default class UpdateAddressCommand extends ValueObject {\r\n\r\n constructor(\r\n public investorId: number, \r\n public addressDetail: InvestorAddressDetail) {\r\n super();\r\n \r\n this.documentId = addressDetail.documentId;\r\n }\r\n\r\n @Rules.Required()\r\n public documentId: number | null = null;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n return \"Update Address Command\";\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { ITaskRunner, NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\n// eslint-disable-next-line\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport { UpdatableAddressDetails } from '../../Investor/Components/AddressDetails';\r\nimport UpdateAddressCommand from '../../../Models/Investors/UpdateAddressCommand';\r\nimport Investor from '../../../Models/Registration/Investor';\r\n\r\nexport interface IProofOfResidenceComponentProps {\r\n taskRunner: ITaskRunner;\r\n investor: Investor;\r\n onRegisterStateChange: (state: RegistrationState) => void;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class ProofOfResidenceComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n public investor: Investor,\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n public authenticationService = AppService.get(Types.Services.AppAuthenticationService)) {\r\n\r\n super(taskRunner);\r\n\r\n this.command = new UpdateAddressCommand(investor.investorID!, investor.addressDetails);\r\n }\r\n\r\n public command: UpdateAddressCommand | null = null;\r\n\r\n updateInvestorAddress() {\r\n this.taskRunner.run(\"Updating address details\", async () => {\r\n await this.investorApiClient.updateInvestorAddressDetail(this.command!.toJSObject()); \r\n this.notifications.addSuccess(\"Address Details\", \"Your address details have been successfully updated\", NotificationDuration.Standard);\r\n });\r\n }\r\n}\r\n\r\n@observer\r\nexport default class ProofOfResidenceComponent extends React.Component {\r\n\r\n private viewModel = new ProofOfResidenceComponentVM(this.props.investor, this.props.taskRunner);\r\n\r\n componentDidMount() {\r\n this.viewModel.initialise();\r\n }\r\n\r\n componentWillUnmount() {\r\n this.viewModel.dispose();\r\n }\r\n\r\n async updateInvestorAddress() {\r\n await this.viewModel.updateInvestorAddress();\r\n this.props.onRegisterStateChange(RegistrationState.BankDetails);\r\n }\r\n\r\n public render() {\r\n\r\n const viewModel = this.viewModel;\r\n return (\r\n
\r\n

Your proof of residence

\r\n {viewModel.command &&\r\n
\r\n \r\n\r\n
\r\n this.updateInvestorAddress()} disabled={!viewModel.command.isValid}>Next Step\r\n
\r\n
}\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { Attributes, ITaskRunner, NeoModel, NotifyUtils } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\n// eslint-disable-next-line\r\nimport InvestorBankDetail from '../../../Models/Investors/InvestorBankDetail';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport BankAccountDetails, { ThirdPartyBankAccountDetails } from '../../Investor/Components/BankAccountDetails';\r\nimport Investor from '../../../Models/Registration/Investor';\r\n\r\nexport interface IBankDetailsComponentProps {\r\n taskRunner: ITaskRunner;\r\n investor: Investor;\r\n onRegisterStateChange: (state: RegistrationState) => void;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class BankDetailsComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n private investor: Investor,\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n\r\n this.investorBankDetail = investor.primaryBankDetails ?? new InvestorBankDetail();\r\n this.investorBankDetail.investorID = investor.investorID;\r\n }\r\n\r\n public investorBankDetail: InvestorBankDetail;\r\n\r\n @Attributes.ChildObject(InvestorBankDetail)\r\n public investorThirdPartyBankDetail: InvestorBankDetail | null = null;\r\n\r\n public get addThirdPartyDetails() {\r\n return this.investorThirdPartyBankDetail !== null;\r\n }\r\n public set addThirdPartyDetails(value: boolean) {\r\n if (value) {\r\n const investorThirdPartyBankDetail = new InvestorBankDetail();\r\n investorThirdPartyBankDetail.investorID = this.investor.investorID;\r\n investorThirdPartyBankDetail.isThirdParty = true;\r\n this.investorThirdPartyBankDetail = investorThirdPartyBankDetail;\r\n } else {\r\n this.investorThirdPartyBankDetail = null;\r\n }\r\n }\r\n \r\n public updateInvestorBankDetails() {\r\n this.taskRunner.run(\"Updating Bank Details\", async () => {\r\n\r\n const toUpdate = [this.investorBankDetail.toJSObject()];\r\n\r\n if (this.investorThirdPartyBankDetail) {\r\n toUpdate.push(this.investorThirdPartyBankDetail.toJSObject());\r\n }\r\n\r\n await this.investorApiClient.updateInvestorBankDetail(toUpdate);\r\n });\r\n }\r\n}\r\n\r\n@observer\r\nexport default class BankDetailsComponent extends React.Component {\r\n\r\n private viewModel = new BankDetailsComponentVM(this.props.investor, this.props.taskRunner);\r\n\r\n private async updateBankDetails() {\r\n await this.viewModel.updateInvestorBankDetails();\r\n \r\n NotifyUtils.addSuccess(\"Success\", \"You have successfully updated your bank details\", NotificationDuration.Standard);\r\n this.props.onRegisterStateChange(RegistrationState.TaxDetails);\r\n }\r\n\r\n private checkBankDetailsValid() {\r\n if (this.viewModel.investorThirdPartyBankDetail) {\r\n return this.viewModel.investorBankDetail.isValid && this.viewModel.investorThirdPartyBankDetail.isValid;\r\n } else {\r\n return this.viewModel.investorBankDetail.isValid;\r\n }\r\n }\r\n\r\n public render() {\r\n const viewModel = this.viewModel;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n\r\n

Your bank details

\r\n\r\n \r\n\r\n \r\n\r\n {viewModel.investorThirdPartyBankDetail &&\r\n
\r\n

Adding a 3rd party bank account for debit orders

\r\n\r\n \r\n
}\r\n\r\n
\r\n this.updateBankDetails()} disabled={!this.checkBankDetailsValid()} >Next Step\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}","import { Neo } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport InvestorTaxDetail from '../../../Models/Investors/InvestorTaxDetail';\r\nimport { YesNoList } from '../../../Models/Enums/YesNo';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { FileUtils } from '@singularsystems/neo-core';\r\n\r\ninterface ITaxDetailsProps {\r\n taxDetail: InvestorTaxDetail;\r\n readOnly?: boolean;\r\n}\r\n\r\n@observer\r\nexport default class TaxDetails extends React.Component {\r\n\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n private appDataCache = AppService.get(Types.Services.AppDataCache);\r\n private downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n\r\n private async downloadDocument(documentID: number) {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getInvestorDocumentById(documentID));\r\n FileUtils.showSaveFile(response);\r\n }\r\n\r\n public render() {\r\n const { taxDetail, readOnly } = this.props;\r\n\r\n return (\r\n
\r\n \r\n

indicates a required field

\r\n * Are you registered for tax} radioList={{ items: YesNoList }} />\r\n {taxDetail.isRegisteredForLocalTax &&\r\n
\r\n Tax Number} />\r\n\r\n {!readOnly &&\r\n
\r\n \r\n taxDetail.documentId = docId}\r\n allowedExtensions={this.documentApiClient.allowedInvestorDocumentExtensions}\r\n taskRunnerLoadingText={\"Uploading Tax Document\"}>\r\n \r\n \r\n {taxDetail.documentId &&\r\n

Upload complete

\r\n }\r\n

Drag your file here or browse to {!taxDetail.documentId ? \"upload\" : \"update\"}.

\r\n

Jpeg or pdf

\r\n {taxDetail.documentId &&\r\n

\r\n this.downloadDocument(taxDetail.documentId!)}>Download \r\n

\r\n }\r\n \r\n
\r\n \r\n
}\r\n
}\r\n\r\n
\r\n\r\n * Are you a resident for tax purposes anywhere other than South Africa?} radioList={{ items: YesNoList }} />\r\n\r\n {taxDetail.hasForeignTaxDetails &&\r\n
\r\n\r\n {taxDetail.investorForeignTaxes.map(taxInfo => (\r\n
\r\n Country} />\r\n Tax Number} />\r\n {taxDetail.investorForeignTaxes.length > 1 && !readOnly &&\r\n
\r\n taxDetail.removeForeignTaxItem(taxInfo)}>\r\n REMOVE\r\n \r\n
}\r\n
\r\n ))}\r\n\r\n {!readOnly &&\r\n
\r\n taxDetail.investorForeignTaxes.addNew()}>\r\n ADD ANOTHER COUNTRY\r\n \r\n
}\r\n
}\r\n
\r\n
\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { ITaskRunner, NeoModel, NotifyUtils } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\n// eslint-disable-next-line\r\nimport InvestorTaxDetail from '../../../Models/Investors/InvestorTaxDetail';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport TaxDetails from '../../Investor/Components/TaxDetails';\r\nimport Investor from '../../../Models/Registration/Investor';\r\n\r\nexport interface ITaxDetailsComponentProps {\r\n taskRunner: ITaskRunner;\r\n investor: Investor;\r\n onRegisterStateChange: (state: RegistrationState) => void;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class TaxDetailsComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n investor: Investor,\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n\r\n // Force investor to make selections.\r\n if (!investor.investorTaxDetail.taxNumber) {\r\n investor.investorTaxDetail.isRegisteredForLocalTax = null;\r\n }\r\n if (investor.investorTaxDetail.investorForeignTaxes.length === 0) {\r\n investor.investorTaxDetail.hasForeignTaxDetails = null;\r\n }\r\n\r\n this.investorTaxDetail = investor.investorTaxDetail;\r\n }\r\n\r\n public investorTaxDetail: InvestorTaxDetail;\r\n\r\n public async updateTaxDetails() {\r\n this.taskRunner.run(\"Updating investor tax details\", async () => {\r\n\r\n this.investorTaxDetail.beforeSave();\r\n await this.investorApiClient.updateInvestorTaxDetail(this.investorTaxDetail.toJSObject());\r\n });\r\n }\r\n}\r\n\r\n@observer\r\nexport default class TaxDetailsComponent extends React.Component {\r\n\r\n private viewModel = new TaxDetailsComponentVM(this.props.investor, this.props.taskRunner);\r\n\r\n private async updateTaxDetails() {\r\n await this.viewModel.updateTaxDetails();\r\n\r\n NotifyUtils.addSuccess(\"Tax Details\", \"You have successfully updated your tax details\", NotificationDuration.Standard)\r\n this.props.onRegisterStateChange(RegistrationState.Mandate);\r\n }\r\n\r\n public render() {\r\n const viewModel = this.viewModel;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n

Your tax details

\r\n \r\n \r\n\r\n
\r\n this.updateTaxDetails()} disabled={!viewModel.investorTaxDetail.isValid}>NEXT STEP\r\n
\r\n\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { ITaskRunner, NeoModel, NotifyUtils } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport { RegistrationState } from '../../../Models/Registration/Enums/RegistrationState';\r\nimport { MaintenanceDocumentType } from '../../../Models/Base/Enums/MaintenanceDocumentType';\r\nimport { NotificationDuration } from '../../../Models/Enums/NotificationDuration';\r\nimport DocumentHandler from '../../../Services/DocumentHandler'\r\n\r\nexport interface IMandataComponentProps {\r\n taskRunner: ITaskRunner;\r\n onRegisterStateChange: (state: RegistrationState) => void;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class MandateComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n public portfolioApiClient = AppService.get(Types.ApiClients.PortfolioApiClient),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n public investorService = AppService.get(Types.Services.CurrentInvestorService)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public agreeToTerms: boolean = false;\r\n\r\n public requireInvestmentAdvice: boolean = false;\r\n\r\n public agreeDebitOrderInstruction: boolean = false;\r\n\r\n public hasDebitOrderInstruction: boolean = this.investorService.investorData?.investor?.hasRecurringTradeRequest ?? false;\r\n\r\n initialise() {\r\n }\r\n\r\n public async acceptMandates() {\r\n return this.taskRunner.run(async () => {\r\n const response = await this.portfolioApiClient.signPortfolio(this.requireInvestmentAdvice);\r\n if (response.data.success) {\r\n NotifyUtils.addSuccess(\"Mandates signed\", \"You have successfully signed all mandates linked to your investment profile\", NotificationDuration.Standard);\r\n this.investorService.investorData!.investor!.investorStatusID = RegistrationState.Mandate;\r\n return true;\r\n }\r\n return false;\r\n });\r\n }\r\n}\r\n\r\n@observer\r\nexport default class MandateComponent extends React.Component {\r\n\r\n private viewModel = new MandateComponentVM(this.props.taskRunner);\r\n\r\n public async acceptMandates() {\r\n if (await this.viewModel.acceptMandates()) {\r\n this.props.onRegisterStateChange(RegistrationState.AccountCreated);\r\n }\r\n }\r\n\r\n private downloadMaintenanceDocument(maintenanceDocumentType: MaintenanceDocumentType) {\r\n this.viewModel.taskRunner.run(\"Fetching Document\", async () => {\r\n var response = await this.viewModel.documentApiClient.fetchMaintenanceDocument(maintenanceDocumentType);\r\n if (response) {\r\n DocumentHandler.convertAndDownloadDocument(response, true);\r\n }\r\n });\r\n }\r\n\r\n private tcTextColor() {\r\n return this.viewModel.agreeToTerms ? \"#369afe\" : \"#636e95\";\r\n }\r\n\r\n private adviceTextColor() {\r\n return this.viewModel.requireInvestmentAdvice ? \"#369afe\" : \"#636e95\";\r\n }\r\n\r\n private debitOrderTextColor() {\r\n return this.viewModel.agreeDebitOrderInstruction ? \"#369afe\" : \"#636e95\";\r\n }\r\n\r\n private checkValidSignatures() {\r\n if (this.viewModel.hasDebitOrderInstruction) {\r\n return this.viewModel.agreeToTerms && this.viewModel.agreeDebitOrderInstruction;\r\n } else {\r\n return this.viewModel.agreeToTerms;\r\n }\r\n }\r\n\r\n public render() {\r\n\r\n const viewModel = this.viewModel;\r\n return (\r\n
\r\n
\r\n
\r\n

Sign your mandate

\r\n

* indicates a required field

\r\n

Please sign and read the mandate below to proceed

\r\n\r\n * I agree to the terms} style={{ color: this.tcTextColor() }} >\r\n { this.downloadMaintenanceDocument(MaintenanceDocumentType.TermsAndConditions); e.preventDefault() }}>\r\n Download terms and conditions\r\n \r\n\r\n {viewModel.hasDebitOrderInstruction &&\r\n <>\r\n * I have read and accepted the debit order authority} style={{ color: this.debitOrderTextColor() }} >\r\n { this.downloadMaintenanceDocument(MaintenanceDocumentType.DebitOrderAuthority); e.preventDefault() }}>\r\n Download debit order authority\r\n \r\n \r\n }\r\n
\r\n this.acceptMandates()} disabled={!this.checkValidSignatures()} >NEXT STEP\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { ITaskRunner, NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { injectable } from 'inversify';\r\nimport Home from '../../Dashboard/Dashboard';\r\n\r\nexport interface IAccountCreatedComponentProps {\r\n taskRunner: ITaskRunner;\r\n}\r\n\r\n@injectable()\r\n@NeoModel\r\nexport class AccountCreatedComponentVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n public notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n public navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n initialise() {\r\n }\r\n}\r\n\r\n@observer\r\nexport default class AccountCreatedComponent extends React.Component {\r\n\r\n private viewModel = new AccountCreatedComponentVM();\r\n\r\n public navigateToDashboard() {\r\n this.viewModel.navigation.navigateToView(Home);\r\n }\r\n\r\n public render() {\r\n\r\n return (\r\n
\r\n
\r\n
\r\n\r\n

Account Created

\r\n\r\n this.navigateToDashboard()}>TAKE ME TO MY DASHBOARD\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\n\r\n","import React from 'react';\r\nimport RegisterVM from './RegisterVM';\r\nimport { observer } from 'mobx-react';\r\nimport RegistrationPersonalDetailsComponent from './Components/RegistrationPersonalDetailsComponent';\r\nimport { RegistrationState } from '../../Models/Registration/Enums/RegistrationState';\r\nimport AccountTypeComponent from './Components/AccountTypeComponent';\r\nimport IdentificationComponent from './Components/IdentificationComponent';\r\nimport PoliticalSensitivityComponent from './Components/PoliticalSensitivityComponent';\r\nimport ProofOfResidenceComponent from './Components/ProofOfResidenceComponent';\r\nimport BankDetailsComponent from './Components/BankDetailsComponent';\r\nimport TaxDetailsComponent from './Components/TaxDetailsComponent';\r\nimport MandateComponent from './Components/MandateComponent';\r\nimport AccountCreatedComponent from './Components/AccountCreatedComponent';\r\nimport ETViewBase from '../ETViewBase';\r\nimport { EnumHelper } from '@singularsystems/neo-core';\r\n\r\n@observer\r\nexport default class RegisterView extends ETViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"Register\", RegisterVM, props);\r\n\r\n this.sidebarType = \"none\";\r\n }\r\n\r\n public render() {\r\n if (this.viewModel.registrationState === RegistrationState.AccountCreated) {\r\n return \r\n }\r\n\r\n return (\r\n
\r\n
\r\n {!!this.viewModel.registrationState && this.renderSidebar()}\r\n
\r\n
\r\n
\r\n {this.viewModel.registrationState === RegistrationState.PersonalDetails &&\r\n
\r\n \r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.AccountType &&\r\n
\r\n \r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.Identification &&\r\n
\r\n this.viewModel.registrationState = state} />\r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.PoliticalSensitivity &&\r\n
\r\n this.viewModel.registrationState = state} />\r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.ProofOfResidence &&\r\n
\r\n this.viewModel.registrationState = state} />\r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.BankDetails &&\r\n
\r\n this.viewModel.registrationState = state} />\r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.TaxDetails &&\r\n
\r\n this.viewModel.registrationState = state} />\r\n
\r\n }\r\n {this.viewModel.registrationState === RegistrationState.Mandate &&\r\n
\r\n this.viewModel.registrationState = state} />\r\n
\r\n }\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private renderSidebar() {\r\n const viewModel = this.viewModel,\r\n currentState = viewModel.registrationState;\r\n\r\n let nextState = EnumHelper.getItemMetadata(RegistrationState, currentState + 1).display;\r\n if (!isNaN(parseInt(nextState))) {\r\n nextState = \"Completion\";\r\n }\r\n\r\n const percent = viewModel.registrationState / RegistrationState.Mandate;\r\n const radius = 32;\r\n const circumference = radius * 2 * Math.PI;\r\n const offset = circumference - percent * circumference;\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {currentState} / {RegistrationState.Mandate}\r\n \r\n\r\n
{EnumHelper.getItemMetadata(RegistrationState, currentState).display}
\r\n
Next: {nextState}
\r\n
\r\n )\r\n }\r\n}","import { NeoModel } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport { NotificationDuration } from '../../Models/Enums/NotificationDuration'\r\nimport LoginDetails from '../../Models/Security/LoginDetails';\r\nimport RegisterView from '../Registration/RegisterView';\r\nimport LoginResult from '../../Models/Security/LoginResult';\r\nimport Home from '../Dashboard/Dashboard';\r\n\r\n@NeoModel\r\nexport default class LoginVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n private authenticationService = AppService.get(Types.Services.AppAuthenticationService),\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n ) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public loginDetails = new LoginDetails();\r\n\r\n public signIn() {\r\n this.taskRunner.run(async (opt) => {\r\n\r\n try {\r\n const response = await this.securityApiClient.login(this.loginDetails.toJSObject());\r\n\r\n const appUser = this.authenticationService.storeUser(LoginResult.fromJSObject(response.data));\r\n\r\n if (this.investorService.investorData) {\r\n this.investorService.investorData.investor = appUser.userInfo.investor;\r\n }\r\n \r\n // The RouteView app component will redirect to the correct location if the user is in the wrong state.\r\n this.navigation.navigateToView(Home);\r\n\r\n } catch (e) {\r\n this.notifications.addDanger(\"Login Error\", \"This account does not exist or your username and password do not match. Please make sure all fields are filled in correctly or reset your password.\", NotificationDuration.Long);\r\n this.loginDetails.password = \"\";\r\n }\r\n });\r\n }\r\n\r\n public register() {\r\n this.navigation.navigateToView(RegisterView);\r\n }\r\n}","import { NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class ForgotPassword extends APIModelBase {\r\n\r\n @Rules.Required()\r\n public username: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.username) {\r\n return \"New forgot password\";\r\n } else {\r\n return this.username;\r\n }\r\n }\r\n}","import { NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class UpdatePassword extends APIModelBase {\r\n\r\n public queryString: string = \"\";\r\n\r\n @Rules.Required()\r\n public newPassword: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n @Rules.Required()\r\n public confirmPassword: string = \"\";\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(up => up.confirmPassword.length !== 0 && up.confirmPassword !== up.newPassword, \"Confirm password does not match\")\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.queryString) {\r\n return \"New update password\";\r\n } else {\r\n return this.queryString;\r\n }\r\n }\r\n}","import { NeoModel, NotifyUtils } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport Home from '../Dashboard/Dashboard';\r\nimport { NotificationDuration } from '../../Models/Enums/NotificationDuration';\r\nimport ForgotPassword from '../../Models/Security/ForgotPassword';\r\nimport UpdatePassword from '../../Models/Security/UpdatePassword';\r\n\r\n@NeoModel\r\nexport default class ForgotPasswordVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public async initialise() {\r\n }\r\n\r\n public forgotPassword = new ForgotPassword();\r\n\r\n public updatePassword = new UpdatePassword();\r\n\r\n public emailReceived: boolean = false;\r\n\r\n public async resetPassword() {\r\n this.taskRunner.run(\"Resetting Password\", async (opt) => {\r\n var responseForgotPassword = await this.securityApiClient.forgotPassword(this.forgotPassword.toJSObject());\r\n if (responseForgotPassword.data) {\r\n NotifyUtils.addSuccess(\"Password reset\", \"If the username entered corresponds to a user, an email containing a verification link has been sent to your email address. Please click on this link within 24 hours in order to update your password.\", NotificationDuration.Standard);\r\n this.navigation.navigateToView(Home);\r\n }\r\n })\r\n }\r\n\r\n public setToken(token: string) {\r\n this.updatePassword.queryString = token;\r\n this.emailReceived = true;\r\n }\r\n\r\n public async updateUserPassword() {\r\n this.taskRunner.run(\"Updating password\", async (opt) => {\r\n var response = await this.securityApiClient.updatePassword(this.updatePassword.toJSObject());\r\n if (response.data.success) {\r\n NotifyUtils.addSuccess(\"Password updated\", \"Your password has been updated.\", NotificationDuration.Standard);\r\n this.navigation.navigateToView(Home);\r\n }\r\n });\r\n }\r\n}","import React from 'react';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport ForgotPasswordVM from './ForgotPasswordVM';\r\nimport { observer } from 'mobx-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport ETViewBase from '../ETViewBase';\r\n\r\nclass ForgotPasswordParams {\r\n public token = {}\r\n}\r\n\r\n@observer\r\nexport default class ForgotPasswordView extends ETViewBase {\r\n\r\n public static params = new ForgotPasswordParams();\r\n\r\n constructor(props: unknown) {\r\n super(\"Forgot Password\", ForgotPasswordVM, props);\r\n\r\n this.hideHeader = true;\r\n this.sidebarType = \"main-logo\";\r\n }\r\n\r\n private appLayout = AppService.get(Types.Services.AppLayout);\r\n\r\n protected viewParamsUpdated() {\r\n this.viewModel.setToken(this.viewParams.token.asString());\r\n }\r\n\r\n public render() {\r\n\r\n const viewModel = this.viewModel;\r\n\r\n return (\r\n
\r\n {!viewModel.emailReceived &&\r\n
\r\n

Reset Password

\r\n this.viewModel.resetPassword()}>\r\n \r\n
\r\n

Please enter the username you used to register to retrieve your password

\r\n
\r\n \r\n \r\n\r\n
\r\n Submit\r\n
\r\n
\r\n
\r\n
\r\n }\r\n {viewModel.emailReceived &&\r\n
\r\n

Update Password

\r\n this.viewModel.updateUserPassword()}>\r\n \r\n
\r\n

Please enter your new password below:

\r\n
\r\n \r\n \r\n Submit\r\n
\r\n
\r\n
}\r\n
\r\n );\r\n }\r\n}","import { Attributes, NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class ForgotUsername extends APIModelBase {\r\n\r\n @Rules.Required()\r\n @Attributes.Display(\"ID Number\")\r\n public idNo: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew ) {\r\n return \"New forgot username\";\r\n } else {\r\n return this.idNo;\r\n }\r\n }\r\n}","import { NeoModel, NotifyUtils } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { NotificationDuration } from '../../Models/Enums/NotificationDuration';\r\nimport ForgotUsername from '../../Models/Security/ForgotUsername';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport Home from '../Dashboard/Dashboard';\r\n\r\n@NeoModel\r\nexport default class ForgotUsernameVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public async initialise() { }\r\n\r\n public forgotUsername = new ForgotUsername() \r\n\r\n public async SendUsername() {\r\n this.taskRunner.run(\"Sending username\", async (opt) => {\r\n var response = await this.securityApiClient.forgotUsername(this.forgotUsername.toJSObject());\r\n if (response.data.success) {\r\n NotifyUtils.addSuccess(\"Username sent\", \"If the ID number corresponds with a user, an email containing your username has been sent to your email address.\", NotificationDuration.Long);\r\n this.navigation.navigateToView(Home);\r\n }\r\n });\r\n }\r\n}","import React from \"react\";\r\nimport { Neo } from \"@singularsystems/neo-react\";\r\nimport ForgotUsernameVM from \"./ForgotUsernameVM\";\r\nimport { observer } from \"mobx-react\";\r\nimport ETViewBase from \"../ETViewBase\";\r\n\r\nclass ForgotUsernameParams {\r\n public token = {};\r\n}\r\n\r\n@observer\r\nexport default class ForgotUsernameView extends ETViewBase {\r\n\r\n public static params = new ForgotUsernameParams();\r\n\r\n constructor(props: unknown) {\r\n super(\"Forgot Username\", ForgotUsernameVM, props);\r\n\r\n this.hideHeader = true;\r\n this.sidebarType = \"main-logo\";\r\n }\r\n\r\n public render() {\r\n \r\n const viewModel = this.viewModel;\r\n\r\n return (\r\n
\r\n

Forgot Username

\r\n this.viewModel.SendUsername()}>\r\n \r\n
\r\n

Please enter your ID number below:

\r\n
\r\n \r\n Submit\r\n\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import React from 'react';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport ETViewBase from '../ETViewBase';\r\nimport LoginVM from './LoginVM';\r\nimport { observer } from 'mobx-react';\r\nimport ForgotPasswordView from './ForgotPasswordView';\r\nimport ForgotUsernameView from './ForgotUsernameView';\r\n\r\n@observer\r\nexport default class Login extends ETViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"Login\", LoginVM, props);\r\n\r\n this.hideHeader = true;\r\n this.sidebarType = \"main-logo\";\r\n\r\n this.forgotPassword = this.forgotPassword.bind(this);\r\n this.forgotUsername = this.forgotUsername.bind(this);\r\n }\r\n\r\n private forgotPassword(e: React.MouseEvent) {\r\n e.preventDefault()\r\n this.navigation.navigateToView(ForgotPasswordView);\r\n }\r\n\r\n private forgotUsername(e: React.MouseEvent) {\r\n e.preventDefault()\r\n this.navigation.navigateToView(ForgotUsernameView);\r\n }\r\n\r\n public render() {\r\n const loginDetails = this.viewModel.loginDetails;\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n Don't have an account?\r\n this.viewModel.register()}>Sign Up\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n this.viewModel.signIn()}>\r\n
\r\n

Sign in to ETFSA

\r\n

Enter your details below

\r\n
\r\n\r\n
\r\n \r\n Forgot Username?\r\n
\r\n\r\n
\r\n \r\n Forgot Password?\r\n
\r\n\r\n
\r\n SIGN IN\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n );\r\n }\r\n}","import { injectable } from 'inversify';\r\nimport { AppService, Types } from './AppService';\r\nimport IAuthenticationService from '@singularsystems/neo-core/dist/Security/IAuthenticationService';\r\nimport { ISignInResult } from '@singularsystems/neo-core/dist/Security/SignInResult';\r\nimport AppUser from '../Models/Security/AppUser';\r\nimport LoginResult, { TokenInfo } from '../Models/Security/LoginResult';\r\nimport Login from '../Views/Security/Login';\r\nimport axios from 'axios';\r\nimport { observable } from 'mobx';\r\n\r\nconst storageKey = \"user-header-token\";\r\n\r\n@injectable()\r\nexport default class HeaderTokenAuthService implements IAuthenticationService {\r\n\r\n constructor(\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient)) {\r\n\r\n this.refreshUserToken = this.refreshUserToken.bind(this);\r\n }\r\n \r\n ensureSignedIn(redirectLocal?: string | undefined): boolean {\r\n throw new Error('Method not implemented.');\r\n }\r\n \r\n private redirectPath: string = \"/\";\r\n\r\n @observable.ref\r\n private appUser: AppUser | null = null;\r\n\r\n private timerHandle: any;\r\n\r\n public loadUserFromToken(): Promise {\r\n return this.loadUserFromSession();\r\n }\r\n\r\n public loadUserFromSession(): Promise {\r\n const userJson = sessionStorage.getItem(storageKey);\r\n if (userJson) {\r\n const userInfo = LoginResult.fromJSObject(JSON.parse(userJson));\r\n this.appUser = new AppUser(userInfo);\r\n this.onUserChanged();\r\n return Promise.resolve(this.appUser);\r\n } else {\r\n return Promise.resolve(null);\r\n }\r\n }\r\n\r\n public beginSignIn(redirectLocal?: string): Promise {\r\n this.redirectPath = redirectLocal ?? \"/\";\r\n this.navigation.navigateToView(Login);\r\n return Promise.resolve();\r\n }\r\n\r\n public async endSignIn(): Promise {\r\n \r\n // TODO: Check if registration is required.\r\n // this.navigation.navigateToView(RegisterView);\r\n this.navigation.navigateInternal(this.redirectPath);\r\n\r\n return Promise.resolve(this.redirectPath);\r\n }\r\n\r\n beginSignOut(): void {\r\n this.appUser = null;\r\n this.onUserChanged();\r\n this.navigation.navigateToView(Login);\r\n }\r\n\r\n public storeUser(userInfo: LoginResult) {\r\n this.appUser = new AppUser(userInfo);\r\n\r\n this.onUserChanged();\r\n return this.appUser;\r\n }\r\n\r\n /** Returns true if there is a user, and the token has not expired */\r\n public get isAuthenticated(): boolean {\r\n return this.appUser !== null && !this.appUser.hasExpired;\r\n }\r\n\r\n /** Returns the current user */\r\n public get user(): AppUser | null {\r\n return this.appUser;\r\n }\r\n\r\n public getUserJson() {\r\n return sessionStorage.getItem(storageKey)!;\r\n }\r\n\r\n private onUserChanged() {\r\n if (this.appUser) {\r\n axios.defaults.headers.common['AuthToken'] = this.appUser ? this.appUser.accessToken : undefined;\r\n } else {\r\n delete axios.defaults.headers.common['AuthToken'];\r\n }\r\n \r\n if (this.timerHandle) {\r\n clearTimeout(this.timerHandle);\r\n }\r\n if (this.appUser) {\r\n sessionStorage.setItem(storageKey, JSON.stringify(this.appUser.userInfo.toJSObject({ suppressTrackingState: true })));\r\n\r\n const expiryMs = this.appUser.userInfo.tokenInfo.expiryDate.getTime() - Date.now();\r\n // Refresh the token 1 minute before expiry.\r\n this.timerHandle = setTimeout(this.refreshUserToken, expiryMs - 60000);\r\n } else {\r\n sessionStorage.removeItem(storageKey);\r\n }\r\n }\r\n\r\n private async refreshUserToken() {\r\n try {\r\n const result = await this.securityApiClient.refreshTokenInfo();\r\n this.appUser!.userInfo.tokenInfo = TokenInfo.fromJSObject(result.data);\r\n\r\n this.onUserChanged();\r\n\r\n } catch (e) {\r\n console.log(\"Error refreshing token: \" + e);\r\n this.appUser = null;\r\n this.onUserChanged();\r\n }\r\n }\r\n\r\n /**\r\n * OIDC specific methods.\r\n * TODO: Remove if these methods are removed from IAuthenticationService in neo.\r\n */\r\n\r\n public tryCompleteSignIn(): Promise {\r\n throw Error(\"tryCompleteSignIn not supported\");\r\n }\r\n\r\n public signinSilent(): Promise {\r\n throw Error(\"signinSilent not supported\");\r\n }\r\n\r\n public endSignInSilent(): Promise {\r\n throw Error(\"endSignInSilent not supported\");\r\n }\r\n\r\n public signOutLocal(): void {\r\n throw Error(\"signOutLocal not supported\");\r\n }\r\n\r\n public endSignOut(): Promise {\r\n throw Error(\"endSignOut not supported\");\r\n }\r\n}","import { AppServices } from '@singularsystems/neo-core'\r\nimport { injectable } from 'inversify';\r\n\r\n@injectable()\r\nexport class AppConfig extends AppServices.ConfigModel {\r\n\r\n public apiPath: string = \"\";\r\n\r\n public oldSitePath: string = \"\";\r\n\r\n public researchPageUrl: string = \"\"\r\n \r\n public brokerBankDetails = {\r\n accountName: \"\",\r\n bank: \"\",\r\n branch: \"\",\r\n branchCode: 0,\r\n accountNumber: 0,\r\n accountType: \"\"\r\n }\r\n /**\r\n * Transforms property values loaded from config.json\r\n */\r\n public initialise() {\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class Bank extends ApiModelBase {\r\n\r\n public bankID: number = 0;\r\n\r\n public bankName: string = \"\";\r\n\r\n public defaultBranchCode: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.bankName) {\r\n return \"New bank\";\r\n } else {\r\n return this.bankName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class BankAccountType extends ApiModelBase {\r\n\r\n public bankAccountTypeID: number = 0;\r\n\r\n public bankAccountTypeName: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.bankAccountTypeName) {\r\n return \"New bank account type\";\r\n } else {\r\n return this.bankAccountTypeName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class Country extends APIModelBase {\r\n\r\n public countryID: number = 0;\r\n\r\n public countryName: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.countryName) {\r\n return \"New country\";\r\n } else {\r\n return this.countryName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class Province extends ApiModelBase {\r\n\r\n public provinceID: number = 0;\r\n\r\n public provinceName: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.provinceName) {\r\n return \"New province\";\r\n } else {\r\n return this.provinceName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class SourceOfFund extends APIModelBase {\r\n\r\n public sourceOfFundsID: number = 0;\r\n\r\n public sourceOfFundsName: string = \"\";\r\n\r\n public requiresAdditionalInfo: boolean = false;\r\n\r\n public additionalInfoPrompt: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.additionalInfoPrompt) {\r\n return \"New source of funds\";\r\n } else {\r\n return this.additionalInfoPrompt;\r\n }\r\n }\r\n}","import { EnumHelper, ITaskRunner, NeoModel } from \"@singularsystems/neo-core\";\r\nimport { Views } from \"@singularsystems/neo-react\";\r\nimport InvestorBankDetail from \"../../Models/Investors/InvestorBankDetail\";\r\nimport InvestorTaxDetail from \"../../Models/Investors/InvestorTaxDetail\";\r\nimport { FicaStatus } from \"../../Models/Enums/FicaStatus\";\r\nimport { NotificationDuration } from \"../../Models/Enums/NotificationDuration\";\r\nimport UpdateAddressCommand from \"../../Models/Investors/UpdateAddressCommand\";\r\nimport UpdateIdentityCommand from \"../../Models/Investors/UpdateIdentityCommand\";\r\nimport Investor from \"../../Models/Registration/Investor\";\r\nimport { AppService, Types } from \"../../Services/AppService\";\r\nimport AppInvestorData from \"../../Models/Investors/AppInvestorData\";\r\nimport AppLayout from \"../../Services/AppLayout\";\r\nimport { InfoPanelController } from \"../../App/Components/InfoPanel\";\r\nimport InvestorLinkedPortfolioLookup from \"../../Models/Investors/InvestorLinkedPortfolioLookup\";\r\nimport InvestmentInfoVM from \"./Components/InvestmentInfoVM\";\r\nimport { PortfolioSign } from \"../../Models/Registration/Portfolio\";\r\nimport { PortfolioType } from \"../../Models/Portfolio/PortfolioType\";\r\nimport { MaintenanceDocumentType } from \"../../Models/Base/Enums/MaintenanceDocumentType\";\r\n\r\nexport enum InfoPanelView {\r\n Identity = 1,\r\n Address = 2,\r\n BankDetails = 3,\r\n AdditionalBankDetails = 4,\r\n TaxDetails = 5\r\n}\r\n\r\n@NeoModel\r\nexport default class AccountInformationVM extends Views.ViewModelBase {\r\n\r\n constructor(public readonly investorId: number,\r\n public appInvestorData: AppInvestorData,\r\n public investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public portfolioApiClient = AppService.get(Types.ApiClients.PortfolioApiClient),\r\n public appDataCache = AppService.get(Types.Services.AppDataCache)) {\r\n super();\r\n }\r\n\r\n public selectedView: InfoPanelView | null = null;\r\n\r\n public panelController = new InfoPanelController();\r\n\r\n public async showInfoPanel(view: InfoPanelView | null) {\r\n\r\n this.selectedView = view;\r\n this.panelController.showInfoPanel(view ? \"InvestorDetails\" : \"Home\");\r\n\r\n await this.ensureInvestor(this.taskRunner);\r\n }\r\n\r\n private async ensureInvestor(taskRunner: ITaskRunner) {\r\n if (!this.investor) {\r\n const result = await taskRunner.waitFor(this.investorApiClient.getInvestor());\r\n this.investor = Investor.fromJSObject(result.data);\r\n }\r\n }\r\n\r\n public beginHideInfoPanel() {\r\n this.panelController.beginHideInfoPanel();\r\n }\r\n\r\n public investor: Investor | null = null;\r\n\r\n // Identity\r\n\r\n public editIdentity: UpdateIdentityCommand | null = null;\r\n\r\n public beginEditIdentity() {\r\n this.editIdentity = new UpdateIdentityCommand(this.investorId);\r\n this.editIdentity.idNo = this.investor!.idNo;\r\n this.beginHideInfoPanel();\r\n }\r\n\r\n public saveIdentity() {\r\n AppLayout.globalTaskRunner!.run(async () => {\r\n if (this.editIdentity) {\r\n await this.investorApiClient.updateInvestorIdentity(this.editIdentity.toJSObject());\r\n this.investor!.idNo = this.editIdentity.idNo;\r\n this.investor!.investorFICAStatusIdentity = FicaStatus.Pending;\r\n this.appInvestorData.clearFicaStatuses();\r\n this.editIdentity = null;\r\n this.notifications.addSuccess(\"ID\", \"Your documents have been updated.\", NotificationDuration.Standard);\r\n }\r\n });\r\n }\r\n\r\n // Address details\r\n\r\n public editAddress: UpdateAddressCommand | null = null;\r\n\r\n public async beginEditAddress(taskRunner?: ITaskRunner) {\r\n\r\n await this.ensureInvestor(taskRunner ?? this.taskRunner);\r\n\r\n this.editAddress = new UpdateAddressCommand(this.investorId, this.investor!.addressDetails.clone());\r\n this.beginHideInfoPanel();\r\n }\r\n\r\n public saveAddress() {\r\n AppLayout.globalTaskRunner!.run(async () => {\r\n if (this.editAddress) {\r\n await this.investorApiClient.updateInvestorAddressDetail(this.editAddress.toJSObject());\r\n if (this.investor) {\r\n this.investor.addressDetails = this.editAddress.addressDetail;\r\n this.investor.investorFICAStatusAddress = FicaStatus.Pending;\r\n }\r\n this.appInvestorData.clearFicaStatuses();\r\n this.editAddress = null;\r\n this.notifications.addSuccess(\"Address details\", \"Your address has been updated.\", NotificationDuration.Standard);\r\n }\r\n });\r\n }\r\n\r\n // Bank details\r\n\r\n public editBankDetail: InvestorBankDetail | null = null;\r\n\r\n public beginEditBankDetails() {\r\n this.editBankDetail = new InvestorBankDetail();\r\n this.editBankDetail.investorID = this.investorId;\r\n this.beginHideInfoPanel();\r\n }\r\n\r\n public saveBankDetail() {\r\n AppLayout.globalTaskRunner!.run(async () => {\r\n if (this.editBankDetail) {\r\n await this.investorApiClient.updateInvestorBankDetail([this.editBankDetail.toJSObject()]);\r\n if (this.investor) {\r\n this.investor.primaryBankDetails = this.editBankDetail;\r\n }\r\n this.appInvestorData.clearFicaStatuses();\r\n this.editBankDetail = null;\r\n this.appInvestorData.refetchInvestor();\r\n this.notifications.addSuccess(\"Bank details\", \"Your bank details have been updated.\", NotificationDuration.Standard);\r\n }\r\n });\r\n }\r\n\r\n // 3rd Party Bank Details\r\n\r\n public edit3rdPartyBankDetail: InvestorBankDetail | null = null;\r\n\r\n public beginEdit3rdPartyBankDetails() {\r\n this.edit3rdPartyBankDetail = new InvestorBankDetail();\r\n this.edit3rdPartyBankDetail.investorID = this.investorId;\r\n this.edit3rdPartyBankDetail.isThirdParty = true;\r\n this.beginHideInfoPanel();\r\n }\r\n\r\n public save3rdPartyBankDetail() {\r\n AppLayout.globalTaskRunner!.run(async () => {\r\n if (this.edit3rdPartyBankDetail) {\r\n await this.investorApiClient.updateInvestorBankDetail([this.edit3rdPartyBankDetail.toJSObject()]);\r\n if (this.investor) {\r\n this.investor.thirdPartyBankDetails = this.editBankDetail;\r\n }\r\n this.appInvestorData.clearFicaStatuses();\r\n this.edit3rdPartyBankDetail = null;\r\n this.notifications.addSuccess(\"3rd Party Bank Account\", \"Your bank details have been updated.\", NotificationDuration.Standard);\r\n }\r\n });\r\n }\r\n\r\n // Tax Details\r\n\r\n public editTaxDetails: InvestorTaxDetail | null = null;\r\n\r\n public async beginEditTaxDetails() {\r\n await this.ensureInvestor(this.taskRunner);\r\n\r\n this.editTaxDetails = this.investor!.investorTaxDetail.clone(); \r\n this.beginHideInfoPanel();\r\n }\r\n\r\n public saveTaxDetails() {\r\n AppLayout.globalTaskRunner!.run(async () => {\r\n if (this.editTaxDetails) {\r\n this.editTaxDetails.beforeSave();\r\n \r\n await this.investorApiClient.updateInvestorTaxDetail(this.editTaxDetails.toJSObject());\r\n if (this.investor) {\r\n this.investor.investorTaxDetail = this.editTaxDetails;\r\n this.investor.investorFICAStatusTaxNumber = FicaStatus.Pending;\r\n }\r\n this.appInvestorData.clearFicaStatuses();\r\n this.editTaxDetails = null;\r\n this.notifications.addSuccess(\"Tax details\", \"Your tax details have been updated.\", NotificationDuration.Standard);\r\n }\r\n });\r\n }\r\n\r\n // Investment\r\n\r\n public investmentVM: InvestmentInfoVM | null = null;\r\n\r\n public selectPortfolio(portfolio: InvestorLinkedPortfolioLookup) {\r\n this.investmentVM = new InvestmentInfoVM(portfolio, this.panelController);\r\n this.investmentVM.initialise();\r\n this.panelController.forward(\"InvestmentDetails\");\r\n }\r\n\r\n // New Investment\r\n\r\n public newInvestmentCommand: PortfolioSign | null = null;\r\n\r\n public beginNewInvestment(portfolioTypeId: number) {\r\n this.newInvestmentCommand = new PortfolioSign();\r\n this.newInvestmentCommand.portfolioTypeID = portfolioTypeId;\r\n // TODO: need portfolio type to document type mapping.\r\n this.newInvestmentCommand.maintenanceDocumentType = portfolioTypeId === PortfolioType.Discretionary ? \r\n MaintenanceDocumentType.NormalMandate : \r\n MaintenanceDocumentType.TaxFreeMandate;\r\n\r\n this.panelController.forward(\"StartInvestment\");\r\n }\r\n\r\n public createInvestment() {\r\n\r\n this.taskRunner.run(async () => {\r\n if (this.newInvestmentCommand) {\r\n const accountName = EnumHelper.getItemMetadata(PortfolioType, this.newInvestmentCommand.portfolioTypeID).display;\r\n\r\n await this.portfolioApiClient.portfolioOpenAndSign(this.newInvestmentCommand.toJSObject());\r\n this.notifications.addSuccess(\"Open account\", `Your ${accountName} account has been opened.`, NotificationDuration.Standard);\r\n\r\n if (this.appInvestorData?.investor) {\r\n // Add the new portfolio to the cached local data, and select the account.\r\n const lookup = new InvestorLinkedPortfolioLookup();\r\n lookup.portfolioTypeID = this.newInvestmentCommand.portfolioTypeID;\r\n lookup.portfolioType = accountName;\r\n \r\n this.appInvestorData!.investor.portfolioList.push(lookup);\r\n this.panelController.beginHideInfoPanel();\r\n this.appInvestorData.selectedPortfolio = lookup;\r\n }\r\n }\r\n });\r\n }\r\n}","import React from 'react'\r\n\r\nexport default class NotFound extends React.Component {\r\n\r\n public render() {\r\n return (\r\n
\r\n

Page not found

\r\n

The requested url could not be found.

\r\n
\r\n )\r\n }\r\n}","import React from \"react\";\r\nimport { Views } from '@singularsystems/neo-react';\r\n\r\nexport default class LoggedOutView extends Views.ViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"Logged out\", Views.EmptyViewModel, props);\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n

Logged out

\r\n\r\n

You have been logged out of the application.

\r\n
\r\n )\r\n }\r\n}","import { Components, NeoModel } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { NotificationDuration } from '../../Models/Enums/NotificationDuration';\r\nimport { AppService, Types } from '../../Services/AppService';\r\n\r\n@NeoModel\r\nexport default class RegistrationActivationVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper),\r\n ) {\r\n super(taskRunner);\r\n }\r\n\r\n public token: string = \"\";\r\n public registrationSuccessful: boolean | null = null;\r\n\r\n public setToken(token: string) {\r\n this.token = token;\r\n this.activateRegistration()\r\n }\r\n\r\n public activateRegistration() {\r\n this.taskRunner.run(async (opt) => {\r\n opt.errorHandling = Components.ErrorDisplayType.ThrowError;\r\n var response = await this.securityApiClient.activateRegistrationEmail(this.token);\r\n if (response.data) {\r\n if(response.data.success){\r\n this.notifications.addSuccess(\"Registration Successful\", null, NotificationDuration.Standard);\r\n this.registrationSuccessful = true;\r\n } else {\r\n this.registrationSuccessful = false;\r\n }\r\n }\r\n }).catch((ex: string) => {\r\n this.registrationSuccessful = false;\r\n });\r\n }\r\n}","import React from 'react';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport RegistrationActivationVM from './RegistrationActivationVM';\r\nimport { observer } from 'mobx-react';\r\nimport Login from '../../Views/Security/Login';\r\nimport RegisterView from './RegisterView';\r\nimport ETViewBase from '../ETViewBase';\r\n\r\nclass RegistrationActivationParams {\r\n public token = { required: true, isQuery: true }\r\n}\r\n\r\n@observer\r\nexport default class RegistrationActivationView extends ETViewBase {\r\n\r\n public static params = new RegistrationActivationParams();\r\n\r\n constructor(props: unknown) {\r\n super(\"Registration Activation\", RegistrationActivationVM, props);\r\n\r\n this.sidebarType = \"none\";\r\n }\r\n\r\n protected viewParamsUpdated() {\r\n this.viewModel.setToken(this.viewParams.token.asString());\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n
\r\n
\r\n {this.viewModel.registrationSuccessful &&\r\n
\r\n

Registration Successful

\r\n \r\n

You can now proceed to login

\r\n\r\n this.navigation.navigateToView(Login)}>Login Now\r\n
\r\n }\r\n {this.viewModel.registrationSuccessful === false &&\r\n
\r\n

Registration Failed

\r\n \r\n

This link has expired. Try logging in or re-registering.

\r\n \r\n
\r\n }\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}","import { NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport ETInvestorVMBase from '../ETInvestorVMBase';\r\n\r\n@NeoModel\r\nexport default class InvestorProfileVM extends ETInvestorVMBase {\r\n\r\n constructor(\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications)) {\r\n\r\n super(taskRunner);\r\n }\r\n\r\n public async initialise() {\r\n this.taskRunner.waitFor(this.investorService.investorData!.getFicaStatusesAsync());\r\n }\r\n}","import React from 'react';\r\nimport { FicaStatus } from '../../Models/Enums/FicaStatus';\r\nimport verified from '../../assets/img/verified.png';\r\nimport verified2x from '../../assets/img/verified@2x.png';\r\nimport declined from '../../assets/img/declined.png';\r\nimport declined2x from '../../assets/img/declined@2x.png';\r\nimport pending from '../../assets/img/pending.png';\r\nimport pending2x from '../../assets/img/pending@2x.png';\r\n\r\ninterface IStatusImageProps extends React.HTMLProps {\r\n status: FicaStatus | null;\r\n}\r\n\r\nexport default class StatusImage extends React.Component {\r\n\r\n public render() {\r\n const { status, ...rest } = this.props;\r\n\r\n const isPending = status !== FicaStatus.Approved && status !== FicaStatus.Rejected;\r\n\r\n return status && \r\n
\r\n
\r\n {status === FicaStatus.Approved && \"Verified\"}\r\n {status === FicaStatus.Rejected && \"Declined\"}\r\n {isPending && \"Pending\"}\r\n
\r\n
\r\n }\r\n}","import { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport InfoPanelBump from '../../../assets/img/info-panel-bump.png';\r\nimport InfoPanelController from './InfoPanelController';\r\n\r\ninterface IInfoPanelProps {\r\n controller: InfoPanelController;\r\n arrowAnchorSelector: string;\r\n}\r\n\r\n@observer\r\nexport default class InfoPanel extends React.Component {\r\n\r\n public render() {\r\n return this.props.controller._show &&\r\n \r\n }\r\n \r\n}\r\n\r\nclass InfoPanelContextProps {\r\n constructor(public readonly controller?: InfoPanelController) {\r\n\r\n }\r\n}\r\n\r\nexport const InfoPanelContext = React.createContext(new InfoPanelContextProps());\r\n\r\n@observer\r\nclass InfoPanelContent extends React.Component {\r\n \r\n constructor(props: IInfoPanelProps) {\r\n super(props);\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this);\r\n }\r\n\r\n private panelRef = React.createRef();\r\n private arrowRef = React.createRef();\r\n private timerHandle: any;\r\n private isHiding = false;\r\n\r\n componentDidMount() {\r\n window.addEventListener(\"mousedown\", this.onMouseDown);\r\n\r\n if (this.panelRef.current) {\r\n const panelRect = this.panelRef.current.getBoundingClientRect();\r\n const height = window.innerHeight - panelRect.top;\r\n this.panelRef.current.style.minHeight = height + \"px\";\r\n this.panelRef.current.className += \" show\";\r\n\r\n if (this.arrowRef.current) {\r\n const anchor = document.querySelector(this.props.arrowAnchorSelector);\r\n if (anchor) {\r\n const pointerRect = anchor.getBoundingClientRect();\r\n const panelLeft = panelRect.left;\r\n \r\n this.arrowRef.current.style.left = Math.max(0, (pointerRect.left - panelLeft) + (pointerRect.width / 2) - 12) + \"px\";\r\n }\r\n }\r\n }\r\n \r\n }\r\n\r\n componentDidUpdate() {\r\n if (this.isHiding) {\r\n this.beginHide();\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n window.removeEventListener(\"mousedown\", this.onMouseDown);\r\n if (this.timerHandle) {\r\n clearTimeout(this.timerHandle);\r\n }\r\n }\r\n\r\n private onMouseDown(e: MouseEvent) {\r\n let target = e.target as HTMLElement | null;\r\n let level = 0;\r\n do {\r\n if (target === this.panelRef.current || target?.className.indexOf(\"modal \") === 0) {\r\n return;\r\n }\r\n target = target!.parentElement;\r\n } while (target && ++level < 20)\r\n\r\n this.beginHide();\r\n }\r\n\r\n private beginHide() {\r\n if (this.panelRef.current) {\r\n this.panelRef.current.classList.remove(\"show\");\r\n if (!this.timerHandle) {\r\n this.timerHandle = setTimeout(() => this.props.controller.endHideInfoPanel(), 300);\r\n }\r\n }\r\n }\r\n\r\n public render() {\r\n const controller = this.props.controller;\r\n this.isHiding = controller._isHiding;\r\n\r\n return (\r\n \r\n
\r\n \"\"\r\n\r\n {this.props.children}\r\n
\r\n
\r\n )\r\n }\r\n}","import { observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport React from 'react';\r\nimport { InfoPanelContext } from './InfoPanel';\r\n\r\ninterface InfoPanelColumnProps {\r\n name: string;\r\n backToText?: string;\r\n renderBackLink?: boolean;\r\n}\r\n\r\n@observer\r\nexport default class InfoPanelColumn extends React.Component {\r\n static contextType = InfoPanelContext;\r\n context!: React.ContextType;\r\n\r\n private divRef = React.createRef();\r\n @observable\r\n private wasHidden = true;\r\n\r\n componentDidMount() {\r\n this.afterRender();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.afterRender();\r\n }\r\n\r\n private afterRender() {\r\n if (this.divRef.current) {\r\n if (this.wasHidden) {\r\n setTimeout(() => {\r\n // On first render, the column will be offset.\r\n // This causes the component to re-render, losing the offset class, and animate back to center.\r\n this.wasHidden = false;\r\n }, 100); \r\n }\r\n } else {\r\n this.wasHidden = true;\r\n }\r\n }\r\n\r\n public render(): React.ReactNode {\r\n const controller = this.context.controller!;\r\n controller!.registerPanel({ name: this.props.name, backToText: this.props.backToText})\r\n\r\n return (\r\n controller.canShow(this.props.name) &&\r\n
\r\n {this.props.renderBackLink && \r\n {controller.back(); e.preventDefault();}}> Back to {controller.lastHistory.backToText}}\r\n {this.props.children}\r\n
\r\n )\r\n }\r\n}","import { ModelBase, NeoModel } from \"@singularsystems/neo-core\";\r\nimport { runInAction } from \"mobx\";\r\n\r\ninterface IPanel {\r\n name: string;\r\n backToText?: string;\r\n}\r\n\r\n@NeoModel\r\nexport default class InfoPanelController extends ModelBase {\r\n\r\n public _show = false;\r\n public _isHiding = false;\r\n\r\n public get isVisible() {\r\n return this._show;\r\n }\r\n\r\n public showInfoPanel(startColumn = \"Home\") {\r\n this._direction = 0;\r\n this._currentColumn = startColumn;\r\n this._previousColumn = startColumn;\r\n \r\n this.endHideInfoPanel();\r\n this._show = true;\r\n }\r\n\r\n public beginHideInfoPanel() {\r\n if (this._show) {\r\n this._isHiding = true;\r\n }\r\n }\r\n\r\n public endHideInfoPanel() {\r\n this._show = false;\r\n this._isHiding = false;\r\n }\r\n\r\n public toggle() {\r\n if (this._show) {\r\n this._show = false;\r\n } else {\r\n this.showInfoPanel();\r\n }\r\n }\r\n\r\n private _slideAnimationActive = false;\r\n private _slideAnimationTimer: any = undefined;\r\n private _direction: number = 0;\r\n private _currentColumn = \"\";\r\n private _previousColumn = \"\";\r\n private history: string[] = [];\r\n private panels = new Map();\r\n\r\n public registerPanel(panel: IPanel) {\r\n if (!this.panels.has(panel.name)) {\r\n this.panels.set(panel.name, panel);\r\n }\r\n }\r\n\r\n public get lastHistory() {\r\n const lastHistoryName = this.history.length > 0 ? this.history[this.history.length - 1] : \"Home\";\r\n return this.panels.get(lastHistoryName) ?? { name: lastHistoryName, backToText: lastHistoryName};\r\n }\r\n\r\n public canShow(columnName: string) {\r\n return columnName === this._currentColumn || (columnName === this._previousColumn && this._slideAnimationActive);\r\n }\r\n\r\n public getClass(columnName: string, wasHidden: boolean) {\r\n if (this._direction !== 0) {\r\n if (columnName === this._previousColumn) {\r\n return `${this._direction > 0 ? \"offset-left\" : \"offset-right\"}`;\r\n } else if (wasHidden) {\r\n return `${this._direction > 0 ? \"offset-right\" : \"offset-left\"}`;\r\n }\r\n }\r\n return \"\";\r\n }\r\n\r\n public forward(columnName: string) {\r\n this.history.push(this._currentColumn);\r\n\r\n runInAction(() => {\r\n this._direction = 1;\r\n this._previousColumn = this._currentColumn;\r\n this._currentColumn = columnName;\r\n this.beginSlide();\r\n });\r\n \r\n }\r\n\r\n /** Goes back to the previous column unless a column name is specified. */\r\n public back(columnName?: string) {\r\n runInAction(() => {\r\n this._direction = -1;\r\n const history = this.history.pop() ?? \"Home\";\r\n this._previousColumn = this._currentColumn;\r\n this._currentColumn = columnName ?? history;\r\n \r\n this.beginSlide();\r\n });\r\n }\r\n\r\n public removeCurrentHistory() {\r\n this.history.pop();\r\n }\r\n\r\n private beginSlide() {\r\n this._slideAnimationActive = true;\r\n if (this._slideAnimationTimer) {\r\n clearTimeout(this._slideAnimationTimer);\r\n }\r\n this._slideAnimationTimer = setTimeout(() => {\r\n this._slideAnimationActive = false;\r\n }, 400);\r\n }\r\n}","import { FileUtils, List, NeoModel } from \"@singularsystems/neo-core\";\r\nimport { Views } from \"@singularsystems/neo-react\";\r\nimport { InfoPanelController } from \"../../../App/Components/InfoPanel\";\r\nimport { PurchaseInstrumentDetail } from \"../../../Models/Instruments/InstrumentDetail\";\r\nimport { RecurringTradeRequest, RecurringTradeRequestDetail, RecurringTradeRequestPost, TAUDebitOrder } from \"../../../Models/Base/RecurringTradeRequest\";\r\nimport { NotificationDuration } from \"../../../Models/Enums/NotificationDuration\";\r\nimport InvestorLinkedPortfolioLookup from \"../../../Models/Investors/InvestorLinkedPortfolioLookup\";\r\nimport { AppService, Types } from \"../../../Services/AppService\";\r\nimport Instrument from \"../../../Models/Instruments/Instrument\";\r\nimport { InvestableType } from \"../../../Models/Base/Enums/InvestableType\";\r\n\r\n@NeoModel\r\nexport default class InvestmentInfoVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n public portfolio: InvestorLinkedPortfolioLookup,\r\n public panelController: InfoPanelController,\r\n private apiClient = AppService.get(Types.ApiClients.PortfolioApiClient),\r\n private notificationService = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private debitOrderApiClient = AppService.get(Types.ApiClients.RecurringTradeRequestApiClient),\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService),\r\n public appDataCache = AppService.get(Types.Services.AppDataCache),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public otpService = AppService.get(Types.Services.OtpService)) {\r\n super();\r\n }\r\n\r\n public updateReInvestDividends() {\r\n this.taskRunner.run(async () => {\r\n await this.apiClient.reinvestDividends({portfolioTypeID: this.portfolio.portfolioTypeID, reinvestDividends: this.portfolio.pendingReinvestDividends});\r\n\r\n this.portfolio.reinvestDividends = this.portfolio.pendingReinvestDividends;\r\n\r\n this.notificationService.addSuccess(this.portfolio.portfolioType + \" investment\", \"Dividend settings saved successfully.\", NotificationDuration.Standard);\r\n });\r\n }\r\n\r\n // Debit orders.\r\n\r\n public debitOrderDetails: RecurringTradeRequest | null = null;\r\n public TAUDebitOrderList = new List(TAUDebitOrder);\r\n public editingDebitOrder: RecurringTradeRequestPost | null = null;\r\n public instrument: Instrument | null = null\r\n public downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n \r\n public async initialise() {\r\n\r\n const result = await this.taskRunner.waitForAll({\r\n trades : this.debitOrderApiClient.getRecurringTradeRequestDetails(this.portfolio.portfolioTypeID),\r\n debitOrders: this.debitOrderApiClient.getHistoricalDebitOrderList(this.portfolio.portfolioTypeID)\r\n }\r\n );\r\n if (result) {\r\n this.debitOrderDetails = RecurringTradeRequest.fromJSObject(result.trades.data);\r\n this.TAUDebitOrderList?.set(result.debitOrders.data)\r\n }\r\n }\r\n\r\n public changeDebitOrderDay(day: number, otp: string) {\r\n\r\n this.taskRunner.run(async () => {\r\n \r\n await this.debitOrderApiClient.postRecurringTradeRequest({\r\n portfolioTypeID: this.portfolio.portfolioTypeID,\r\n debitOrderDay: day,\r\n sourceOfFundsID: this.debitOrderDetails!.sourceOfFundsID,\r\n sourceOfFundsAdditionalInfo: this.debitOrderDetails!.sourceOfFundsAdditionalInfo,\r\n selectedInstruments: this.debitOrderDetails!.instruments.map(c => ({instrumentID: c.instrumentID, amount: c.amount})) as PurchaseInstrumentDetail[],\r\n otp: otp})\r\n\r\n // Update previously loaded data.\r\n this.debitOrderDetails!.debitOrderDay = day;\r\n this.debitOrderDetails!.hasSentOtp = false;\r\n this.debitOrderDetails!.otp = \"\";\r\n this.notificationService.addSuccess(this.portfolio.portfolioType + \" investment\", \"Debit order date updated successfully.\", NotificationDuration.Standard);\r\n });\r\n }\r\n\r\n public async editDebitOrder(debitOrder: RecurringTradeRequestDetail) {\r\n let instrumentDetail = new PurchaseInstrumentDetail();\r\n\r\n this.editingDebitOrder = RecurringTradeRequestPost.mapFrom(debitOrder);\r\n // adding this manually since mapFrom() won't because of the property name mismatch\r\n instrumentDetail.instrumentID = debitOrder.instrumentID;\r\n instrumentDetail.amount = debitOrder.amount;\r\n\r\n this.editingDebitOrder.selectedInstruments.push(instrumentDetail);\r\n this.editingDebitOrder.tradeCosts = await this.appDataCache.tradeCosts.getDataAsync();\r\n\r\n this.instrument = (await this.investorService.portfolioData?.fetchInstruments()!).find(c => c.instrumentID === debitOrder.instrumentID)!;\r\n this.editingDebitOrder.investableType = this.instrument.investableTypeID;\r\n this.editingDebitOrder.minimumInvestmentAmount = this.instrument.minimumInvestmentAmount;\r\n this.debitOrderEstimatedUnits();\r\n this.panelController.forward(\"EditDebitOrder\");\r\n }\r\n\r\n public debitOrderEstimatedUnits() {\r\n let currentInstrument = this.editingDebitOrder!.selectedInstruments[0]\r\n \r\n if (this.instrument) {\r\n currentInstrument.setTradeValues(this.instrument);\r\n }\r\n\r\n var tradeFees = this.editingDebitOrder!.tradeCosts!.getFees(this.editingDebitOrder!.amount, currentInstrument.tradeCostMultiplier)\r\n this.editingDebitOrder!.fees.brokerage = tradeFees.brokerage;\r\n this.editingDebitOrder!.fees.strateFee = tradeFees.strateFee;\r\n this.editingDebitOrder!.fees.vat = tradeFees.vat;\r\n\r\n let estimatedUnitsCalculation = (this.editingDebitOrder!.amount - this.editingDebitOrder!.fees.totalFees) / this.instrument!.buyPrice;\r\n\r\n if (this.instrument?.investableTypeID === InvestableType.Instrument) {\r\n currentInstrument.estimatedUnits = this.instrument.buyPrice > 0 ? Math.floor(estimatedUnitsCalculation) : 0;\r\n } else {\r\n currentInstrument.estimatedUnits = 0;\r\n }\r\n }\r\n\r\n public async confirmChangeDebitOrder() {\r\n if (this.editingDebitOrder) {\r\n const prevOtp = await this.taskRunner.waitFor(this.otpService.sendOtp());\r\n if (prevOtp) {\r\n this.editingDebitOrder.otp = prevOtp;\r\n this.submitChangeDebitOrder();\r\n } else {\r\n this.editingDebitOrder.hasSentOtp = true;\r\n }\r\n }\r\n }\r\n\r\n public submitChangeDebitOrder() {\r\n\r\n this.taskRunner.run(async () => {\r\n if (this.editingDebitOrder) {\r\n this.editingDebitOrder!.selectedInstruments[0]!.amount = this.editingDebitOrder?.amount;\r\n\r\n await this.debitOrderApiClient.postRecurringTradeRequest({\r\n ...this.editingDebitOrder.toJSObject(),\r\n portfolioTypeID: this.debitOrderDetails!.portfolioTypeID,\r\n debitOrderDay: this.debitOrderDetails!.debitOrderDay,\r\n sourceOfFundsID: this.debitOrderDetails!.sourceOfFundsID,\r\n sourceOfFundsAdditionalInfo: this.debitOrderDetails!.sourceOfFundsAdditionalInfo\r\n });\r\n this.otpService.storeValidOtp(this.editingDebitOrder.otp);\r\n\r\n // Update previously loaded data.\r\n const debitOrder = this.debitOrderDetails!.instruments.find(c => c.instrumentID === this.editingDebitOrder!.selectedInstruments[0].instrumentID)!;\r\n debitOrder.amount = this.editingDebitOrder!.amount;\r\n\r\n this.notificationService.addSuccess(this.portfolio.portfolioType + \" investment\", \"Debit order updated successfully.\", NotificationDuration.Standard);\r\n this.panelController.back();\r\n }\r\n });\r\n }\r\n\r\n public cancelDebitOrder(debitOrder: RecurringTradeRequestDetail) {\r\n\r\n this.taskRunner.run(async () => {\r\n\r\n await this.debitOrderApiClient.cancelRecurringTradeRequest({ portfolioTypeID: this.portfolio.portfolioTypeID, instrumentID: debitOrder.instrumentID });\r\n this.debitOrderDetails!.instruments.remove(debitOrder);\r\n\r\n if (this.debitOrderDetails!.instruments.length === 0) {\r\n this.debitOrderDetails = null;\r\n }\r\n\r\n this.notificationService.addSuccess(this.portfolio.portfolioType + \" investment\", \"Debit order cancelled successfully.\", NotificationDuration.Standard);\r\n });\r\n }\r\n\r\n public async downloadTradeDebitOrderMandate(contractNo: string, selfLink: string) {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getTradeDebitOrderMandateDocument(contractNo, selfLink));\r\n\r\n FileUtils.showSaveFile(response);\r\n }\r\n}","import React from 'react';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport InvestorProfileVM from './InvestorProfileVM';\r\nimport { observer } from 'mobx-react';\r\nimport ETViewBase from '../ETViewBase';\r\nimport InvestmentSelectionComponent from '../Dashboard/Components/InvestmentSelectionComponent';\r\nimport StatusImage from '../../App/Components/StatusImage';\r\nimport { InfoPanelView } from '../InformationPanel/AccountInformationVM';\r\nimport ClickLink from '../../App/Components/ClickLink';\r\nimport { FicaStatus } from '../../Models/Enums/FicaStatus'\r\n\r\n@observer\r\nexport default class InvestorProfileView extends ETViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"Investor Profile\", InvestorProfileVM, props);\r\n }\r\n\r\n public render() {\r\n const viewModel = this.viewModel,\r\n investorService = viewModel.investorService,\r\n investorData = investorService.investorData!,\r\n ficaStatuses = investorData.ficaStatuses;\r\n\r\n return (\r\n
\r\n \r\n\r\n
\r\n\r\n {ficaStatuses &&\r\n \r\n\r\n {this.getSection(ficaStatuses.identityStatus,\r\n
\r\n Identification Document\r\n investorService.beginShowAccountInformationPanel(InfoPanelView.Identity)}>VIEW ID\r\n {(ficaStatuses.identityStatus === FicaStatus.Rejected &&\r\n {ficaStatuses.identityFailedReason})}\r\n
)}\r\n\r\n {this.getSection(ficaStatuses.addressStatus,\r\n
\r\n Proof of residence\r\n investorService.beginShowAccountInformationPanel(InfoPanelView.Address)}>VIEW PROOF \r\n {ficaStatuses.addressStatus === FicaStatus.Rejected &&\r\n
\r\n {ficaStatuses.addressFailedReason}\r\n
\r\n investorData.accountInformationVM.beginEditAddress(this.taskRunner)}>UPLOAD NEW\r\n
\r\n
}\r\n
)}\r\n\r\n {this.getSection(ficaStatuses.bankDetailsStatus,\r\n
\r\n Bank Details\r\n investorService.beginShowAccountInformationPanel(InfoPanelView.BankDetails)}>VIEW DETAILS\r\n {(ficaStatuses.bankDetailsStatus === null || ficaStatuses.bankDetailsStatus === FicaStatus.Rejected) &&\r\n
\r\n investorData.accountInformationVM.beginEditBankDetails()}>UPLOAD NEW\r\n
}\r\n
)}\r\n\r\n {this.getSection(ficaStatuses.taxStatus,\r\n
\r\n Tax Details\r\n investorService.beginShowAccountInformationPanel(InfoPanelView.TaxDetails)}>VIEW DETAILS\r\n {ficaStatuses.taxStatus === FicaStatus.Rejected &&\r\n
\r\n {ficaStatuses.taxFailedReason}\r\n
\r\n investorData.accountInformationVM.beginEditTaxDetails()}>UPLOAD NEW\r\n
\r\n
}\r\n
)}\r\n\r\n {this.getSection(ficaStatuses.thirdPartyBankDetailsStatus,\r\n
\r\n 3rd Party Bank Account\r\n investorService.beginShowAccountInformationPanel(InfoPanelView.AdditionalBankDetails)}>VIEW DETAILS\r\n {(ficaStatuses.thirdPartyBankDetailsStatus === null) &&\r\n
\r\n investorData.accountInformationVM.beginEdit3rdPartyBankDetails()}> Add 3rd Party Bank Details\r\n
}\r\n {(ficaStatuses.thirdPartyBankDetailsStatus === FicaStatus.Rejected) &&\r\n
\r\n investorData.accountInformationVM.beginEdit3rdPartyBankDetails()}>UPLOAD NEW\r\n
}\r\n
)}\r\n\r\n
}\r\n
\r\n\r\n
\r\n );\r\n }\r\n\r\n private getSection(statusId: number | null, content: JSX.Element) {\r\n return (\r\n
\r\n
\r\n
\r\n {content}\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n }\r\n}","import { Attributes, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class FAQ extends ApiModelBase {\r\n\r\n @Attributes.Integer()\r\n public faqid: number = 0;\r\n\r\n public question: string = \"\";\r\n\r\n public answer: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.question) {\r\n return \"New faq\";\r\n } else {\r\n return this.question;\r\n }\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { List, ModelBase, NeoModel } from '@singularsystems/neo-core';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport FAQ from '../Models/Base/FAQ';\r\n\r\n@NeoModel\r\nclass FAQCriteria extends ModelBase {\r\n\r\n public searchText: string = \"\";\r\n}\r\n\r\n@NeoModel\r\nclass FaqVM extends Views.ViewModelBase {\r\n\r\n constructor(public apiClient = AppService.get(Types.ApiClients.FAQApiClient)) {\r\n super();\r\n\r\n this.autoDispose(this.faqCriteria.onAnyPropertyChanged(() => this.performFilter()));\r\n }\r\n\r\n public faqCriteria = new FAQCriteria();\r\n\r\n private faqList = new List(FAQ);\r\n\r\n private filteredList: FAQ[] | null = null;\r\n\r\n public async initialise() {\r\n const result = await this.taskRunner.waitFor(this.apiClient.getFAQList());\r\n\r\n this.faqList.set(result.data);\r\n }\r\n\r\n private performFilter() {\r\n if (this.faqCriteria.searchText) {\r\n const search = new RegExp(this.faqCriteria.searchText, \"gi\");\r\n\r\n this.filteredList = this.faqList.filter(c => c.question.search(search) >= 0 || c.answer.search(search) >= 0);\r\n } else {\r\n this.filteredList = null;\r\n }\r\n }\r\n\r\n public getFaqList() {\r\n if (this.filteredList) {\r\n return this.filteredList;\r\n } else {\r\n return this.faqList;\r\n }\r\n }\r\n}\r\n\r\n@observer\r\nexport default class FAQView extends Views.PersistentViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"FAQ\", FaqVM, props);\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n

FAQs

\r\n\r\n
\r\n
\r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n {this.viewModel.getFaqList().map(faq => (\r\n
\r\n
\r\n
{faq.question}
\r\n
\r\n
\r\n {faq.answer}\r\n
\r\n
\r\n ))}\r\n\r\n {this.viewModel.getFaqList().length === 0 &&\r\n
\r\n Sorry, no questions match your search criteria.\r\n
}\r\n
\r\n\r\n
\r\n\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport mobileIcon from '../assets/img/mobile.svg';\r\nimport wwwIcon from '../assets/img/worldwide-icon.svg';\r\nimport whatsAppIcon from '../assets/img/whatsapp-icon.svg';\r\nimport mailIcon from '../assets/img/mail-icon.svg';\r\n\r\n@observer\r\nexport default class ContactUsView extends Views.ViewBase {\r\n\r\n constructor(props: unknown) {\r\n super(\"Contact Us\", Views.EmptyViewModel, props);\r\n }\r\n\r\n public render() {\r\n return (\r\n
\r\n\t\t\t

Contact Us

\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
{this.renderContactMethod(\"Telephone\", \"010 446 7892\", mobileIcon)}{this.renderContactMethod(\"WhatsApp Messages\", \"063 984 6347\", whatsAppIcon)}
{this.renderContactMethod(\"E-mail\", hub@etfsa.co.za, mailIcon)}{this.renderContactMethod(\"Web\", www.etfsa.co.za, wwwIcon)}
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n\t\t\t\t\r\n
\r\n );\r\n }\r\n\r\n private renderContactMethod(description: string, detail: any, image: string) {\r\n return
\r\n {description}\r\n
{description}
\r\n
{detail}
\r\n
\r\n }\r\n}","import { Routing as NeoRouting } from '@singularsystems/neo-core';\r\nimport { Routing } from '@singularsystems/neo-react';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from './AppService';\r\n\r\nimport Login from '../Views/Security/Login'\r\n\r\nimport NotFound from '../App/Components/404NotFound';\r\nimport LoggedOut from '../Views/Security/LoggedOut';\r\nimport RegisterView from '../Views/Registration/RegisterView';\r\nimport RegistrationActivation from '../Views/Registration/RegistrationActivationView';\r\nimport Dashboard from '../Views/Dashboard/Dashboard';\r\nimport ForgotPasswordView from '../Views/Security/ForgotPasswordView';\r\nimport ForgotUsernameView from '../Views/Security/ForgotUsernameView';\r\nimport InvestorProfileView from '../Views/Investor/InvestorProfileView';\r\nimport FAQView from '../Views/FAQView';\r\nimport ContactUsView from '../Views/ContactUsView';\r\nimport ProductView from '../Views/Investor/Trades/Product';\r\nimport PurchaseView from '../Views/Investor/Trades/Purchase';\r\n\r\ninterface IRouteExtensions {\r\n \r\n}\r\n\r\nexport interface IAppRoute extends NeoRouting.IRoute, IRouteExtensions {\r\n\r\n}\r\n\r\nexport interface IAppMenuItem extends NeoRouting.IMenuRoute, IRouteExtensions {\r\n requiresReadyInvestor?: boolean;\r\n}\r\n\r\nexport const dashboardRoute: IAppMenuItem = { name: \"Dashboard\", path: \"/\", component: Dashboard, icon: \"chart-line\", requiresReadyInvestor: true };\r\nexport const investorProfileRoute: IAppMenuItem = { name: \"Profile\", path: \"/investor/profile\", component: InvestorProfileView, icon: \"file-alt\" };\r\nexport const faqRoute: IAppMenuItem = { name: \"Frequently asked questions\", path: \"/faq\", component: FAQView, icon: \"question\", allowAnonymous: true };\r\nexport const contactUsRoute: IAppMenuItem = { name: \"Contact Us\", path: \"/contact-us\", component: ContactUsView, icon: \"phone\", allowAnonymous: true };\r\nexport const productRoute: IAppMenuItem = { name: \"Products\", path: \"/products\", component: ProductView, icon: \"phone\", requiresReadyInvestor: true };\r\n\r\n@injectable()\r\nexport class RouteService {\r\n\r\n private routeProvider: Routing.RouteProvider;\r\n\r\n constructor(private config = AppService.get(Types.Config)) {\r\n \r\n this.routeProvider = new Routing.RouteProvider(\r\n this.getMenuRoutes(),\r\n this.getPureRoutes(),\r\n NotFound,\r\n )\r\n }\r\n\r\n /**\r\n * Gets the routes provider\r\n */\r\n public get routes(): Routing.RouteProvider {\r\n return this.routeProvider;\r\n }\r\n\r\n private getMenuRoutes(): IAppMenuItem[] {\r\n return [\r\n dashboardRoute,\r\n investorProfileRoute,\r\n faqRoute,\r\n contactUsRoute\r\n ]\r\n }\r\n\r\n private getPureRoutes(): IAppRoute[] {\r\n return [\r\n {\r\n path: '/login', component: Login, allowAnonymous: true\r\n },\r\n {\r\n path: \"/loggedout\", component: LoggedOut, allowAnonymous: true\r\n },\r\n {\r\n path: \"/register\", component: RegisterView, allowAnonymous: true\r\n },\r\n {\r\n path: \"/registerActivation\", component: RegistrationActivation, allowAnonymous: true\r\n },\r\n {\r\n path: \"/forgot-password\", component: ForgotPasswordView, allowAnonymous: true\r\n },\r\n {\r\n path: \"/forgot-username\", component: ForgotUsernameView, allowAnonymous: true\r\n },\r\n {\r\n path: \"/product\", component: ProductView, routeChildren: [{\r\n path: \"/purchase\", component: PurchaseView\r\n }]\r\n },\r\n investorProfileRoute\r\n ]\r\n }\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport LoginDetails from '../Models/Security/LoginDetails';\r\nimport LoginResult, { TokenInfo } from '../Models/Security/LoginResult';\r\nimport Registration from '../Models/Registration/Registration';\r\nimport ForgotPassword from '../Models/Security/ForgotPassword';\r\nimport UpdatePassword from '../Models/Security/UpdatePassword';\r\nimport OTPRegistrationVerification from '../Models/Security/OTPRegistrationVerification';\r\nimport APIResponse from '../Models/APIResponse';\r\nimport ChangePassword from '../Models/Security/ChangePassword';\r\nimport ForgotUsername from '../Models/Security/ForgotUsername';\r\n\r\nexport interface ISecurityApiClient {\r\n\r\n /**\r\n * Method used to get authentication token required for any requests that require authentication.\r\n */\r\n login(LoginDetails: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n refreshTokenInfo(): AxiosPromise>;\r\n\r\n /**\r\n * Method used to request a Verification email in order to register a new Investor.\r\n * A new Email will be sent if the registration is still pending confirmation.\r\n * If the email address links to a registered user, the registration will fail.\r\n */\r\n register(RegisterModel: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /**\r\n * This method accepts the query string that is included in the URL that is emailed to the user.\r\n * If the Query String is valid and matches a Registration request that is pending Verification, the request will be Verified.\r\n * Once this step is complete, the Investor can log in.\r\n */\r\n activateRegistrationEmail(QueryString: string): AxiosPromise>;\r\n\r\n /**\r\n * Generates a Forgot password email to the specified email address.\r\n * The email will contain a URL that will redirect the user to a page where they are able to reset their password.\r\n */\r\n forgotPassword(ForgotPasswordModel: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /**\r\n * Method used to reset an Investor's Password.\r\n * This method requires the Query String that is included in the URL supplied in the Forgot Password Email, as well as the new Password.\r\n */\r\n updatePassword(UpdatePasswordModel: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n changePassword(passwordDetails: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /** \r\n * Sends an otp to the logged in investor.\r\n */\r\n sendOTP(): AxiosPromise;\r\n\r\n /**\r\n * Method to verify OTP.\r\n * This method requires the OTP and the Registration ID.\r\n */\r\n checkRegistrationOTPVerification(OTPRegistrationVerification: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /**\r\n * Sends an otp to a user who is busy registering.\r\n * This differs from 'send-otp' in that there is no investor record at this point.\r\n */\r\n resendOtp(OTPRegistrationVerification: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /**\r\n * Generates a Forgot Username email to the email address corresponding with the specified IDNo\r\n * The email will contain the investor's username..\r\n */\r\n forgotUsername(ForgotUsernameModel: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class SecurityApiClient extends Data.ApiClientBase implements ISecurityApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/security`);\r\n }\r\n\r\n public login(LoginDetails: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/Login/`, LoginDetails);\r\n }\r\n\r\n public refreshTokenInfo(): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/refresh-token-info`);\r\n }\r\n\r\n public register(RegisterModel: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/register`, RegisterModel);\r\n }\r\n\r\n public activateRegistrationEmail(QueryString: string): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/register/activate-registration-email/${encodeURIComponent(QueryString)}`);\r\n }\r\n\r\n public forgotPassword(ForgotPasswordModel: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/forgot-password`, ForgotPasswordModel);\r\n }\r\n\r\n public updatePassword(UpdatePasswordModel: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/update-password`, UpdatePasswordModel);\r\n }\r\n\r\n public changePassword(passwordDetails: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/change-password`, passwordDetails);\r\n }\r\n\r\n public sendOTP(): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/send-otp`);\r\n }\r\n\r\n public checkRegistrationOTPVerification(OTPRegistrationVerification: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/check-otp`, OTPRegistrationVerification);\r\n }\r\n\r\n public resendOtp(OTPRegistrationVerification: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/resend-otp`, OTPRegistrationVerification);\r\n }\r\n\r\n public forgotUsername(ForgotUsernameModel: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/forgot-username`, ForgotUsernameModel);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Components } from \"@singularsystems/neo-core\";\r\nimport { IErrorData, IErrorDisplay } from \"@singularsystems/neo-core/dist/Components/ErrorHandler\";\r\nimport { AxiosError } from \"axios\";\r\n\r\nexport class EtfSAErrorHandler extends Components.ErrorHandler {\r\n public async parseAxiosError(header: string, body: string, error: AxiosError): Promise {\r\n \r\n body = body.replace(\"Cannot continue due to the following validation errors:\", \"\");\r\n\r\n const errorDisplay: IErrorDisplay = { header: header, body: body, statusText: error.message, statusCode: error.response?.status } as IErrorDisplay\r\n\r\n if (error.response!.data) {\r\n \r\n let rawErrorData = await this.ensureAxiosErrorData(error.response!.data);\r\n \r\n if (error.response?.data?.apiValidationMessageList && error.response?.data.apiValidationMessageList.length >= 1) {\r\n\r\n error.response?.data.apiValidationMessageList.forEach((rawErrorData: { primaryProperty: string; detail: string; }) => {\r\n if (error.response?.data.apiValidationMessageList.length > 1) {\r\n errorDisplay.header = \"An error has occurred\"\r\n } else {\r\n errorDisplay.header = rawErrorData.primaryProperty;\r\n }\r\n errorDisplay.body += this.HTMLtoText(rawErrorData.detail);\r\n });\r\n\r\n } else {\r\n \r\n if (rawErrorData.title) {\r\n errorDisplay.body = rawErrorData.title;\r\n rawErrorData = rawErrorData.errors;\r\n }\r\n\r\n if (rawErrorData) {\r\n if (typeof rawErrorData === \"string\") {\r\n errorDisplay.body = this.HTMLtoText(rawErrorData);\r\n } else {\r\n const errorData = { errors: [], properties: [] } as IErrorData;\r\n errorDisplay.data = errorData;\r\n\r\n if (rawErrorData[\"\"]) {\r\n errorData.errors = rawErrorData[\"\"];\r\n }\r\n Object.keys(rawErrorData).forEach(key => {\r\n if (key !== \"$id\" && key !== \"\") {\r\n const propertyErrors: string[] = rawErrorData[key];\r\n if (propertyErrors && propertyErrors instanceof Array) {\r\n errorData.properties.push({ key: key, errors: propertyErrors.join(\", \") })\r\n }\r\n }\r\n\r\n });\r\n\r\n }\r\n }\r\n }\r\n\r\n }\r\n return errorDisplay\r\n }\r\n\r\n public HTMLtoText = function (str: string) {\r\n var parser = new DOMParser();\r\n var doc = parser.parseFromString(str, 'text/html');\r\n return doc.body.innerText;\r\n };\r\n}\r\n","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport APIResponse from '../Models/APIResponse';\r\nimport Investor from '../Models/Registration/Investor';\r\nimport InvestorAddressDetail from '../Models/Investors/InvestorAddressDetail';\r\nimport InvestorBankDetail from '../Models/Investors/InvestorBankDetail';\r\nimport InvestorTaxDetail from '../Models/Investors/InvestorTaxDetail';\r\nimport UpdateIdentityCommand from '../Models/Investors/UpdateIdentityCommand';\r\nimport UpdateAddressCommand from '../Models/Investors/UpdateAddressCommand';\r\nimport { IDCheckResult } from '../Models/Enums/IDCheckResult';\r\nimport InvestorOTPDetails from \"../Models/Investors/InvestorOTPDetails\";\r\n\r\nexport interface IInvestorApiClient {\r\n\r\n /**\r\n * This methods returns the current logged in Investor.\r\n */\r\n getInvestor(): AxiosPromise>;\r\n\r\n /**\r\n * Method used to Change the Investor's Cell Number.\r\n * An OTP will be generated and split, the first half is sent to the new number and the other half to the Email Address.\r\n * Notifications will be sent to The old number and Email.\r\n */\r\n changeCellNo(CellNo: string): AxiosPromise>;\r\n\r\n /** \r\n * Method used to Change the Investor's Default OTP Communication Preference.\r\n * An OTP will be generated and sent to the investor's Current Cell Number.\r\n */\r\n beginChangeOTPMethod(communicationPreferenceTypeID: number): AxiosPromise>;\r\n\r\n /** \r\n * Changes the otp preference once the opt has been entered by the user.\r\n * @param otp One time pin.\r\n */\r\n endChangeOTPMethod(otp: string): AxiosPromise;\r\n\r\n /**\r\n * This method is used to verify the Investor's new Cell Number.\r\n * The OTP provided will be the concatenated OTP from the SMS and the Email.\r\n */\r\n verifyCellNo(OTP: string): AxiosPromise>;\r\n\r\n checkIDNumber(investorId: number, idNo: string): AxiosPromise;\r\n\r\n /**\r\n * Updates the Investor Status to \"Ready to Invest\", provided the user has been FICA verified.\r\n */\r\n putReadyToInvest(): AxiosPromise>;\r\n\r\n /**\r\n * Updates investor details and validates rules based on current investor status.\r\n * Password is required if the investor\r\n */\r\n putInvestor(InvestorModel: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /**\r\n * This methods returns the current logged in investor's address details.\r\n */\r\n getInvestorAddressDetails(): AxiosPromise>;\r\n\r\n /**\r\n * Method used to update the investor's address information.\r\n */\r\n updateInvestorAddressDetail(InvestorAddressDetail: Model.PlainObject): AxiosPromise;\r\n\r\n /**\r\n * Updates investor address details only.\r\n */\r\n updateInvestorBankDetail(InvestorBankDetailModel: Model.PartialPlainObject[]): AxiosPromise;\r\n\r\n /**\r\n * Method used to update the investor's tax detail information.\r\n */\r\n updateInvestorTaxDetail(taxDetail: Model.PlainObject): AxiosPromise;\r\n\r\n /**\r\n * Updates the current investors id number and links the identity documents to the investor.\r\n */\r\n updateInvestorIdentity(command: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /**\r\n * This methods returns the current logged in Investor's details needed for the OTP.\r\n */\r\n getInvestorOTPDetails(): AxiosPromise>;\r\n}\r\n\r\n@injectable()\r\nexport default class InvestorApiClient extends Data.ApiClientBase implements IInvestorApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/investor`);\r\n }\r\n\r\n public getInvestor(): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/GetInvestor`);\r\n }\r\n\r\n public changeCellNo(CellNo: string): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/ChangeCellNo`, CellNo);\r\n }\r\n\r\n public beginChangeOTPMethod(communicationPreferenceTypeID: number): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/begin-change-otp-method/${communicationPreferenceTypeID}`);\r\n }\r\n\r\n public endChangeOTPMethod(otp: string): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/end-change-otp-method`, otp, { headers: { 'Content-Type': 'application/json' }});\r\n }\r\n\r\n public verifyCellNo(OTP: string): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/VerifyCellNo`, OTP);\r\n }\r\n\r\n public checkIDNumber(investorId: number, idNo: string): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/verify-idno?investorId=${investorId}&idNo=${idNo}`);\r\n }\r\n\r\n public putReadyToInvest(): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/PutReadyToInvest`);\r\n }\r\n\r\n public putInvestor(InvestorModel: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.put(`${this.apiPath}/PutInvestor`, InvestorModel);\r\n }\r\n\r\n public getInvestorAddressDetails(): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/get-investor-address-details`);\r\n }\r\n\r\n public updateInvestorAddressDetail(InvestorAddressDetail: Model.PlainObject): AxiosPromise {\r\n return this.axios.put(`${this.apiPath}/address-details`, InvestorAddressDetail)\r\n }\r\n\r\n public updateInvestorBankDetail(bankDetails: Model.PartialPlainObject[]): AxiosPromise {\r\n return this.axios.put(`${this.apiPath}/bank-details`, bankDetails);\r\n }\r\n\r\n public updateInvestorTaxDetail(taxDetail: Model.PlainObject): AxiosPromise {\r\n return this.axios.put(`${this.apiPath}/tax-details`, taxDetail)\r\n }\r\n\r\n public updateInvestorIdentity(command: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/investor-identity`, command);\r\n }\r\n\r\n public getInvestorOTPDetails(): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/GetInvestorOTPDetails`);\r\n }\r\n}","import { Data, Model, Utils } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport APIResponse from '../Models/APIResponse';\r\nimport { Portfolio, PortfolioReinvestDividends, PortfolioSign, PostPortfolio } from '../Models/Registration/Portfolio';\r\nimport { PortfolioBalance } from '../Models/Portfolio/PortfolioBalance';\r\nimport GraphDataCriteria from '../Models/Portfolio/GraphDataCriteria';\r\nimport { GraphData } from '../Models/Portfolio/GraphData';\r\n\r\nexport interface IPortfolioApiClient {\r\n\r\n /**\r\n * Returns a single Portfolio based on the PortfolioTypeID supplied.\r\n */\r\n getPortfolio(PortfolioTypeID: number): AxiosPromise>;\r\n\r\n /**\r\n * Returns all Portfolios for the Logged in Investor.\r\n */\r\n getPortfolioList(): AxiosPromise>>;\r\n\r\n /**\r\n * Creates a new Portfolio of the Portfolio Type specified in the request.\r\n */\r\n postPortfolio(Model: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /**\r\n * Sets the terms and conditions date on an existing portfolio.\r\n */\r\n putPortfolioSign(Model: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /** \r\n * This method will set the Reinvest dividends indicator\r\n */\r\n reinvestDividends(Model: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /**\r\n * Creates a new Portfolio of the Portfolio Type specified in the request.\r\n * And then populates the portfolio's Terms Accepted Date.\r\n */\r\n portfolioOpenAndSign(model: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /**\r\n * Method used to create new portfolio for an investor.\r\n */\r\n portfolioOpen(PortfolioSign: Model.PlainObject): AxiosPromise>;\r\n\r\n /**\r\n * Returns the specified Portfolio's balance from Global based on the PortfolioTypeID supplied.\r\n */\r\n getPortfolioBalance(portfolioTypeId: number): AxiosPromise>;\r\n\r\n getGraphData(portfolioTypeId: number, criteria: Model.PartialPlainNonTrackedObject): AxiosPromise>;\r\n\r\n /**\r\n * Creates a new Portfolio of the Portfolio Type specified in the request.\r\n */\r\n signPortfolio(RequiresInvestmentAdvice: boolean): AxiosPromise>;\r\n}\r\n\r\n@injectable()\r\nexport default class PortfolioApiClient extends Data.ApiClientBase implements IPortfolioApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/portfolio`);\r\n }\r\n\r\n public getPortfolio(PortfolioTypeID: number): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}?PortfolioTypeID=${PortfolioTypeID}`);\r\n }\r\n\r\n public getPortfolioList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/portfolio-list`);\r\n }\r\n\r\n public postPortfolio(Model: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}`, Model);\r\n }\r\n\r\n public putPortfolioSign(Model: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/sign`, Model);\r\n }\r\n\r\n public reinvestDividends(Model: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.put(`${this.apiPath}/reinvest`, Model);\r\n }\r\n\r\n public portfolioOpenAndSign(model: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/open-signed`, model);\r\n }\r\n\r\n public portfolioOpen(PortfolioSign: Model.PlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/open-portfolio`, PortfolioSign)\r\n }\r\n\r\n public getPortfolioBalance(portfolioTypeId: number): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/balance/${portfolioTypeId}`);\r\n }\r\n\r\n public getGraphData(portfolioTypeId: number, criteria: Model.PartialPlainNonTrackedObject): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/graph-data/${portfolioTypeId}?${Utils.getQueryString(criteria)}`);\r\n }\r\n\r\n public signPortfolio(RequiresInvestmentAdvice: boolean): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/sign-portfolio?RequiresInvestmentAdvice=${RequiresInvestmentAdvice}`)\r\n }\r\n}","import { Data, ITaskRunner } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\n\r\nimport { DocumentType } from '../Models/Enums/DocumentType';\r\nimport { MaintenanceDocumentType } from '../Models/Base/Enums/MaintenanceDocumentType';\r\nimport DocumentHandler from '../Services/DocumentHandler';\r\n\r\nexport interface IDocumentApiClient {\r\n\r\n /**\r\n * Uploads an investor document.\r\n * Note: This method returns the url of the api endpoint. It performs no logic.\r\n * @returns Status.\r\n */\r\n getInvestorDocumentUploadUrl(): string;\r\n\r\n getInvestorDocument(documentType: DocumentType): AxiosPromise;\r\n\r\n /**\r\n * Method used to fetch the document from the DB\r\n */\r\n fetchMaintenanceDocument(MaintenanceDocTypeID: number): AxiosPromise;\r\n\r\n /**\r\n * Method used to fetch public maintenance document from the DB\r\n */\r\n fetchPublicMaintenanceDocument(MaintenanceDocTypeID: number): AxiosPromise;\r\n\r\n getInstrumentProviderImageUrl(instrumentProviderId: number): string;\r\n\r\n /**\r\n * Method used to fetch investor document by ID\r\n */\r\n getInvestorDocumentById(documentID: number): AxiosPromise;\r\n \r\n // Client only\r\n\r\n readonly allowedInvestorDocumentExtensions: string[];\r\n\r\n downloadMaintenanceDocument(maintenanceDocumentType: MaintenanceDocumentType, taskRunner: ITaskRunner): Promise;\r\n\r\n getTradeDebitOrderMandateDocument(contractNo: string, selfLink: string): AxiosPromise;\r\n}\r\n\r\n@injectable()\r\nexport default class DocumentApiClient extends Data.ApiClientBase implements IDocumentApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/Document`);\r\n }\r\n\r\n public fetchMaintenanceDocument(MaintenanceDocTypeID: number): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}/maintenance-document?MaintenanceDocTypeID=${MaintenanceDocTypeID}`, { responseType: \"arraybuffer\" });\r\n }\r\n\r\n public fetchPublicMaintenanceDocument(MaintenanceDocTypeID: number): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}/public-maintenance-document?MaintenanceDocTypeID=${MaintenanceDocTypeID}`, { responseType: \"arraybuffer\" });\r\n }\r\n\r\n public getInvestorDocumentUploadUrl(): string {\r\n return `${this.apiPath}/investor-document`;\r\n }\r\n\r\n public getInvestorDocument(documentType: DocumentType): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}/investor-document?documentType=${documentType}`, { responseType: \"blob\" });\r\n }\r\n\r\n public getInstrumentProviderImageUrl(instrumentProviderId: number) {\r\n return `${this.apiPath}/instrument-provider-image?instrumentProviderId=${instrumentProviderId}`;\r\n }\r\n\r\n public getInvestorDocumentById(documentID: number): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}/investor-document?documentID=${documentID}`, {responseType: \"arraybuffer\"});\r\n }\r\n\r\n public getTradeDebitOrderMandateDocument(contractNo: string, selfLink: string): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}/investor-document?ContractNo=${encodeURIComponent(contractNo)}&SelfLink=${encodeURIComponent(selfLink)}`, {responseType: \"arraybuffer\"});\r\n }\r\n\r\n // Client only\r\n\r\n public get allowedInvestorDocumentExtensions() {\r\n return [\".jpg\", \".jpeg\", \".pdf\"];\r\n }\r\n\r\n public async downloadMaintenanceDocument(maintenanceDocumentType: MaintenanceDocumentType, taskRunner: ITaskRunner) {\r\n const result = await taskRunner.waitFor(this.fetchMaintenanceDocument(maintenanceDocumentType));\r\n DocumentHandler.convertAndDownloadDocument(result, true);\r\n }\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport APIResponse from '../Models/APIResponse';\r\nimport PoliticalSensitivity from '../Models/Base/PoliticalSensitivity';\r\n\r\nexport interface IPoliticalSensitivityApiClient {\r\n\r\n /**\r\n * Method fetch the investors political sensitivity.\r\n */\r\n getInvestorPoliticalSensitivity(): AxiosPromise>;\r\n\r\n /**\r\n * Method to save the investors political sensitivity.\r\n */ \r\n saveInvestorPoliticalSensitivity(PoliticalSensitivity: Model.PlainObject): AxiosPromise>;\r\n\r\n}\r\n\r\n@injectable()\r\nexport default class PoliticalSensitivityApiClient extends Data.ApiClientBase implements IPoliticalSensitivityApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/political-sensitivity`);\r\n }\r\n\r\n public getInvestorPoliticalSensitivity(): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}`)\r\n }\r\n\r\n public saveInvestorPoliticalSensitivity(PoliticalSensitivity: Model.PlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}`, PoliticalSensitivity)\r\n }\r\n\r\n}","import { Data, List, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport Province from '../Models/Catalogue/Province';\r\n\r\nexport interface IProvinceApiClient {\r\n\r\n /**\r\n * Method fetch the provinces.\r\n */\r\n getProvinceList(): AxiosPromise>>;\r\n}\r\n\r\n@injectable()\r\nexport default class ProvinceApiClient extends Data.ApiClientBase implements IProvinceApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/province`);\r\n }\r\n\r\n public getProvinceList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}`)\r\n }\r\n\r\n}","import { Data, List, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport Bank from '../Models/Catalogue/Bank';\r\n\r\nexport interface IBankApiClient {\r\n\r\n /**\r\n * Method fetch the banks.\r\n */\r\n getBankList(): AxiosPromise>>;\r\n\r\n}\r\n\r\n@injectable()\r\nexport default class BankApiClient extends Data.ApiClientBase implements IBankApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/bank`);\r\n }\r\n\r\n\r\n public getBankList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}`)\r\n }\r\n\r\n}","import { Data, List, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport BankAccountType from '../Models/Catalogue/BankAccountType';\r\n\r\nexport interface IBankAccountTypeApiClient {\r\n\r\n /**\r\n * Method fetch the bank account types.\r\n */\r\n getBankAccountTypeList(): AxiosPromise>>;\r\n\r\n}\r\n\r\n@injectable()\r\nexport default class BankAccountTypeApiClient extends Data.ApiClientBase implements IBankAccountTypeApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/bank-account-type`);\r\n }\r\n\r\n\r\n public getBankAccountTypeList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}`)\r\n }\r\n\r\n}","import { Data, List, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport Types from '../AppTypes';\r\nimport { AppService } from '../Services/AppService';\r\nimport Country from '../Models/Catalogue/Country';\r\n\r\nexport interface ICountryApiClient {\r\n\r\n /**\r\n * Method fetch the countries.\r\n */\r\n getCountryList(): AxiosPromise>>;\r\n\r\n}\r\n\r\n@injectable()\r\nexport default class CountryApiClient extends Data.ApiClientBase implements ICountryApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/country`);\r\n }\r\n\r\n public getCountryList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}`)\r\n }\r\n\r\n}","import { Attributes, LookupBase, NeoModel } from '@singularsystems/neo-core';\r\n\r\n@NeoModel\r\nexport default class InvestorFicaStatusLookup extends LookupBase {\r\n\r\n public investorID: number = 0;\r\n\r\n @Attributes.Integer()\r\n public identityStatus: number = 0;\r\n\r\n @Attributes.Integer()\r\n public addressStatus: number = 0;\r\n\r\n @Attributes.Integer()\r\n public taxStatus: number = 0;\r\n\r\n @Attributes.Integer()\r\n public bankDetailsStatus: number | null = null;\r\n\r\n @Attributes.Integer()\r\n public thirdPartyBankDetailsStatus: number | null = null;\r\n\r\n public identityFailedReason: string = \"\";\r\n\r\n public addressFailedReason: string = \"\";\r\n\r\n public taxFailedReason: string = \"\";\r\n}","import { NeoModel, Utils, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class InvestorDocument extends ApiModelBase {\r\n\r\n public guid: string = Utils.emptyGuid();\r\n\r\n public documentID: number = 0;\r\n\r\n public documentTypeID: number = 0;\r\n\r\n public documentName: string = \"\";\r\n \r\n public portfolioTypeID: number | null = null\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.guid) {\r\n return \"New investor document\";\r\n } else {\r\n return this.guid;\r\n }\r\n }\r\n}","import { Attributes, FileUtils, List, NeoModel } from '@singularsystems/neo-core';\r\nimport { Views } from '@singularsystems/neo-react';\r\nimport { InfoPanelController } from '../../App/Components/InfoPanel';\r\nimport AppInvestorData from '../../Models/Investors/AppInvestorData';\r\nimport StatementCriteria from '../../Models/Portfolio/StatementCriteria';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport InvestorDocument from '../../Models/Investors/InvestorDocument';\r\n\r\n@NeoModel\r\nexport default class DocumentPanelVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n public readonly appInvestorData: AppInvestorData,\r\n taskRunner = AppService.get(Types.Neo.TaskRunner),\r\n private statementApiClient = AppService.get(Types.ApiClients.StatementApiClient),\r\n public documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient),\r\n public investorDocumentApiClient = AppService.get(Types.ApiClients.InvestorDocumentApiClient)) {\r\n super(taskRunner);\r\n }\r\n\r\n public panelController = new InfoPanelController();\r\n\r\n public statementCriteria = new StatementCriteria();\r\n\r\n public downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n\r\n @Attributes.Display(\"Investment Type\")\r\n public selectedPortfolioType: number = 0;\r\n\r\n public taxCertificates = new List(InvestorDocument);\r\n\r\n get taxCertificateListByPortfolio() {\r\n return this.taxCertificates.filter(c => c.portfolioTypeID === this.selectedPortfolioType);\r\n }\r\n\r\n public async viewTaxCertificates() {\r\n var result = await this.downloadTask.waitFor(this.investorDocumentApiClient.getTaxCertificates());\r\n\r\n this.taxCertificates.set(result.data);\r\n this.panelController.forward(\"TaxCertificate\");\r\n }\r\n\r\n public beginViewStatement() {\r\n if (this.appInvestorData.investor?.portfolioList.length === 1) {\r\n this.statementCriteria.portfolioTypeId = this.appInvestorData.investor.portfolioList[0].portfolioTypeID;\r\n }\r\n this.panelController.forward(\"Statement\");\r\n }\r\n\r\n public async downloadStatement() {\r\n const response = await this.downloadTask.waitFor(this.statementApiClient.getStatementDocument(this.statementCriteria.toQueryObject()));\r\n\r\n FileUtils.showSaveFile(response.data, response.headers['x_filename']);\r\n }\r\n\r\n public async downloadTaxCertificate(documentID: number) {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getInvestorDocumentById(documentID));\r\n\r\n FileUtils.showSaveFile(response);\r\n }\r\n}","import { Attributes, ModelBase, NeoModel } from \"@singularsystems/neo-core\";\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport InvestorLookup from './InvestorLookup';\r\nimport { RegistrationState } from '../Registration/Enums/RegistrationState';\r\nimport AccountInformationVM from \"../../Views/InformationPanel/AccountInformationVM\";\r\nimport InvestorLinkedPortfolioLookup from \"./InvestorLinkedPortfolioLookup\";\r\nimport InvestorFicaStatusLookup from \"./InvestorFicaStatusLookup\";\r\nimport DocumentPanelVM from \"../../Views/InformationPanel/DocumentPanelVM\";\r\n\r\n@NeoModel\r\nexport default class AppInvestorData extends ModelBase {\r\n\r\n constructor(\r\n public investorId: number,\r\n private investorQueryApiClient = AppService.get(Types.ApiClients.InvestorQueryApiClient)) {\r\n\r\n super();\r\n\r\n this.accountInformationVM = new AccountInformationVM(investorId, this);\r\n this.documentsVM = new DocumentPanelVM(this);\r\n }\r\n\r\n private _investor: InvestorLookup | null = null;\r\n\r\n public selectedPortfolio: InvestorLinkedPortfolioLookup | null = null;\r\n\r\n private _ficaStatuses: InvestorFicaStatusLookup | null = null;\r\n\r\n public readonly accountInformationVM: AccountInformationVM;\r\n\r\n public readonly documentsVM: DocumentPanelVM;\r\n\r\n /**\r\n * Returns the current investor. May return null, and fetch the investor.\r\n */\r\n public get investor(): InvestorLookup | null {\r\n if (!this._investor) {\r\n this.fetchInvestor();\r\n }\r\n return this._investor;\r\n }\r\n\r\n public set investor(investor: InvestorLookup | null) {\r\n this._investor = investor;\r\n\r\n if (investor) {\r\n const selectedPortfolioTypeJSON = sessionStorage.getItem('selectedPortfolioTypeID');\r\n\r\n if (selectedPortfolioTypeJSON) {\r\n this.selectedPortfolio = investor.portfolioList.find(c => c.portfolioTypeID === Number(selectedPortfolioTypeJSON))!;\r\n sessionStorage.removeItem('selectedPortfolioTypeID');\r\n }\r\n\r\n if (!this.selectedPortfolio) {\r\n this.selectedPortfolio = investor.portfolioList.find(c => c.isPrimary) ?? investor.portfolioList[0] ?? null;\r\n }\r\n } else {\r\n this.selectedPortfolio = null;\r\n }\r\n }\r\n\r\n public get ficaStatuses() {\r\n if (!this._ficaStatuses) {\r\n this.fetchFicaInfo();\r\n }\r\n return this._ficaStatuses;\r\n }\r\n\r\n public clearFicaStatuses() {\r\n this._ficaStatuses = null;\r\n }\r\n\r\n public get mustCompleteRegistration() {\r\n return !this._investor || this._investor.investorStatusID < RegistrationState.Mandate;\r\n }\r\n\r\n public get readyToInvest() {\r\n return this._investor && this._investor.investorStatusID === RegistrationState.AccountCreated;\r\n }\r\n\r\n public async getInvestorAsync() {\r\n const investor = this.investor;\r\n if (investor !== null) {\r\n return Promise.resolve(this._investor!);\r\n } else {\r\n await this.investorPromise;\r\n return this.investor!;\r\n }\r\n }\r\n\r\n public async getFicaStatusesAsync() {\r\n const ficaStatuses = this.ficaStatuses;\r\n if (ficaStatuses !== null) {\r\n return Promise.resolve(this._ficaStatuses);\r\n } else {\r\n await this.ficaStatusPromise;\r\n return this.ficaStatuses;\r\n }\r\n }\r\n\r\n public dispose() {\r\n this.accountInformationVM.dispose();\r\n }\r\n\r\n @Attributes.Observable(false)\r\n private investorPromise: Promise | null = null;\r\n\r\n private async fetchInvestor() {\r\n if (!this.investorPromise) {\r\n this.investorPromise = this.investorQueryApiClient.getInvestorLookup();\r\n const result = await this.investorPromise;\r\n\r\n this.investor = InvestorLookup.fromJSObject(result.data);\r\n this.investorPromise = null;\r\n }\r\n\r\n return this._investor;\r\n }\r\n\r\n @Attributes.Observable(false)\r\n private ficaStatusPromise: Promise | null = null;\r\n\r\n private async fetchFicaInfo() {\r\n if (!this.ficaStatusPromise) {\r\n this.ficaStatusPromise = this.investorQueryApiClient.getFicaStatus();\r\n const result = await this.ficaStatusPromise;\r\n\r\n this._ficaStatuses = InvestorFicaStatusLookup.fromJSObject(result.data);\r\n this.ficaStatusPromise = null;\r\n }\r\n\r\n return this._ficaStatuses;\r\n }\r\n\r\n public refetchInvestor() {\r\n this.fetchInvestor();\r\n }\r\n}","import { Attributes, Misc, NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class Distribution extends APIModelBase {\r\n\r\n public policyNo: string = \"\";\r\n\r\n public transactionType: string = \"\";\r\n\r\n @Attributes.Date(Misc.TimeZoneFormat.None)\r\n public settlementDate: Date | null = null;\r\n\r\n public instrumentName: string = \"\";\r\n\r\n public instrumentCode: string = \"\";\r\n\r\n @Attributes.Float()\r\n public amount: number = 0;\r\n\r\n @Attributes.Float()\r\n public withholdingTax: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.policyNo) {\r\n return \"New distribution\";\r\n } else {\r\n return this.policyNo;\r\n }\r\n }\r\n}","import { Attributes, List, LookupBase, NeoModel } from '@singularsystems/neo-core';\r\nimport GraphDataCriteria from './GraphDataCriteria';\r\n\r\n@NeoModel\r\nexport class GraphData extends LookupBase {\r\n\r\n @Attributes.ChildObject(GraphDataCriteria)\r\n public criteria: GraphDataCriteria | null = null;\r\n\r\n public totals = new List(TimeValue);\r\n\r\n public instruments = new List(InstrumentSeries);\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@NeoModel\r\nexport class TimeValue extends LookupBase {\r\n\r\n @Attributes.Date()\r\n public valueDate: Date = new Date();\r\n\r\n @Attributes.Float()\r\n public price: number = 0;\r\n\r\n @Attributes.Float()\r\n public value: number = 0;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@NeoModel\r\nexport class InstrumentSeries extends LookupBase {\r\n\r\n public instrumentCode: string = \"\";\r\n\r\n public instrumentName: string = \"\";\r\n\r\n public assetClassId: number | null = null;\r\n\r\n public regionId: number | null = null;\r\n\r\n public values = new List(TimeValue);\r\n\r\n // Client only properties / methods\r\n}\r\n\r\nexport interface IGraphData {\r\n title: string;\r\n\r\n seriesData: IGraphSeries[];\r\n}\r\n\r\nexport interface IGraphSeries {\r\n seriesName?: string;\r\n\r\n values: TimeValue[];\r\n}","import { Attributes, List, NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport class PortfolioBalance extends ApiModelBase {\r\n\r\n public portfolioID: number = 0;\r\n\r\n public portfolioTypeID: number = 0;\r\n\r\n public taxFreeInd: boolean = false;\r\n\r\n @Attributes.Float()\r\n public cashAvailable: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public cashReserved: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public totalBalance: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public availableBalance: number = 0.0;\r\n\r\n @Rules.Required()\r\n @Attributes.Date()\r\n public valuationDate: Date | null = null;\r\n\r\n @Attributes.Float()\r\n public pendingBalance: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public irr: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public netContributions: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public currentTaxYearContributions: number = 0.0;\r\n\r\n public instruments = new List(PortfolioInstrumentBalance);\r\n\r\n // Client only properties / methods\r\n\r\n public get hasInvestments() {\r\n return this.cashAvailable > 0 || this.instruments.length > 0;\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew) {\r\n return \"New portfolio balance\";\r\n } else {\r\n return \"Portfolio Balance\";\r\n }\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class PortfolioInstrumentBalance extends ApiModelBase {\r\n\r\n public instrument: string = \"\";\r\n\r\n public instrumentID: number = 0;\r\n\r\n public instrumentCode: string = \"\";\r\n\r\n @Attributes.Float()\r\n public price: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public unitsAvailable: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public unitsTotal: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public unitsReserved: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public valueTotal: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public valueReserved: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public valueAvailable: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public valueAccrued: number = 0.0;\r\n\r\n @Rules.Required()\r\n @Attributes.Date()\r\n public priceDate: Date | null = null;\r\n\r\n @Attributes.Float()\r\n public unitsPending: number = 0.0;\r\n\r\n @Attributes.Float()\r\n public valuePending: number = 0.0;\r\n\r\n public hasTradeCosts: boolean = false;\r\n\r\n @Attributes.Nullable()\r\n public assetClassId: number | null = null;\r\n\r\n @Attributes.Nullable()\r\n public regionId: number | null = null;\r\n\r\n public instrumentProviderId: number | null = null;\r\n\r\n public isCashInstrument: boolean = false;\r\n\r\n public isTradeable: boolean = true;\r\n\r\n public isModelPortfolio: boolean = false;\r\n\r\n public hasGraphDataAvailable: boolean = true;\r\n\r\n public underlyingInstrumentsCount: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n public get valueInclPending() {\r\n return this.valueTotal + this.valuePending;\r\n }\r\n\r\n public get availableValueInclPending() {\r\n return this.valueAvailable + this.valuePending;\r\n }\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.instrument) {\r\n return \"New portfolio instrument balance\";\r\n } else {\r\n return this.instrument;\r\n }\r\n }\r\n}","import { Attributes, ITaskRunner, List, ModelBase, NeoModel } from '@singularsystems/neo-core';\r\nimport { IPopoverMenuItem } from '../../App/Components/PopoverButton';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport Instrument from '../Instruments/Instrument';\r\nimport PortfolioCatalogue from '../Catalogue/PortfolioCatalogue';\r\nimport InvestorLinkedPortfolioLookup from '../Investors/InvestorLinkedPortfolioLookup';\r\nimport Distribution from '../Reporting/Distribution';\r\nimport { GraphData, IGraphData, IGraphSeries, TimeValue } from './GraphData';\r\nimport GraphDataCriteria, { TimeRange } from './GraphDataCriteria';\r\nimport { PortfolioBalance } from './PortfolioBalance';\r\nimport { IValueByClass } from './ValueByClass';\r\n\r\n@NeoModel\r\nexport default class AppPortfolioData extends ModelBase {\r\n\r\n constructor(public portfolio: InvestorLinkedPortfolioLookup,\r\n private portfolioApiClient = AppService.get(Types.ApiClients.PortfolioApiClient),\r\n private reportingApiClient = AppService.get(Types.ApiClients.ReportingApiClient),\r\n private instrumentApiClient = AppService.get(Types.ApiClients.InstrumentApiClient),\r\n private appCache = AppService.get(Types.Services.AppDataCache)) {\r\n super();\r\n }\r\n\r\n private _portfolioBalance: PortfolioBalance | null = null;\r\n private _distributions = new List(Distribution);\r\n private _hasFetchedDistributions: boolean = false;\r\n private _hasFetchedInstruments: boolean = false;\r\n private _instruments = new List(Instrument);\r\n\r\n private portfolioCatalogue: PortfolioCatalogue | null = null;\r\n\r\n @Attributes.Observable(false)\r\n private portfolioBalancePromise: Promise | null = null;\r\n @Attributes.Observable(false)\r\n private distributionPromise: Promise | null = null;\r\n\r\n public get portfolioBalance() {\r\n if (!this._portfolioBalance) {\r\n this.fetchPortfolio();\r\n }\r\n return this._portfolioBalance;\r\n }\r\n\r\n public async getPortfolioAsync() {\r\n const balance = this.portfolioBalance;\r\n if (balance !== null) {\r\n return Promise.resolve(this._portfolioBalance!);\r\n } else {\r\n await this.portfolioBalancePromise;\r\n return this.portfolioBalance!;\r\n }\r\n }\r\n\r\n public get distributions() {\r\n if (!this._hasFetchedDistributions) {\r\n this.fetchDistributions();\r\n }\r\n return this._distributions;\r\n }\r\n\r\n public resetPortfolioData() {\r\n this._portfolioBalance = null;\r\n }\r\n\r\n private async fetchPortfolio() {\r\n if (!this.portfolioBalancePromise) {\r\n this.portfolioBalancePromise = this.portfolioApiClient.getPortfolioBalance(this.portfolio.portfolioTypeID);\r\n this.initialise();\r\n const result = await this.portfolioBalancePromise;\r\n\r\n this._portfolioBalance = PortfolioBalance.fromJSObject(result.data);\r\n this.portfolioBalancePromise = null;\r\n }\r\n\r\n return this._portfolioBalance;\r\n }\r\n\r\n private async fetchDistributions() {\r\n if (!this.distributionPromise) {\r\n this.distributionPromise = this.reportingApiClient.getDistributionList(this.portfolio.portfolioType);\r\n const result = await this.distributionPromise;\r\n\r\n this._distributions.set(result.data);\r\n this._hasFetchedDistributions = true;\r\n this.distributionPromise = null;\r\n }\r\n\r\n return this._distributions;\r\n }\r\n\r\n private async initialise() {\r\n this.portfolioCatalogue = await this.appCache.getPortfolioCatalogue();\r\n this.graphData = await this.fetchGraphData();\r\n this.fetchInstruments();\r\n }\r\n\r\n // Pie chart\r\n\r\n public get assetAllocationByClass(): IValueByClass[] | null {\r\n const balance = this.portfolioBalance;\r\n if (balance && this.portfolioCatalogue) {\r\n\r\n const allocations = balance.instruments.groupBy(c => `${c.assetClassId ?? 0} ${c.regionId ?? 0}`, (k, i, d) => {\r\n\r\n const assetClass = this.portfolioCatalogue!.assetClasses.find(c => c.assetClassID === i.assetClassId) ?? \"\";\r\n const region = this.portfolioCatalogue!.regions.find(c => c.regionID === i.regionId) ?? \"\";\r\n\r\n return {\r\n assetClass: (assetClass && region) ? `${region} ${assetClass}` : \"Uncategorised\",\r\n value: d.sum(c => c.valueTotal)\r\n };\r\n });\r\n\r\n if (balance.cashAvailable > 0) {\r\n allocations.push({ assetClass: \"Cash\", value: balance.cashAvailable });\r\n }\r\n\r\n return allocations.sortBy(c => c.value, \"desc\");\r\n }\r\n return null;\r\n }\r\n\r\n // Line chart\r\n\r\n public graphCriteria = new GraphDataCriteria();\r\n public graphData: GraphData | null = null;\r\n public graphTask = AppService.get(Types.Neo.TaskRunner);\r\n\r\n public async fetchGraphData(taskRunner?: ITaskRunner, criteria?: GraphDataCriteria) {\r\n let graphCriteria = criteria ?? this.graphCriteria, \r\n graphTask = taskRunner ?? this.graphTask\r\n\r\n const result = await graphTask.waitFor(this.portfolioApiClient.getGraphData(this.portfolio.portfolioTypeID, graphCriteria.toQueryObject()));\r\n \r\n if (result.data) {\r\n return GraphData.fromJSObject(result.data);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public async setLineGraphTimeRange(timeRange: TimeRange) {\r\n if (timeRange !== this.graphCriteria.timeRange) {\r\n this.graphCriteria.timeRange = timeRange;\r\n this.graphData = await this.fetchGraphData();\r\n }\r\n }\r\n\r\n public get graphSeriesOptions(): IPopoverMenuItem[] {\r\n const menuItems: IPopoverMenuItem[] = [];\r\n menuItems.push({ text: \"Summary\", onClick: () => this.graphCriteria.seriesId = \"\" });\r\n menuItems.push({ text: \"By Asset Class\", onClick: () => this.graphCriteria.seriesId = \"ByClass\" });\r\n\r\n if (this.graphData) {\r\n for (let instrument of this.graphData.instruments) {\r\n menuItems.push({ text: instrument.instrumentName, onClick: () => this.graphCriteria.seriesId = instrument.instrumentCode });\r\n }\r\n }\r\n\r\n if (menuItems.length > 2) {\r\n menuItems[2].isDivider = true;\r\n }\r\n\r\n return menuItems;\r\n }\r\n\r\n public getGraphData(seriesId: string, graphData?: GraphData): IGraphData | null {\r\n let _graphData = graphData ?? this.graphData;\r\n\r\n if (_graphData) {\r\n if (seriesId && _graphData) {\r\n if (seriesId === \"ByClass\") {\r\n return this.lineChartByClass;\r\n }\r\n const instrument = _graphData.instruments.find(c => c.instrumentCode === seriesId);\r\n if (instrument) {\r\n return { title: instrument.instrumentName, seriesData: [{ values: instrument.values }] };\r\n } else {\r\n return null;\r\n }\r\n }\r\n return { title: \"Summary\", seriesData: [{ values: _graphData.totals }] };\r\n }\r\n return null;\r\n }\r\n\r\n public async getGraphDataForInstrument(taskRunner: ITaskRunner, criteria: GraphDataCriteria) {\r\n let graphData = await this.fetchGraphData(taskRunner, criteria);\r\n\r\n if (graphData) {\r\n return this.getGraphData(criteria.seriesId, graphData);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private get lineChartByClass(): IGraphData {\r\n const data = this.graphData!;\r\n\r\n const byClass = data.instruments.groupBy(c => `${c.assetClassId ?? 0} ${c.regionId ?? 0}`, (k, i, d) => {\r\n\r\n const assetClass = this.portfolioCatalogue!.assetClasses.find(c => c.assetClassID === i.assetClassId) ?? \"\";\r\n const region = this.portfolioCatalogue!.regions.find(c => c.regionID === i.regionId) ?? \"\";\r\n\r\n const allValues = new Map();\r\n\r\n for (let instrument of d) {\r\n for (let point of instrument.values) {\r\n const timeValue = allValues.getOrAdd!(point.valueDate.getTime(), k => {\r\n const timeValue = new TimeValue();\r\n timeValue.valueDate = new Date(k);\r\n return timeValue;\r\n });\r\n timeValue.value += point.value;\r\n }\r\n }\r\n\r\n return {\r\n seriesName: (assetClass && region) ? `${region} ${assetClass}` : \"Uncategorised\",\r\n values: Array.from(allValues.values()).sortBy(c => c.valueDate.getTime())\r\n } as IGraphSeries;\r\n });\r\n\r\n return { title: \"By Asset Class\", seriesData: byClass.sortBy(c => c.values[c.values.length - 1].value, \"desc\") };\r\n }\r\n\r\n public async fetchInstruments() {\r\n if (!this._hasFetchedInstruments) {\r\n const results = await this.instrumentApiClient.getTradeableInstrumentList(this.portfolio.portfolioTypeID);\r\n\r\n this._instruments.set(results.data);\r\n this._hasFetchedInstruments = true;\r\n }\r\n\r\n return this._instruments;\r\n }\r\n\r\n public getInstrumentName(instrumentCode: string) {\r\n return this._instruments.find(c=> c.instrumentCode === instrumentCode)?.instrumentName\r\n }\r\n}","import { Attributes, ModelBase, NeoModel } from '@singularsystems/neo-core';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from './AppService';\r\nimport { InfoPanelView } from '../Views/InformationPanel/AccountInformationVM';\r\nimport AppInvestorData from '../Models/Investors/AppInvestorData';\r\nimport AppPortfolioData from '../Models/Portfolio/AppPortfolioData';\r\n\r\n@injectable()\r\n@NeoModel\r\nexport default class CurrentInvestorService extends ModelBase {\r\n\r\n constructor(private authenticationService = AppService.get(Types.Services.AppAuthenticationService)) {\r\n super();\r\n }\r\n\r\n @Attributes.Observable(false)\r\n private _investorData: AppInvestorData | null = null;\r\n\r\n @Attributes.Observable(false)\r\n private _portfolioData: AppPortfolioData | null = null;\r\n\r\n public get investorData() {\r\n const userInvestorId = this.authenticationService.user?.investorID;\r\n if (userInvestorId) {\r\n if (this._investorData?.investorId !== userInvestorId) {\r\n this._investorData?.dispose();\r\n this._investorData = new AppInvestorData(userInvestorId);\r\n }\r\n return this._investorData;\r\n } else {\r\n return null\r\n }\r\n }\r\n\r\n public beginShowAccountInformationPanel(view?: InfoPanelView) {\r\n if (this.investorData === null) {\r\n throw Error(\"Investor is required\");\r\n }\r\n this.investorData.accountInformationVM.showInfoPanel(view ?? null);\r\n }\r\n\r\n public toggleAccountInformationPanel() {\r\n if (this.investorData?.accountInformationVM.panelController.isVisible) {\r\n this.investorData.accountInformationVM.panelController.beginHideInfoPanel();\r\n } else {\r\n this.beginShowAccountInformationPanel();\r\n }\r\n }\r\n\r\n public toggleDocumentPanel() {\r\n if (this.investorData?.documentsVM.panelController.isVisible) {\r\n this.investorData.documentsVM.panelController.beginHideInfoPanel();\r\n } else {\r\n this.investorData?.documentsVM.panelController.showInfoPanel();\r\n }\r\n }\r\n\r\n public get portfolioData() {\r\n const selectedPortfolio = this.investorData?.selectedPortfolio;\r\n if (selectedPortfolio) {\r\n if (this._portfolioData?.portfolio.portfolioID !== selectedPortfolio.portfolioID) {\r\n this._portfolioData = new AppPortfolioData(selectedPortfolio);\r\n }\r\n return this._portfolioData;\r\n }\r\n return null;\r\n }\r\n\r\n public async getPortfolioAsync() {\r\n await this.investorData!.getInvestorAsync();\r\n const portfolioData = this.portfolioData;\r\n if (portfolioData) {\r\n return await portfolioData.getPortfolioAsync();\r\n }\r\n return null;\r\n }\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport InvestorLookup from '../Models/Investors/InvestorLookup';\r\nimport InvestorFicaStatusLookup from '../Models/Investors/InvestorFicaStatusLookup';\r\n\r\nexport interface IInvestorQueryApiClient {\r\n\r\n /** \r\n * Gets investor details for the users selected investor.\r\n */\r\n getInvestorLookup(): AxiosPromise>;\r\n\r\n /** \r\n * Gets the fica status breakdown for the users selected investor.\r\n */\r\n getFicaStatus(): AxiosPromise>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class InvestorQueryApiClient extends Data.ApiClientBase implements IInvestorQueryApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/investor-query`);\r\n }\r\n\r\n public getInvestorLookup(): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/lookup`);\r\n }\r\n\r\n public getFicaStatus(): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/fica-status`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport APIModelBase from '../Library/APIModelBase';\r\n\r\n@NeoModel\r\nexport default class Strategy extends APIModelBase {\r\n\r\n public strategyID: number = 0;\r\n\r\n public strategyName: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.strategyName) {\r\n return \"New strategy\";\r\n } else {\r\n return this.strategyName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class AssetClass extends ApiModelBase {\r\n\r\n public assetClassID: number = 0;\r\n\r\n public assetClassName: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.assetClassName) {\r\n return \"New asset class\";\r\n } else {\r\n return this.assetClassName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class Region extends ApiModelBase {\r\n\r\n public regionID: number = 0;\r\n\r\n public regionName: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.regionName) {\r\n return \"New region\";\r\n } else {\r\n return this.regionName;\r\n }\r\n }\r\n}","import { NeoModel, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class InstrumentProvider extends ApiModelBase {\r\n\r\n public instrumentProviderID: number = 0;\r\n\r\n public instrumentProviderName: string = \"\";\r\n\r\n public imageID: number = 0;\r\n\r\n // Client only properties / methods\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.instrumentProviderName) {\r\n return \"New instrument provider\";\r\n } else {\r\n return this.instrumentProviderName;\r\n }\r\n }\r\n}","import { List, LookupBase, NeoModel } from '@singularsystems/neo-core';\r\nimport Strategy from './Strategy';\r\nimport AssetClass from './AssetClass';\r\nimport Region from './Region';\r\nimport InstrumentProvider from '../Instruments/InstrumentProvider';\r\n\r\n@NeoModel\r\nexport default class PortfolioCatalogue extends LookupBase {\r\n\r\n public assetClasses = new List(AssetClass);\r\n\r\n public regions = new List(Region);\r\n\r\n public instrumentProviders = new List(InstrumentProvider);\r\n\r\n public strategies = new List(Strategy);\r\n\r\n // Client only properties / methods\r\n}","import { Data } from '@singularsystems/neo-core';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport PortfolioCatalogue from '../Models/Catalogue/PortfolioCatalogue';\r\nimport TradeCost from '../Models/Base/TradeCost';\r\n\r\nexport interface ICatalogueApiClient {\r\n\r\n /**\r\n * Gets data used on the portfolio pages.\r\n */\r\n getPortfolioCatalogue(): Promise;\r\n\r\n /** \r\n * Returns all Trade Costs and Rates\r\n */\r\n getTradeCosts(): Promise;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class CatalogueApiClient extends Data.ApiClientBase implements ICatalogueApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/catalogue`);\r\n }\r\n\r\n public async getPortfolioCatalogue(): Promise {\r\n\r\n const result = await this.axios.get(`${this.apiPath}/portfolio-catalogue`);\r\n return PortfolioCatalogue.fromJSObject(result.data);\r\n }\r\n\r\n public async getTradeCosts(): Promise {\r\n\r\n const result = await this.axios.get(`${this.apiPath}/trade-costs`);\r\n return TradeCost.fromJSObject(result.data);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { injectable } from 'inversify';\r\nimport { AppService, Types } from './AppService';\r\nimport React from 'react';\r\nimport { ModalUtils } from '@singularsystems/neo-core';\r\n\r\n@injectable()\r\nexport default class OldSiteIntegration {\r\n\r\n constructor(\r\n private config = AppService.get(Types.Config),\r\n private authService = AppService.get(Types.Services.AppAuthenticationService),\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService)) {\r\n\r\n }\r\n\r\n public redirect(path: string, instrumentId: number | null = null): void {\r\n\r\n let portfolioTypeId = this.investorService.investorData?.selectedPortfolio?.portfolioTypeID ?? 0;\r\n let url = '';\r\n\r\n if (instrumentId) {\r\n url = `${this.config.oldSitePath}/#/landing-redirect?to=${encodeURIComponent(path)}&portfolioTypeId=${portfolioTypeId}&instrumentId=${instrumentId}`;\r\n } else {\r\n url = `${this.config.oldSitePath}/#/landing-redirect?to=${encodeURIComponent(path)}&portfolioTypeId=${portfolioTypeId}`;\r\n }\r\n\r\n if (this.config.isDevelopment) {\r\n\r\n // In development, the origin of the old site is different (because the port no is different).\r\n // This means the old site will not be able to access the sessionStorage of this site, so we need to pass the user info as a query parameter.\r\n url += `&auth=${encodeURIComponent(this.authService.getUserJson())}`;\r\n \r\n let modal = \r\n ModalUtils.showModal(\"Url\", \r\n
\r\n {url}\r\n
, { \r\n acceptButton: { text: \"Copy\", onClick: () => {\r\n navigator.clipboard.writeText(url);\r\n modal.close();\r\n }}\r\n });\r\n\r\n } else {\r\n window.location.href = url;\r\n }\r\n }\r\n}","import { EnumHelper, ModelBase, NeoModel, Rules } from \"@singularsystems/neo-core\";\r\nimport { OtpType } from \"../Registration/Enums/OtpType\";\r\n\r\n@NeoModel\r\nexport default class ChangeOTPPreference extends ModelBase {\r\n\r\n constructor(public newMethod: OtpType) {\r\n super();\r\n }\r\n\r\n public areYouSure: boolean = false;\r\n\r\n @Rules.Required()\r\n public otp: string = \"\";\r\n\r\n public get otpTypeViaText() {\r\n return EnumHelper.getItemMetadata(OtpType, this.newMethod).description;\r\n }\r\n}","import { Attributes, NeoModel, Rules, Validation } from '@singularsystems/neo-core';\r\nimport ApiModelBase from '../ApiModelBase';\r\n\r\n@NeoModel\r\nexport default class ChangePassword extends ApiModelBase {\r\n\r\n @Rules.Required()\r\n public oldPassword: string = \"\";\r\n\r\n @Rules.Required()\r\n public newPassword: string = \"\";\r\n\r\n // Client only properties / methods\r\n\r\n @Attributes.NoTracking()\r\n public confirmPassword: string = \"\"\r\n\r\n @Attributes.NoTracking()\r\n public passwordError: string | null = null;\r\n\r\n protected addBusinessRules(rules: Validation.Rules) {\r\n super.addBusinessRules(rules);\r\n\r\n rules.failWhen(c => !!c.newPassword && c.newPassword !== c.confirmPassword, \"Confirmation password must match new password.\").onProperties(c => c.confirmPassword);\r\n }\r\n\r\n public toString(): string {\r\n if (this.isNew || !this.oldPassword) {\r\n return \"New change password\";\r\n } else {\r\n return this.oldPassword;\r\n }\r\n }\r\n}","import { NeoModel } from \"@singularsystems/neo-core\";\r\nimport { Views } from \"@singularsystems/neo-react\";\r\nimport { injectable } from \"inversify\";\r\nimport InfoPanelController from \"../../App/Components/InfoPanel/InfoPanelController\";\r\nimport { NotificationDuration } from \"../../Models/Enums/NotificationDuration\";\r\nimport ChangeOTPPreference from \"../../Models/Security/ChangeOTPPreference\";\r\nimport ChangePassword from \"../../Models/Security/ChangePassword\";\r\nimport AppLayout from \"../../Services/AppLayout\";\r\nimport { AppService, Types } from \"../../Services/AppService\";\r\n\r\n@injectable()\r\n@NeoModel\r\nexport default class UserInformationVM extends Views.ViewModelBase {\r\n\r\n constructor(\r\n private authService = AppService.get(Types.Services.AppAuthenticationService),\r\n private globalNotifications = AppService.get(Types.Neo.UI.GlobalNotifications),\r\n private apiClient = AppService.get(Types.ApiClients.SecurityApiClient),\r\n private investorApiClient = AppService.get(Types.ApiClients.InvestorApiClient)) {\r\n super();\r\n }\r\n\r\n public userInfoPanelController = new InfoPanelController();\r\n \r\n public passwordDetails: ChangePassword | null = null;\r\n\r\n public get userInfo() {\r\n return this.authService.user?.userInfo;\r\n }\r\n\r\n // Password\r\n\r\n public beginChangePassword() {\r\n this.passwordDetails = new ChangePassword();\r\n this.userInfoPanelController.forward(\"PasswordDetails\");\r\n }\r\n\r\n public changePassword() {\r\n this.passwordDetails!.passwordError = null;\r\n\r\n AppLayout.globalTaskRunner!.run(async () => {\r\n\r\n const result = await this.apiClient.changePassword(this.passwordDetails!.toJSObject());\r\n if (result.data) {\r\n this.passwordDetails!.passwordError = result.data;\r\n } else {\r\n this.globalNotifications.addSuccess(\"Password Changed Successfully\", \"\", NotificationDuration.Standard);\r\n this.passwordDetails = null;\r\n this.userInfoPanelController.beginHideInfoPanel();\r\n }\r\n });\r\n }\r\n\r\n // OTP Preference\r\n\r\n public otpChangeDetails: ChangeOTPPreference | null = null;\r\n\r\n public beginChangeOTPPreference() {\r\n if (this.userInfo?.pendingOtpType) {\r\n this.otpChangeDetails = new ChangeOTPPreference(this.userInfo.pendingOtpType);\r\n this.userInfoPanelController.forward(\"ChangeOTPPreference\");\r\n }\r\n }\r\n\r\n public confirmChangeOTPPreference() {\r\n this.investorApiClient.beginChangeOTPMethod(this.otpChangeDetails!.newMethod);\r\n this.otpChangeDetails!.areYouSure = true;\r\n }\r\n\r\n public endChangeOTPPreference() {\r\n this.taskRunner.run(async () => {\r\n const result = await this.investorApiClient.endChangeOTPMethod(this.otpChangeDetails!.otp);\r\n if (result.data === \"Success\") {\r\n this.userInfo!.otpType = this.otpChangeDetails!.newMethod;\r\n this.userInfo!.pendingOtpType = null;\r\n this.userInfoPanelController.back(\"Home\");\r\n\r\n this.globalNotifications.addSuccess(\"OTP Preference\", \"Your OTP send method has been changed.\", NotificationDuration.Standard);\r\n } else {\r\n\r\n this.globalNotifications.addDanger(\"OTP Preference\", result.data, NotificationDuration.Long);\r\n }\r\n });\r\n }\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport FAQ from '../Models/Base/FAQ';\r\n\r\nexport interface IFAQApiClient {\r\n\r\n /** \r\n * Returns all Frequently asked questions\r\n */\r\n getFAQList(): AxiosPromise>>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class FAQApiClient extends Data.ApiClientBase implements IFAQApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/FAQ`);\r\n }\r\n\r\n public getFAQList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model, Utils } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport StatementCriteria from '../Models/Portfolio/StatementCriteria';\r\n\r\nexport interface IStatementApiClient {\r\n\r\n /** \r\n * Requests a statement from Global and returns the Statement as a Byte Array.\r\n */\r\n getStatementDocument(criteria: Model.PartialPlainNonTrackedObject): AxiosPromise;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class StatementApiClient extends Data.ApiClientBase implements IStatementApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/Statement`);\r\n }\r\n\r\n public getStatementDocument(criteria: Model.PartialPlainNonTrackedObject): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}?${Utils.getQueryString(criteria)}`, { responseType: \"blob\" });\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport { DebitOrderDays, RecurringTradeRequest, RecurringTradeRequestCancel, RecurringTradeRequestPost, TAUDebitOrder } from '../Models/Base/RecurringTradeRequest';\r\n\r\nexport interface IRecurringTradeRequestApiClient extends Data.IReadApiClient {\r\n\r\n /**\r\n * Returns a list of all recurring trade requests for the specified PortfolioTypeID.\r\n */\r\n getRecurringTradeRequestDetails(portfolioTypeID: number): AxiosPromise>;\r\n\r\n /**\r\n * Inserts or Updates the recurring trade request.\r\n */\r\n postRecurringTradeRequest(model: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /**\r\n * This method cancels the recurring Trade requests\r\n */\r\n cancelRecurringTradeRequest(model: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /**\r\n * Returns all Debit Order Days\r\n */\r\n getDebitOrderDaysList(): AxiosPromise>>;\r\n\r\n /** \r\n * Returns historical debit orders\r\n */\r\n getHistoricalDebitOrderList(PortfolioTypeID: number): AxiosPromise>>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class RecurringTradeRequestApiClient extends Data.ReadApiClient implements IRecurringTradeRequestApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/debit-orders`);\r\n }\r\n\r\n public getRecurringTradeRequestDetails(portfolioTypeID: number): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}?portfolioTypeID=${portfolioTypeID}`);\r\n }\r\n\r\n public postRecurringTradeRequest(model: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/create`, model);\r\n }\r\n\r\n public cancelRecurringTradeRequest(model: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/cancel`, model);\r\n }\r\n\r\n public getDebitOrderDaysList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/allowed-days`);\r\n }\r\n\r\n public getHistoricalDebitOrderList(portfolioTypeID: number): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/historical-debit-orders?PortfolioTypeID=${portfolioTypeID}`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { ModelBase, NeoModel } from \"@singularsystems/neo-core\";\r\nimport { injectable } from \"inversify\";\r\nimport InvestorOTPDetails from \"../Models/Investors/InvestorOTPDetails\";\r\nimport { AppService, Types } from \"./AppService\";\r\n\r\n@injectable()\r\n@NeoModel\r\nexport default class OtpService extends ModelBase {\r\n\r\n constructor(private securityApiClient = AppService.get(Types.ApiClients.SecurityApiClient)) {\r\n super();\r\n }\r\n\r\n public currentModel: OtpModel | null = null;\r\n public currentInvestor: InvestorOTPDetails | null = null;\r\n private _promiseResolver: ((value: IShowOtpResult) => void) | null = null;\r\n\r\n public showOtpModal(investor: InvestorOTPDetails, sendOtp: boolean = false) : Promise {\r\n this.currentInvestor = investor;\r\n this.currentModel = new OtpModel();\r\n if (sendOtp) {\r\n this.sendOtp();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this._promiseResolver = resolve;\r\n });\r\n }\r\n\r\n /**\r\n * Sends an otp to the investor if necessary.\r\n * Returns the previous otp used if it is still valid, else null.\r\n */\r\n public async sendOtp(): Promise {\r\n if (this.currentModel) {\r\n this.currentModel.otp = \"\";\r\n }\r\n\r\n await this.securityApiClient.sendOTP();\r\n\r\n // For now the investor must always enter an otp.\r\n return null;\r\n }\r\n\r\n public _onOtpEntered()\r\n {\r\n if (this._promiseResolver) {\r\n this._promiseResolver({ otp: this.currentModel!.otp });\r\n this.currentModel!.otp = \"\";\r\n // this.currentModel = null;\r\n }\r\n }\r\n\r\n public _onOtpCancelled() {\r\n if (this._promiseResolver) {\r\n this._promiseResolver({ cancelled: true });\r\n }\r\n }\r\n\r\n /**\r\n * Stores the otp for later use.\r\n */\r\n public storeValidOtp(otp: string) {\r\n\r\n }\r\n}\r\n\r\n@NeoModel\r\nexport class OtpModel extends ModelBase {\r\n public otp: string = \"\";\r\n}\r\n\r\nexport interface IShowOtpResult {\r\n otp?: string;\r\n cancelled?: boolean;\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport { Purchase, Sale, Switch } from '../Models/Base/TradeRequest';\r\nimport APIResponse from '../Models/APIResponse';\r\n\r\nexport interface ITradeRequestApiClient {\r\n\r\n /** \r\n * This method create a purchase to be submitted to global when the scheduler runs.\r\n */\r\n purchase(Model: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /** \r\n * This method create a Sale Request to be submitted to global when the scheduler runs.\r\n */\r\n sale(Model: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n /** \r\n * This method is used to transfer one instrument to another.\r\n * Currently only used the switch from the Money market Instrument but can be used for any switch.\r\n */\r\n switch(Model: Model.PartialPlainObject): AxiosPromise>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class TradeRequestApiClient extends Data.ApiClientBase implements ITradeRequestApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/TradeRequest`);\r\n }\r\n\r\n public purchase(Model: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/purchase`, Model);\r\n }\r\n\r\n public sale(Model: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/Sale`, Model);\r\n }\r\n\r\n public switch(Model: Model.PartialPlainObject): AxiosPromise> {\r\n return this.axios.post(`${this.apiPath}/Switch`, Model);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport Instrument from '../Models/Instruments/Instrument';\r\n\r\nexport interface IInstrumentApiClient extends Data.IReadApiClient {\r\n\r\n /** \r\n * Returns all Instruments Including Instrument information from Global.\r\n */\r\n getInstrumentList(): AxiosPromise>>;\r\n\r\n /** \r\n * Returns all Tradeable Instruments for a particular portfolio type.\r\n */\r\n getTradeableInstrumentList(PortfolioTypeID: number): AxiosPromise>>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class InstrumentApiClient extends Data.ReadApiClient implements IInstrumentApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/Instrument`);\r\n }\r\n\r\n public getInstrumentList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/GetInstrumentList`);\r\n }\r\n\r\n public getTradeableInstrumentList(PortfolioTypeID: number): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/GetTradeableInstrumentList?PortfolioTypeID=${PortfolioTypeID}`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model, Utils } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport Distribution from '../Models/Reporting/Distribution';\r\nimport StatementCriteria from '../Models/Portfolio/StatementCriteria';\r\n\r\nexport interface IReportingApiClient {\r\n\r\n /**\r\n * Returns distributions\r\n */\r\n getDistributionList(portfolioType: string): AxiosPromise>>;\r\n\r\n /** \r\n * Returns a http response with the distribution reporting content for the given criteria\r\n */\r\n getDistributionReport(criteria: Model.PartialPlainNonTrackedObject): AxiosPromise;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class ReportingApiClient extends Data.ReadApiClient implements IReportingApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/reporting`);\r\n }\r\n\r\n getDistributionList(portfolioType: string): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/distributions/${portfolioType}`);\r\n }\r\n\r\n getDistributionReport(criteria: Model.PartialPlainNonTrackedObject): AxiosPromise {\r\n return this.axios.get(`${this.apiPath}/distribution-report?${Utils.getQueryString(criteria)}`, {responseType: \"blob\"});\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport SourceOfFunds from '../Models/Catalogue/SourceOfFunds';\r\n\r\nexport interface ISourceOfFundsApiClient extends Data.IReadApiClient {\r\n\r\n /** \r\n * Returns all Source of funds\r\n */\r\n getSourceOfFundsList(): AxiosPromise>>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class SourceOfFundsApiClient extends Data.ReadApiClient implements ISourceOfFundsApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/SourceOfFunds`);\r\n }\r\n\r\n public getSourceOfFundsList(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/GetSourceOfFundsList`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport { Cart } from '../Models/Cart/Cart';\r\nimport CartDetailLookup from '../Models/Cart/CartDetailLookup';\r\n\r\nexport interface ICartApiClient extends Data.IReadApiClient {\r\n\r\n /**\r\n * Returns the cart linked to a portfolio.\r\n */\r\n getCart(portfolioID: number): AxiosPromise>;\r\n\r\n /**\r\n * Saves the cart linked to a portfolio.\r\n */\r\n putCart(cart: Model.PartialPlainObject): AxiosPromise;\r\n\r\n /** \r\n * Deletes a cart detail item linked to a cart.\r\n */\r\n deleteCartDetail(portfolioID: number, instrumentID: number | null): AxiosPromise;\r\n\r\n /**\r\n * Returns the list of cart detail lookup linked to a portfolio.\r\n */\r\n getCartDetailLookup(portfolioID: number): AxiosPromise>>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class CartApiClient extends Data.ReadApiClient implements ICartApiClient {\r\n\r\n constructor(config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/cart`);\r\n }\r\n\r\n public getCart(portfolioID: number): AxiosPromise> {\r\n return this.axios.get(`${this.apiPath}/GetCart?portfolioID=${portfolioID}`);\r\n }\r\n\r\n public putCart(cart: Model.PartialPlainObject): AxiosPromise {\r\n return this.axios.put(`${this.apiPath}/PutCart`, cart);\r\n }\r\n\r\n public deleteCartDetail(portfolioID: number, instrumentID: number | null): AxiosPromise {\r\n return this.axios.post(`${this.apiPath}/DeleteCartDetail?portfolioID=${portfolioID}&instrumentID=${instrumentID}`);\r\n }\r\n\r\n public getCartDetailLookup(portfolioID: number): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/GetCartDetailLookup?portfolioID=${portfolioID}`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { Data, Model } from '@singularsystems/neo-core';\r\nimport { AxiosPromise } from 'axios';\r\nimport { injectable } from 'inversify';\r\nimport { AppService, Types } from '../Services/AppService';\r\nimport InvestorDocument from '../Models/Investors/InvestorDocument';\r\n\r\nexport interface IInvestorDocumentApiClient {\r\n\r\n /**\r\n * Returns Tax Certificates\r\n */\r\n getTaxCertificates(): AxiosPromise>>;\r\n\r\n // Client only properties / methods\r\n}\r\n\r\n@injectable()\r\nexport default class InvestorDocumentApiClient extends Data.ApiClientBase implements IInvestorDocumentApiClient {\r\n\r\n constructor (config = AppService.get(Types.Config)) {\r\n super(`${config.apiPath}/investor-document`);\r\n }\r\n\r\n public getTaxCertificates(): AxiosPromise>> {\r\n return this.axios.get(`${this.apiPath}/getTaxCertificates`);\r\n }\r\n\r\n // Client only properties / methods\r\n}","import { AppServices, Security } from '@singularsystems/neo-core';\r\nimport Types from './AppTypes';\r\n\r\nimport Axios from 'axios';\r\nimport AuthorisationService from './Services/AuthorisationService';\r\nimport HeaderTokenAuthService from './Services/AuthenticationService';\r\nimport { AppConfig } from './Models/AppConfig';\r\nimport { AppDataService } from './Services/AppDataService';\r\nimport { RouteService } from './Services/RouteService';\r\nimport AppLayout from './Services/AppLayout';\r\nimport Slider, { Range } from 'rc-slider';\r\nimport 'rc-slider/assets/index.css';\r\nimport { SketchPicker } from 'react-color';\r\nimport AsyncSelect from 'react-select/async'\r\nimport ReactSelect from 'react-select';\r\nimport SecurityApiClient from './ApiClients/SecurityApiClient';\r\nimport { EtfSAErrorHandler } from './App/Components/EtfSAErrorHandler';\r\nimport InvestorApiClient from './ApiClients/InvestorApiClient';\r\nimport PortfolioApiClient from './ApiClients/PortfolioApiClient';\r\nimport DocumentApiClient from './ApiClients/DocumentApiClient';\r\nimport PoliticalSensitivityApiClient from './ApiClients/PoliticalSensitivityApiClient';\r\nimport ProvinceApiClient from './ApiClients/ProvinceApiClient';\r\nimport BankApiClient from './ApiClients/BankApiClient';\r\nimport BankAccountTypeApiClient from './ApiClients/BankAccountTypeApiClient';\r\nimport CountryApiClient from './ApiClients/CountryApiClient';\r\nimport CurrentInvestorService from './Services/CurrentInvestorService';\r\nimport InvestorQueryApiClient from './ApiClients/InvestorQueryApiClient';\r\nimport CatalogueApiClient from './ApiClients/CatalogueApiClient';\r\nimport OldSiteIntegration from './Services/OldSiteIntegration';\r\nimport UserInformationVM from './Views/InformationPanel/UserInformationVM';\r\nimport FAQApiClient from './ApiClients/FAQApiClient';\r\nimport StatementApiClient from './ApiClients/StatementApiClient';\r\nimport RecurringTradeRequestApiClient from './ApiClients/RecurringTradeRequestApiClient';\r\nimport OtpService from './Services/OtpService';\r\nimport TradeRequestApiClient from './ApiClients/TradeRequestApiClient';\r\nimport InstrumentApiClient from \"./ApiClients/InstrumentApiClient\";\r\nimport ReportingApiClient from './ApiClients/ReportingApiClient';\r\nimport SourceOfFundsApiClient from './ApiClients/SourceOfFundsApiClient';\r\nimport CartApiClient from './ApiClients/CartApiClient';\r\nimport InvestorDocumentApiClient from './ApiClients/InvestorDocumentApiClient';\r\n\r\nconst appModule = new AppServices.Module(\"App\", container => {\r\n\r\n // Config\r\n container.bind(Types.Config).to(AppConfig).inSingletonScope();\r\n\r\n // Security\r\n container.bind(Types.Neo.Security.AuthenticationService).to(HeaderTokenAuthService).inSingletonScope();\r\n container.bind(Types.Neo.Security.AuthorisationService).to(AuthorisationService).inSingletonScope();\r\n container.bind(Types.Neo.Security.SecurityService).to(Security.SecurityService).inSingletonScope();\r\n\r\n // Api clients\r\n container.bind(Types.Neo.Axios).toConstantValue(Axios);\r\n container.bind(Types.ApiClients.InvestorApiClient).to(InvestorApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.InvestorQueryApiClient).to(InvestorQueryApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.SecurityApiClient).to(SecurityApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.PortfolioApiClient).to(PortfolioApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.DocumentApiClient).to(DocumentApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.InvestorDocumentApiClient).to(InvestorDocumentApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.PoliticalSensitivityApiClient).to(PoliticalSensitivityApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.ProvinceApiClient).to(ProvinceApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.BankApiClient).to(BankApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.BankAccountTypeApiClient).to(BankAccountTypeApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.CountryApiClient).to(CountryApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.CatalogueApiClient).to(CatalogueApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.FAQApiClient).to(FAQApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.StatementApiClient).to(StatementApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.RecurringTradeRequestApiClient).to(RecurringTradeRequestApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.TradeRequestApiClient).to(TradeRequestApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.InstrumentApiClient).to(InstrumentApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.ReportingApiClient).to(ReportingApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.SourceOfFundsApiClient).to(SourceOfFundsApiClient).inSingletonScope();\r\n container.bind(Types.ApiClients.CartApiClient).to(CartApiClient).inSingletonScope();\r\n\r\n // Services\r\n container.bind(Types.Services.AppDataCache).to(AppDataService).inSingletonScope();\r\n container.bind(Types.Services.AppLayout).to(AppLayout).inSingletonScope();\r\n container.bind(Types.Services.RouteService).to(RouteService).inSingletonScope();\r\n container.bind(Types.Services.CurrentInvestorService).to(CurrentInvestorService).inSingletonScope();\r\n container.bind(Types.Services.OldSiteIntegration).to(OldSiteIntegration).inSingletonScope();\r\n container.bind(Types.Services.OtpService).to(OtpService).inSingletonScope();\r\n container.bind(Types.Services.UserInformationVM).to(UserInformationVM).inSingletonScope();\r\n\r\n // Components\r\n container.bind(Types.Neo.Components.Slider).toConstantValue(Slider);\r\n container.bind(Types.Neo.Components.Range).toConstantValue(Range);\r\n container.bind(Types.Neo.Components.SketchPicker).toConstantValue(SketchPicker);\r\n container.bind(Types.Neo.Components.AsyncSelect).toConstantValue(AsyncSelect);\r\n container.bind(Types.Neo.Components.ReactSelect).toConstantValue(ReactSelect);\r\n container.bind(Types.Neo.UI.ErrorHandler).to(EtfSAErrorHandler).inSingletonScope();\r\n});\r\n\r\nconst appTestModule = new AppServices.Module(\"App\", container => {\r\n\r\n});\r\n\r\nexport { appModule, appTestModule };","import { AppService } from './Services/AppService';\r\nimport { appModule } from './AppModule';\r\nimport { AppServices } from '@singularsystems/neo-core';\r\nimport { NeoReactModule } from '@singularsystems/neo-react';\r\n\r\nconst appService = AppService as AppServices.AppService;\r\n\r\nappService.registerModule(AppServices.NeoModule);\r\nappService.registerModule(NeoReactModule);\r\nappService.registerModule(appModule);","\r\nexport enum DocumentType {\r\n Identity = 1,\r\n ProofOfAddress = 2,\r\n BankStatement = 3,\r\n TaxDocument = 5,\r\n DebitOrderAuthority = 8,\r\n InvestmentAdviceMandate = 9,\r\n}","/* tslint:disable:max-classes-per-file */\r\nimport React from 'react';\r\nimport { Utils } from '@singularsystems/neo-core';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport { Link } from 'react-router-dom';\r\nimport { observer } from 'mobx-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport { contactUsRoute, dashboardRoute, faqRoute, IAppMenuItem, investorProfileRoute } from '../../Services/RouteService';\r\n\r\n@observer\r\nexport default class Sidebar extends React.Component {\r\n\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService);\r\n private routingState = AppService.get(Types.Neo.Routing.GlobalRoutingState);\r\n private appLayout = AppService.get(Types.Services.AppLayout);\r\n\r\n public render() {\r\n\r\n return (\r\n
this.appLayout.showMobileMenu = false}>\r\n
\r\n
\r\n\r\n {this.renderMenuItem(dashboardRoute)}\r\n {this.renderMenuItem(investorProfileRoute)}\r\n {this.renderMenuItem(faqRoute)}\r\n {this.renderMenuItem(contactUsRoute)}\r\n
\r\n \r\n
\r\n \r\n );\r\n }\r\n\r\n private renderMenuItem(menuItem: IAppMenuItem) {\r\n const isSelected = this.routingState.observableRoute?.path === menuItem.path;\r\n \r\n if (menuItem.requiresReadyInvestor && !this.investorService.investorData?.readyToInvest) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n {menuItem.name}\r\n
\r\n
\r\n \r\n
)\r\n }\r\n}","import React from 'react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport Sidebar from './Sidebar';\r\nimport eftsaLogo from '../../assets/img/ETFSA_On Black.png';\r\nimport { observer } from 'mobx-react';\r\n\r\n@observer\r\nexport default class LeftPanel extends React.Component {\r\n\r\n private appLayout = AppService.get(Types.Services.AppLayout);\r\n\r\n public render() {\r\n\r\n const sideBarType = this.appLayout.sidebarType;\r\n\r\n if (sideBarType === \"menu\") {\r\n return \r\n } else if (sideBarType === \"main-logo\") {\r\n return this.renderMainLogo();\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n private renderMainLogo() {\r\n return (\r\n
\r\n
\r\n \"\"\r\n
\r\n

The home of
\r\n Exchange
\r\n Traded Funds®

\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}","import React from \"react\";\r\nimport { AppService, Types } from \"../../Services/AppService\";\r\nimport DownArrow from \"../../assets/img/down-arrow-icon.svg\";\r\nimport { observable } from \"mobx\";\r\nimport { observer } from \"mobx-react\";\r\nimport Popover from './Popover';\r\nimport ContactUsView from \"../../Views/ContactUsView\";\r\nimport settingsIcon from \"../../assets/img/settings-icon.svg\";\r\nimport documentsIcon from \"../../assets/img/documents-icon.svg\";\r\n\r\n@observer\r\nexport default class UserStatus extends React.Component {\r\n\r\n private authService = AppService.get(Types.Services.AppAuthenticationService);\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper);\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService);\r\n private userInfomationVM = AppService.get(Types.Services.UserInformationVM);\r\n\r\n @observable\r\n private showPopover = false;\r\n\r\n private containerRef = React.createRef();\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.hideCard = this.hideCard.bind(this);\r\n this.logoutClicked = this.logoutClicked.bind(this);\r\n }\r\n\r\n private logoutClicked(e: React.MouseEvent) {\r\n this.authService.beginSignOut();\r\n }\r\n\r\n private hideCard(e: MouseEvent) {\r\n const parent = (e.target as HTMLElement).closest(\".app-user-container\");\r\n if (!parent) {\r\n this.showPopover = false;\r\n }\r\n }\r\n\r\n public render() {\r\n const user = this.authService.user;\r\n const isRegistered = !this.investorService.investorData?.mustCompleteRegistration;\r\n\r\n return (\r\n user &&\r\n
\r\n
\r\n\r\n {isRegistered &&\r\n
\r\n
this.investorService.toggleDocumentPanel()}>\r\n \"Documents\"\r\n

Downloads

\r\n
\r\n
this.investorService.toggleAccountInformationPanel()} >\r\n \"Settings\"\r\n

Settings

\r\n
\r\n
\r\n }\r\n\r\n
{ this.showPopover = !this.showPopover; }} ref={this.containerRef}>\r\n \r\n \r\n \r\n \r\n {user.displayName}\r\n \r\n \"arrow\"\r\n
\r\n
\r\n\r\n {this.showPopover && this.containerRef.current &&\r\n this.showPopover = false}>\r\n {isRegistered &&
this.userInfomationVM.userInfoPanelController.showInfoPanel()}>\r\n Personal Details\r\n
}\r\n
this.navigation.navigateToView(ContactUsView)}>\r\n Need Help?\r\n
\r\n
\r\n Sign Out\r\n
\r\n
}\r\n
\r\n )\r\n }\r\n}","import { FileUtils } from '@singularsystems/neo-core';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport React from 'react';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport StatusImage from '../../../App/Components/StatusImage';\r\nimport { DocumentType } from '../../../Models/Enums/DocumentType';\r\nimport UpdateIdentityCommand from '../../../Models/Investors/UpdateIdentityCommand';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport AccountInformationVM from '../../InformationPanel/AccountInformationVM';\r\nimport IdentityDetails from '../../Investor/Components/IdentityDetails';\r\n\r\ninterface IAccountIdentityInfoProps {\r\n viewModel: AccountInformationVM;\r\n}\r\n\r\nexport default class AccountIdentityInfo extends React.Component {\r\n\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n\r\n private downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n\r\n private async downloadIDDocument() {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getInvestorDocument(DocumentType.Identity));\r\n FileUtils.showSaveFile(response);\r\n }\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel,\r\n investor = viewModel.investor!;\r\n\r\n return (\r\n
\r\n
\r\n

ID

\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 this.downloadIDDocument()}>Download ID \r\n
\r\n\r\n {/* \r\n Id number cannot be changed for now.\r\n { viewModel.beginEditIdentity(); }}>Change */}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class AccountIdentityEditModal extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n viewModel.saveIdentity()}}>\r\n {(command: UpdateIdentityCommand) => (\r\n \r\n )}\r\n )\r\n }\r\n}","import { FileUtils } from '@singularsystems/neo-core';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport React from 'react';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport StatusImage from '../../../App/Components/StatusImage';\r\nimport { DocumentType } from '../../../Models/Enums/DocumentType';\r\nimport UpdateAddressCommand from '../../../Models/Investors/UpdateAddressCommand';\r\nimport { AppService, Types } from '../../../Services/AppService';\r\nimport { AddressDetails, UpdatableAddressDetails } from '../../Investor/Components/AddressDetails';\r\nimport AccountInformationVM from '../AccountInformationVM';\r\n\r\ninterface IAccountAddressInfoProps {\r\n viewModel: AccountInformationVM;\r\n}\r\n\r\nexport default class AccountAddressInfo extends React.Component {\r\n\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n\r\n private downloadTask = AppService.get(Types.Neo.TaskRunner);\r\n\r\n private async downloadProofOfAddress() {\r\n const response = await this.downloadTask.waitFor(this.documentApiClient.getInvestorDocument(DocumentType.ProofOfAddress));\r\n FileUtils.showSaveFile(response);\r\n }\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel,\r\n investor = viewModel.investor!;\r\n\r\n return (\r\n
\r\n
\r\n

Proof of Residence

\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n\r\n
\r\n this.downloadProofOfAddress()}>Download proof \r\n
\r\n \r\n { viewModel.beginEditAddress(); }}>Change\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class AccountAddressEditModal extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n viewModel.saveAddress()}}>\r\n {(command: UpdateAddressCommand) => (\r\n \r\n )}\r\n )\r\n }\r\n}","import { Neo } from '@singularsystems/neo-react';\r\nimport React from 'react';\r\nimport ClickLink from '../../../App/Components/ClickLink';\r\nimport StatusImage from '../../../App/Components/StatusImage';\r\nimport InvestorBankDetail from '../../../Models/Investors/InvestorBankDetail';\r\nimport { FicaStatus } from '../../../Models/Enums/FicaStatus';\r\nimport AccountInformationVM from '../../InformationPanel/AccountInformationVM';\r\nimport BankAccountDetails, { ThirdPartyBankAccountDetails } from '../../Investor/Components/BankAccountDetails';\r\n\r\ninterface IAccountIdentityInfoProps {\r\n viewModel: AccountInformationVM;\r\n}\r\n\r\nexport class BankDetailsInfo extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel,\r\n investor = viewModel.investor!,\r\n bankDetails = investor.primaryBankDetails;\r\n\r\n return (\r\n
\r\n
\r\n

Bank Details

\r\n \r\n
\r\n \r\n {bankDetails &&\r\n
\r\n \r\n
}\r\n\r\n { viewModel.beginEditBankDetails(); }}>Change\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class ThirdPartyBankDetailsInfo extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel,\r\n investor = viewModel.investor!,\r\n bankDetails = investor.thirdPartyBankDetails;\r\n\r\n return (\r\n
\r\n
\r\n

3rd Party Bank Account

\r\n \r\n
\r\n \r\n
\r\n {bankDetails &&\r\n
\r\n \r\n\r\n { viewModel.beginEdit3rdPartyBankDetails(); }}>Change\r\n
}\r\n\r\n {!bankDetails &&\r\n
\r\n { viewModel.beginEdit3rdPartyBankDetails(); }}> Add 3rd Party Bank Details\r\n
}\r\n
\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class BankDetailsEditModal extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n \r\n return (\r\n viewModel.saveBankDetail()}}>\r\n\r\n {(bankDetails: InvestorBankDetail) => (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class ThirdPartyBankDetailsEditModal extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n \r\n return (\r\n viewModel.save3rdPartyBankDetail()}}>\r\n\r\n {(bankDetails: InvestorBankDetail) => (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )\r\n }\r\n}","import { Neo } from '@singularsystems/neo-react';\r\nimport React from 'react';\r\nimport StatusImage from '../../../App/Components/StatusImage';\r\nimport InvestorTaxDetail from '../../../Models/Investors/InvestorTaxDetail';\r\nimport TaxDetails from '../../Investor/Components/TaxDetails';\r\nimport AccountInformationVM from '../AccountInformationVM';\r\n\r\ninterface IAccountIdentityInfoProps {\r\n viewModel: AccountInformationVM;\r\n}\r\n\r\nexport default class TaxDetailsInfo extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel, \r\n investor = viewModel.investor!;\r\n\r\n return (\r\n
\r\n
\r\n

Tax Details

\r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n\r\n viewModel.beginEditTaxDetails()}>Change\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport class TaxDetailsEditModal extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n \r\n return (\r\n viewModel.saveTaxDetails()}}>\r\n\r\n {(taxDetails: InvestorTaxDetail) => (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport InvestmentInfoVM from './InvestmentInfoVM';\r\nimport { Neo, NeoGrid } from '@singularsystems/neo-react';\r\nimport { Misc, ModalUtils, NumberUtils } from '@singularsystems/neo-core';\r\nimport { InfoPanelColumn } from '../../../App/Components/InfoPanel';\r\nimport { DebitOrderDays, RecurringTradeRequest, RecurringTradeRequestDetail, RecurringTradeRequestPost } from '../../../Models/Base/RecurringTradeRequest';\r\n\r\ninterface IInvestmentInfoProps {\r\n viewModel: InvestmentInfoVM;\r\n}\r\n\r\n@observer\r\nexport default class InvestmentInfo extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n <>\r\n \r\n \r\n

{viewModel.portfolio.portfolioType} Investment

\r\n\r\n
\r\n Debit Orders\r\n\r\n
\r\n {!viewModel.debitOrderDetails && !viewModel.taskRunner.isBusy &&\r\n
You have no debit orders on your {viewModel.portfolio.portfolioType.toLowerCase()} investment.
}\r\n\r\n {viewModel.debitOrderDetails && this.renderDebitOrders(viewModel.debitOrderDetails)}\r\n
\r\n
\r\n
\r\n \r\n
\r\n {viewModel.TAUDebitOrderList && !viewModel.taskRunner.isBusy\r\n && (\r\n
\r\n Debit Order Mandates: Trades\r\n
\r\n {viewModel.TAUDebitOrderList\r\n .sort((a, b) => b.startDate?.getTime()! - a.startDate?.getTime()!)\r\n .map(c =>\r\n this.renderDownloadLink(\"DebitOrderMandate_\" + c.startDate!.toDateString() + \"_\" + NumberUtils.format(c.amount, Misc.NumberFormat.CurrencyDecimals, \"R\"), () => viewModel.downloadTradeDebitOrderMandate(c.contractNumber, c.selfLink), \"fa fa-download\"))\r\n }\r\n
\r\n
\r\n )}\r\n
\r\n
\r\n
\r\n\r\n \r\n \r\n {viewModel.editingDebitOrder && this.renderEditDebitOrder(viewModel.editingDebitOrder)}\r\n \r\n \r\n \r\n );\r\n }\r\n\r\n private renderDownloadLink(text: string, onClick: () => void, icon?: string) {\r\n return (\r\n { e.preventDefault(); onClick(); }}>\r\n {text} \r\n \r\n );\r\n }\r\n\r\n private renderDebitOrders(debitOrderDetails: RecurringTradeRequest) {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n
\r\n {!debitOrderDetails.hasSentOtp\r\n ? <>\r\n
\r\n Total monthly debit order amount:\r\n {NumberUtils.format(debitOrderDetails.totalDebitOrderAmount, Misc.NumberFormat.CurrencyDecimals)}\r\n
\r\n
\r\n this.beginChangeDebitOrderDay(debitOrderDetails, day) }} />\r\n
\r\n
\r\n \r\n {(item, meta) => (\r\n \r\n \r\n \r\n viewModel.editDebitOrder(item) }}\r\n deleteButton={{ size: \"sm\", onClick: () => this.beginCancelDebitOrder(item) }}>\r\n\r\n \r\n \r\n )}\r\n \r\n
\r\n \r\n : \r\n

\r\n You have been sent a one time pin. Please enter it below to change your debit order.\r\n

\r\n \r\n\r\n viewModel.changeDebitOrderDay(debitOrderDetails.pendingDebitOrderDay, debitOrderDetails.otp)}>Submit\r\n
\r\n }\r\n
);\r\n }\r\n\r\n private renderEditDebitOrder(debitOrder: RecurringTradeRequestPost) {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n
\r\n {!debitOrder.hasSentOtp &&\r\n viewModel.confirmChangeDebitOrder()}>\r\n

{debitOrder.instrumentName}

\r\n {viewModel.portfolio.portfolioType} investment\r\n\r\n
\r\n viewModel.debitOrderEstimatedUnits()} />\r\n
\r\n\r\n
\r\n \r\n \r\n \r\n \r\n
\r\n\r\n
\r\n viewModel.panelController.back()}>Cancel\r\n Submit\r\n
\r\n
}\r\n\r\n {debitOrder.hasSentOtp &&\r\n \r\n

\r\n You have been sent a one time pin. Please enter it below in order to change your debit order.\r\n

\r\n \r\n\r\n viewModel.submitChangeDebitOrder()}>Submit\r\n
}\r\n
\r\n );\r\n }\r\n\r\n private async beginChangeReinvestDividends() {\r\n const viewModel = this.props.viewModel,\r\n portfolio = viewModel.portfolio;\r\n\r\n const prompt = portfolio.pendingReinvestDividends ?\r\n `Change ${portfolio.portfolioType} investment to reinvest dividends?` :\r\n `Change ${portfolio.portfolioType} investment to payout dividends?`;\r\n\r\n const result = await ModalUtils.showYesNoDismissible(portfolio.portfolioType + \" Investment\", prompt);\r\n\r\n if (result === Misc.ModalResult.Yes) {\r\n viewModel.updateReInvestDividends();\r\n } else {\r\n portfolio.pendingReinvestDividends = portfolio.reinvestDividends;\r\n }\r\n }\r\n\r\n private async beginChangeDebitOrderDay(debitOrder: RecurringTradeRequest, day?: DebitOrderDays) {\r\n if (day) {\r\n const viewModel = this.props.viewModel,\r\n portfolio = viewModel.portfolio;\r\n\r\n const result = await ModalUtils.showYesNoDismissible(\r\n portfolio.portfolioType + \" Investment\",\r\n `Change debit order date to ${day.description}?`, async () => {\r\n let otp = await viewModel.taskRunner.waitFor(viewModel.otpService.sendOtp());\r\n if (otp) {\r\n viewModel.changeDebitOrderDay(day.dayOfMonth, otp);\r\n } else {\r\n viewModel.debitOrderDetails!.hasSentOtp = true;\r\n }\r\n });\r\n\r\n if (result !== Misc.ModalResult.Yes) {\r\n debitOrder.pendingDebitOrderDay = debitOrder.debitOrderDay;\r\n }\r\n }\r\n }\r\n\r\n private beginCancelDebitOrder(debitOrder: RecurringTradeRequestDetail) {\r\n\r\n ModalUtils.showYesNoDismissible(\r\n \"Cancel Debit Order\",\r\n `Are you sure you want to cancel the debit order for ${debitOrder.instrumentName}?`,\r\n () => this.props.viewModel.cancelDebitOrder(debitOrder));\r\n }\r\n}","import React from 'react';\r\nimport { InfoPanel, InfoPanelColumn } from '../../App/Components/InfoPanel';\r\nimport { observer } from 'mobx-react';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport AccountInformationVM, { InfoPanelView } from './AccountInformationVM';\r\nimport AccountIdentityInfo, { AccountIdentityEditModal } from './Components/AccountIdentityInfo';\r\nimport AccountAddressInfo, { AccountAddressEditModal } from './Components/AccountAddressInfo';\r\nimport { BankDetailsInfo, ThirdPartyBankDetailsInfo, BankDetailsEditModal, ThirdPartyBankDetailsEditModal } from './Components/BankDetailsInfo';\r\nimport TaxInfo, { TaxDetailsEditModal } from './Components/TaxInfo';\r\nimport { PortfolioType } from '../../Models/Portfolio/PortfolioType';\r\nimport InvestorLookup from '../../Models/Investors/InvestorLookup';\r\nimport { EnumHelper } from '@singularsystems/neo-core';\r\nimport InvestmentInfo from './Components/InvestmentInfo';\r\nimport { PortfolioSign } from '../../Models/Registration/Portfolio';\r\nimport ClickLink from '../../App/Components/ClickLink';\r\n\r\ninterface IAccountInformationProps {\r\n viewModel: AccountInformationVM;\r\n}\r\n\r\n@observer\r\nexport default class AccountInformationPanel extends React.Component {\r\n\r\n private selectView(view: InfoPanelView) {\r\n this.props.viewModel.selectedView = view;\r\n this.props.viewModel.panelController.forward(\"InvestorDetails\");\r\n }\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n <>\r\n \r\n
\r\n \r\n {this.renderHomeView()}\r\n \r\n\r\n \r\n \r\n {viewModel.investor &&\r\n <>\r\n {viewModel.selectedView === InfoPanelView.Identity && }\r\n {viewModel.selectedView === InfoPanelView.Address && }\r\n {viewModel.selectedView === InfoPanelView.BankDetails && }\r\n {viewModel.selectedView === InfoPanelView.AdditionalBankDetails && }\r\n {viewModel.selectedView === InfoPanelView.TaxDetails && }\r\n }\r\n \r\n \r\n\r\n {viewModel.investmentVM &&\r\n }\r\n\r\n \r\n \r\n {viewModel.newInvestmentCommand && this.renderStartInvestment(viewModel.newInvestmentCommand)}\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 private renderHomeView() {\r\n const viewModel = this.props.viewModel;\r\n\r\n return (\r\n \r\n

Investor Details

\r\n\r\n {this.renderViewLink(\"ID\", InfoPanelView.Identity)}\r\n {this.renderViewLink(\"Proof of Residence\", InfoPanelView.Address)}\r\n\r\n

Investments & Debit Orders

\r\n {viewModel.appInvestorData.investor &&\r\n <>\r\n {this.renderInvestmentLink(viewModel.appInvestorData.investor, PortfolioType.Discretionary)}\r\n {this.renderInvestmentLink(viewModel.appInvestorData.investor, PortfolioType.TaxFree)}\r\n }\r\n\r\n

Other

\r\n\r\n {this.renderViewLink(\"Bank Details\", InfoPanelView.BankDetails)}\r\n {this.renderViewLink(\"Tax Details\", InfoPanelView.TaxDetails)}\r\n {this.renderViewLink(\"3rd Party Bank Account\", InfoPanelView.AdditionalBankDetails)}\r\n
\r\n );\r\n }\r\n\r\n private renderStartInvestment(newInvestment: PortfolioSign) {\r\n const viewModel = this.props.viewModel,\r\n portfolioTypeName = EnumHelper.getItemMetadata(PortfolioType, newInvestment.portfolioTypeID).display;\r\n\r\n return (\r\n
\r\n

Open {portfolioTypeName} Account

\r\n\r\n

Please read and accept the investment mandate to open your {portfolioTypeName.toLowerCase()} investment account.

\r\n\r\n this.props.viewModel.documentApiClient.downloadMaintenanceDocument(newInvestment.maintenanceDocumentType, viewModel.taskRunner)}>\r\n View full mandate\r\n \r\n\r\n viewModel.createInvestment()}>\r\n \r\n\r\n Start Investing\r\n \r\n
\r\n\r\n );\r\n }\r\n\r\n private renderInvestmentLink(investor: InvestorLookup, portfolioType: PortfolioType) {\r\n const viewModel = this.props.viewModel,\r\n portfolio = investor.portfolioList.find(c => c.portfolioTypeID === portfolioType);\r\n\r\n const portfolioTypeName = EnumHelper.getItemMetadata(PortfolioType, portfolioType).display;\r\n\r\n return this.renderMainLink(\r\n portfolioTypeName,\r\n () => portfolio ? viewModel.selectPortfolio(portfolio) : viewModel.beginNewInvestment(portfolioType),\r\n portfolio ? undefined : \"fa-plus\",\r\n portfolio ? undefined : `Open ${portfolioTypeName} account`);\r\n }\r\n\r\n private renderViewLink(text: string, view: InfoPanelView, icon?: string, tooltip?: string) {\r\n return this.renderMainLink(text, () => this.selectView(view), icon, tooltip);\r\n }\r\n\r\n private renderMainLink(text: string, onClick: () => void, icon?: string, tooltip?: string) {\r\n return (\r\n { e.preventDefault(); onClick(); }}>\r\n {text} \r\n \r\n );\r\n }\r\n}","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { InfoPanel, InfoPanelColumn } from '../../App/Components/InfoPanel';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport UserInformationVM from './UserInformationVM';\r\nimport ChangePassword from '../../Models/Security/ChangePassword';\r\nimport { OtpType } from '../../Models/Registration/Enums/OtpType';\r\nimport ChangeOTPPreference from '../../Models/Security/ChangeOTPPreference';\r\nimport LoginResult from '../../Models/Security/LoginResult';\r\n\r\ninterface IUserInformationPanelProps {\r\n \r\n}\r\n\r\n@observer\r\nexport default class UserInformationPanel extends React.Component {\r\n\r\n private viewModel = AppService.get(Types.Services.UserInformationVM)\r\n\r\n public render() {\r\n const viewModel = this.viewModel,\r\n userInfo = viewModel.userInfo;\r\n\r\n return (\r\n
\r\n \r\n \r\n

Personal Details

\r\n \r\n {userInfo &&\r\n
\r\n \r\n \r\n \r\n \r\n\r\n

To update any of the details above, please contact hub@etfsa.co.za

\r\n viewModel.beginChangeOTPPreference()} />\r\n\r\n viewModel.beginChangePassword() }>Change Password\r\n
}\r\n
\r\n\r\n \r\n {viewModel.passwordDetails && this.renderChangePassword(viewModel, viewModel.passwordDetails)}\r\n \r\n\r\n \r\n {viewModel.otpChangeDetails && userInfo && this.renderChangeOTP(viewModel, userInfo, viewModel.otpChangeDetails)}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n private renderChangePassword(viewModel: UserInformationVM, details: ChangePassword) {\r\n return \r\n

Change Password

\r\n\r\n
\r\n details.passwordError = null} variant=\"danger\">\r\n
\r\n                        {details.passwordError}\r\n                    
\r\n
\r\n\r\n viewModel.changePassword()}>\r\n\r\n \r\n \r\n \r\n\r\n Change\r\n \r\n
\r\n
\r\n }\r\n\r\n private renderChangeOTP(viewModel: UserInformationVM, userInfo: LoginResult, changeOtpDetails: ChangeOTPPreference) {\r\n return \r\n

Change OTP Preference

\r\n\r\n {userInfo.canChangeOtpType &&\r\n <>\r\n {!changeOtpDetails.areYouSure && \r\n
\r\n Are you sure you want to send future one time pins via {changeOtpDetails.otpTypeViaText}?\r\n\r\n
\r\n viewModel.confirmChangeOTPPreference()}>Yes\r\n viewModel.userInfoPanelController.back()}>No\r\n
\r\n
}\r\n\r\n {changeOtpDetails.areYouSure &&\r\n
\r\n

\r\n You have been sent a one time pin, please enter it below and click submit to send future one time pins via {changeOtpDetails.otpTypeViaText}.\r\n

\r\n \r\n viewModel.endChangeOTPPreference()}>\r\n \r\n\r\n Submit\r\n \r\n \r\n
}\r\n }\r\n {!userInfo.canChangeOtpType && \r\n

\r\n Unfortunately you can't change your OTP preference until you have provided us with your cell phone no AND email address.\r\n

}\r\n \r\n
\r\n }\r\n}","import React from 'react';\r\nimport DocumentPanelVM from './DocumentPanelVM';\r\nimport { observer } from 'mobx-react';\r\nimport { InfoPanel, InfoPanelColumn } from '../../App/Components/InfoPanel';\r\nimport { Neo } from '@singularsystems/neo-react';\r\nimport { MaintenanceDocumentType } from '../../Models/Base/Enums/MaintenanceDocumentType';\r\nimport { PortfolioType } from '../../Models/Portfolio/PortfolioType';\r\n\r\ninterface IDocumentPanelProps {\r\n viewModel: DocumentPanelVM;\r\n}\r\n\r\n@observer\r\nexport default class DocumentPanel extends React.Component {\r\n\r\n public render() {\r\n const viewModel = this.props.viewModel,\r\n portfolioList = viewModel.appInvestorData.investor?.portfolioList ?? [];\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n

Downloads

\r\n\r\n \r\n {this.renderMainLink(\"Tax Certificate\", () => viewModel.viewTaxCertificates())}\r\n {this.renderMainLink(\"Statement\", () => viewModel.beginViewStatement())}\r\n {portfolioList.find(c => c.portfolioTypeID === PortfolioType.Discretionary) &&\r\n this.renderMainLink(\"Discretionary Investment Mandate\", () => this.downloadDocument(MaintenanceDocumentType.NormalMandate), \"fa fa-download\")}\r\n {portfolioList.find(c => c.portfolioTypeID === PortfolioType.TaxFree) &&\r\n this.renderMainLink(\"Tax Free Investment Mandate\", () => this.downloadDocument(MaintenanceDocumentType.TaxFreeMandate), \"fa fa-download\")}\r\n \r\n
\r\n\r\n \r\n {this.renderStatementCriteria()}\r\n \r\n\r\n \r\n

Tax Certificates

\r\n \r\n \r\n {viewModel.taxCertificates.length === 0\r\n ?
No tax certificates available.
\r\n : <>\r\n \r\n {viewModel.taxCertificateListByPortfolio?.map(c => this.renderMainLink(c.documentName, () => viewModel.downloadTaxCertificate(c.documentID), \"fa fa-download\"))}\r\n }\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private renderMainLink(text: string, onClick: () => void, icon?: string) {\r\n return (\r\n { e.preventDefault(); onClick(); }}>\r\n {text} \r\n \r\n );\r\n }\r\n\r\n private downloadDocument(documentType: MaintenanceDocumentType) {\r\n this.props.viewModel.documentApiClient.downloadMaintenanceDocument(documentType, this.props.viewModel.downloadTask);\r\n }\r\n\r\n private renderStatementCriteria() {\r\n const viewModel = this.props.viewModel,\r\n criteria = viewModel.statementCriteria;\r\n\r\n return (\r\n
\r\n

Statement

\r\n viewModel.downloadStatement()}>\r\n \r\n \r\n \r\n\r\n
\r\n Download\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\nimport { Neo, Views } from '@singularsystems/neo-react';\r\nimport { observer } from 'mobx-react';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport logo from \"../../assets/img/ETFSA_On Black.png\";\r\nimport hamburger from \"../../assets/img/hamburger-icon.svg\";\r\nimport { IETViewBase } from '../../Views/ETViewBase';\r\nimport UserStatus from './UserStatus';\r\nimport AccountInformationPanel from '../../Views/InformationPanel/AccountInformationPanel';\r\nimport UserInformationPanel from '../../Views/InformationPanel/UserInformationPanel';\r\nimport DocumentPanel from '../../Views/InformationPanel/DocumentPanel';\r\n\r\n@observer\r\nexport default class HeaderPanel extends React.Component {\r\n\r\n private appLayout = AppService.get(Types.Services.AppLayout);\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService);\r\n\r\n componentDidMount() {\r\n this.appLayout.setup();\r\n }\r\n\r\n componentDidUpdate() {\r\n this.appLayout.setup();\r\n }\r\n\r\n public render() {\r\n\r\n const layout = this.appLayout;\r\n\r\n const showHeader = !(Views.ViewBase.currentView as unknown as IETViewBase)?.hideHeader;\r\n const globalTask = Views.ViewBase.currentView ? Views.ViewBase.currentView.taskRunner : undefined;\r\n\r\n let headerClassName = \"app-header-panel\";\r\n\r\n if (!layout.isScrollTop) {\r\n headerClassName += \" scrolled\";\r\n }\r\n\r\n return (\r\n
\r\n {globalTask && globalTask.isBusy &&\r\n }\r\n\r\n {showHeader && \r\n
\r\n\r\n
\r\n
this.appLayout.showMobileMenu = !this.appLayout.showMobileMenu}>\r\n \"\"\r\n
\r\n\r\n
\r\n \"etfSA\r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n {this.investorService.investorData &&\r\n <>\r\n \r\n \r\n }\r\n \r\n
\r\n\r\n
}\r\n
\r\n )\r\n }\r\n}","import React from 'react';\r\nimport { Routing as NeoRouting } from '@singularsystems/neo-core';\r\nimport { Routing } from '@singularsystems/neo-react';\r\nimport { withRouter, Switch, Route, Redirect } from 'react-router';\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport RegisterView from '../../Views/Registration/RegisterView';\r\nimport { investorProfileRoute } from '../../Services/RouteService';\r\n\r\nclass RouteView extends Routing.RouteView {\r\n\r\n private routeService = AppService.get(Types.Services.RouteService);\r\n private investorService = AppService.get(Types.Services.CurrentInvestorService);\r\n private navigation = AppService.get(Types.Neo.Routing.NavigationHelper);\r\n\r\n constructor(props: any) {\r\n super(props);\r\n\r\n this.routes = this.routeService.routes;\r\n this.switchComponent = Switch;\r\n this.routeComponent = Route;\r\n\r\n this.getForbiddenComponent = (route) =>

Forbidden

;\r\n this.getSigningInComponent = (route) =>
Signing in...
;\r\n }\r\n\r\n protected getAuthorisedComponent(route: NeoRouting.IRoute, path: string) {\r\n\r\n if (!route.allowAnonymous) {\r\n\r\n const investorData = this.investorService.investorData;\r\n if (investorData) {\r\n if (investorData.investor === null) {\r\n return
Restoring profile...
\r\n }\r\n if (investorData.mustCompleteRegistration) {\r\n return \r\n }\r\n if (!investorData.readyToInvest && route.path !== investorProfileRoute.path) {\r\n return \r\n }\r\n }\r\n }\r\n\r\n return super.getAuthorisedComponent(route, path);\r\n }\r\n\r\n \r\n}\r\n\r\nexport default withRouter(RouteView);","import React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport investorHubLogo from \"../../assets/img/ETFSA_On White.png\";\r\nimport investorHubLogo2x from \"../../assets/img/ETFSA_On White@2x.png\";\r\nimport investorHubLogo3x from \"../../assets/img/ETFSA_On White@3x.png\";\r\nimport { AppService, Types } from '../../Services/AppService';\r\nimport DocumentHandler from '../../Services/DocumentHandler';\r\nimport { MaintenanceDocumentType } from '../../Models/Base/Enums/MaintenanceDocumentType';\r\nimport { Neo } from '@singularsystems/neo-react';\r\n\r\n@observer\r\nexport default class Footer extends React.Component {\r\n\r\n private appLayout = AppService.get(Types.Services.AppLayout);\r\n private taskRunner = AppService.get(Types.Neo.TaskRunner);\r\n private documentApiClient = AppService.get(Types.ApiClients.DocumentApiClient);\r\n\r\n private downloadMaintenanceDocument(maintenanceDocumentType: MaintenanceDocumentType) {\r\n this.taskRunner.run(\"Fetching Document\", async () => {\r\n var response = await this.documentApiClient.fetchPublicMaintenanceDocument(maintenanceDocumentType);\r\n if (response) {\r\n DocumentHandler.convertAndDownloadDocument(response, true)\r\n }\r\n });\r\n }; \r\n\r\n public render() {\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n © {new Date().getFullYear()} ETFSA. All rights reserved.\r\n
\r\n
\r\n \r\n
\r\n
\r\n this.downloadMaintenanceDocument(MaintenanceDocumentType.TermsAndConditions)}>T&Cs\r\n <> | \r\n this.downloadMaintenanceDocument(MaintenanceDocumentType.PrivacyPolicy)}>Privacy Policy\r\n
\r\n
\r\n
\r\n
\r\n )\r\n }\r\n}","import { Neo } from '@singularsystems/neo-react';\r\nimport React from 'react';\r\nimport OtpInput from \"react-otp-input\";\r\nimport { NotificationDuration } from \"../../Models/Enums/NotificationDuration\";\r\nimport { OtpType } from \"../../Models/Registration/Enums/OtpType\";\r\nimport { AppService, Types } from \"../../Services/AppService\";\r\nimport { OtpModel } from \"../../Services/OtpService\";\r\n\r\ninterface IOTPModalProps {\r\n \r\n}\r\n\r\nexport default class OTPModal extends React.Component {\r\n\r\n private otpService = AppService.get(Types.Services.OtpService);\r\n private notifications = AppService.get(Types.Neo.UI.GlobalNotifications);\r\n\r\n handleChange = (otp: string) => {\r\n this.otpService.currentModel!.otp = otp;\r\n };\r\n\r\n public render() {\r\n \r\n return (\r\n this.otpService._onOtpCancelled()}\r\n closeButton={false}\r\n showCancelButton={true}\r\n >\r\n {(model: OtpModel) => this.renderModalBody(model)}\r\n \r\n )\r\n }\r\n\r\n private renderModalBody(model: OtpModel) {\r\n const investor = this.otpService.currentInvestor;\r\n const communicationType = this.getCommunicationMethod(investor!.otpMethod, investor!.emailAddress, investor!.cellNo)\r\n\r\n return (\r\n
\r\n
\r\n An OTP has been sent to your {communicationType === OtpType.Email ? `email address (${investor!.emailAddress}).` : `cellphone (${investor!.cellNo}).`}\r\n
\r\n
\r\n
\r\n }\r\n inputStyle={\"otp\"}\r\n isInputNum={true}\r\n />\r\n
\r\n
\r\n \r\n
\r\n {this.otpService._onOtpEntered()}}>\r\n SUBMIT\r\n \r\n
\r\n
\r\n {this.resendOtp();}}>DID NOT RECEIVE ONE?\r\n
\r\n
\r\n )\r\n }\r\n\r\n public resendOtp() {\r\n this.otpService.sendOtp();\r\n const investor = this.otpService.currentInvestor;\r\n if (investor) {\r\n if (investor!.otpMethod === OtpType.Email) {\r\n this.notifications.addPrimary(\"New OTP Sent\", `A new OTP has been sent to your email address (${investor.emailAddress})`, NotificationDuration.Long)\r\n } else {\r\n this.notifications.addPrimary(\"New OTP Sent\", `A new OTP has been sent to your cellphone (${investor.cellNo})`, NotificationDuration.Long)\r\n }\r\n }\r\n }\r\n\r\n private getCommunicationMethod(otpMethod: number, email: string, cellNo: string) {\r\n if (otpMethod === OtpType.CellNo || otpMethod === OtpType.Email) {\r\n return otpMethod;\r\n } else if (email !== \"\") {\r\n otpMethod = OtpType.Email;\r\n } else {\r\n otpMethod = OtpType.CellNo;\r\n }\r\n return otpMethod;\r\n }\r\n}","import * as React from 'react';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { NotifyUtils } from '@singularsystems/neo-core';\r\nimport { Neo, Routing } from '@singularsystems/neo-react';\r\nimport { observer, Observer } from 'mobx-react';\r\nimport './Styles/App.scss';\r\nimport LeftPanel from './App/Components/LeftPanel';\r\nimport HeaderPanel from './App/Components/HeaderPanel';\r\nimport RouteView from './App/Components/RouteView';\r\nimport Footer from './App/Components/Footer';\r\nimport { AppService, Types } from './Services/AppService';\r\nimport AppLayout from './Services/AppLayout';\r\nimport OTPModal from \"./App/Components/OTPModal\";\r\n\r\n@observer\r\nexport default class App extends React.Component {\r\n\r\n private appLayout = AppService.get(Types.Services.AppLayout);\r\n private config = AppService.get(Types.Config);\r\n\r\n componentDidMount() {\r\n setTimeout(() => this.appLayout.setup(), 0);\r\n }\r\n\r\n public render() {\r\n\r\n const layout = this.appLayout;\r\n const containerAppendStyle = layout.sidebarType === \"main-logo\" ? \" big-sidebar-container\" : (layout.sidebarType === \"menu\" ? \" has-side-menu\" : \"\");\r\n \r\n return (\r\n \r\n
\r\n
\r\n\r\n {/* Left menu panel */}\r\n \r\n\r\n {/* Top header panel */}\r\n \r\n\r\n {/* Right content panel */}\r\n
\r\n
\r\n\r\n \r\n {() => (\r\n \r\n )}\r\n \r\n\r\n
\r\n Loading...
}>\r\n \r\n \r\n
\r\n
\r\n
\r\n\r\n {/* Page Footer */}\r\n
\r\n\r\n \r\n \r\n \r\n \r\n
\r\n \r\n \r\n );\r\n }\r\n}","import 'core-js/stable';\r\nimport * as React from 'react';\r\nimport * as ReactDOM from 'react-dom';\r\nimport './AppSetup';\r\nimport App from './App';\r\nimport { AppService, Types } from './Services/AppService';\r\n\r\n(async function init() {\r\n\r\n let renderComponent = ;\r\n\r\n try {\r\n await AppService.get(Types.Neo.Config.ConfigService).loadConfig();\r\n\r\n const authService = AppService.get(Types.Services.AppAuthenticationService);\r\n await authService.loadUserFromToken();\r\n\r\n } catch (e) {\r\n console.log(e);\r\n renderComponent =
The app failed to load.
;\r\n }\r\n\r\n // React init\r\n ReactDOM.render(\r\n renderComponent,\r\n document.getElementById('root') as HTMLElement\r\n );\r\n \r\n})();\r\n\r\n// Uncomment the following section if you want to enable offline support or want index.html served from cache.\r\n// This will make your app startup time immediate, since no requests need to be made to the server.\r\n// If a new index.html file exists on the server, the user will be shown a message (after a few seconds from the app loading) saying a new version is available, click ok to update.\r\n// Move to imports section: import registerServiceWorker from './registerServiceWorker';\r\n// registerServiceWorker();"],"sourceRoot":""}