{"version":3,"sources":["src/InvData/Util/DateIndexHelper.ts","src/InvData/Util/IntervalSetGenerator.ts","src/InvData/Util/PropertyTypeHelpers.ts","src/InvData/DayId.ts","src/InvData/DecimalHelper.ts","src/InvData/FormatterHelper.ts","src/InvData/ModelEnvironment.ts","src/InvData/ModelEnvironmentHelper.ts","src/InvData/ModelEnvironmentLabelHelper.ts","src/InvData/PropertyDefinition.ts","src/InvData/PropertyTypeIds.ts","src/InvData/ResourceTypeIds.ts","src/InvData/SpecialEntityTypeIds.ts","src/InvData/SelectionSetHelper.ts","src/InvData/User.ts","src/InvData/Models/IdAndCodeObjectIndex.ts","src/InvData/Models/Tag.ts","src/InvData/Models/TagSet.ts"],"names":["InvData","Util","DateIndexHelper","_isLeapYear","year","_daysInYear","getDaysInMonth","dateOrDateIndex","date","Date","getDateFromDateIndex","dayCountsToUse","getFullYear","month","getMonth","_daysInMonthsLeapYear","_daysInMonths","isLastDayInMonth","getDate","getDateIndexFromDate","getDateIndexFromDateUsingSlowMethod","days","yearCo","dayOfMonth","daysInMonthToUse","monthCo","getTodayLastYear","now","day","getDateIndexForToday","dateIndex","undefined","getDateFromDateIndexUsingSlowMethod","daysInYear","daysAfterThisYear","daysInMonth","daysAfterThisMonth","formatDateAsString","toString","formatDateIndexAsDateString","this","_paMinDateId","_paMaxDateId","getDateOfLastDayInMonth","getDateIndexOfLastDayInMonth","lastDayOfMonth","getDateIndexOfLastDayInPreviousMonth","getDateIndexOfLastDayInPreviousQuarter","firstDayDate","getDateIndexOfLastDayInQuarter","getDateIndexOfLastDayInPreviousYear","endOfLastYear","getDateIndexOfLastDayInYear","getMonthNameForMonthOffset","monthOffset","_monthNames","formatDateAsMonthNameYearString","formatAsShortMonthNameYear","_monthShortNames","formatAsShortMonthDayYear","formatAsQuarterYearString","Math","floor","getDateIndexOfLastDayInFiscalYear","fiscalYearStartMonth","monthNumber","endDate","endDayId","fiscalYearStartMonthOffset","endMonthFirstDay","getDateIndexOfLastDayInPreviousFiscalYear","countMonths","fromDayId","toDayId","excludePartialMonths","isNegative","holder","monthCount","firstMonthEndDayd","DayId","forDateIndex","RelativeDate","MonthEnd","lastMonthEndDayId","nextMonthEndDayId","IntervalSetGenerator","getIntervalSet","options","asOfDayId","today","asOfDate","toDate","currentMonthEndDayId","forDate","priorMonthEndDayId","PriorMonthEnd","priorQuarterEndDayId","PriorQuarterEnd","priorYearEndDayId","PriorYearEnd","isAsOfDayOnMonthEnd","window","Solovis","solovisAny","Custom","ModelDefaults","codeToIntervalInfoMap","intervalRequests","saveInterval","interval","intervalRequest","timeRangeDescription","format","code","push","oneDay","label","mtd","qtd","ytd","fiscalYtd","intervalFromDayId","sinceMonthsBack","sinceMonthsBackSeenSet","_i","_a","length","monthsBack","sinceYearsBack","sinceYearsBackSeenSet","_b","_c","yearsBack","sinceDayIds","sinceDayIdSeenSet","_d","_e","sinceDayId","sinceDateStr","sinceInception","sinceFirstFullMonth","isSinceFirstFullMonth","sinceFirstFullQuarter","isSinceFirstFullQuarter","consecutiveCalendarMonthsBack","lastFromDayId","includeFullFinalIntervalForConsecutiveIntervals","followingIntervalEndDayId","monthBackCo","consecutiveCalendarQuartersBack","QuarterEnd","quarterBackCo","consecutiveCalendarYearsBack","parseInt","startingYearBackCo","YearEnd","endYearCo","yearBackCo","intervalYear","consecutiveFiscalYearsBack","fiscalYearBackCo","intervalToDate","fiscalYear","rollingIntervals","monthSpanSeenSet","_f","_g","rollingInterval","monthSpan","monthSpanStr","rollingPrefix","endToEnd","nextIntervalNumber","nextToDayId","includeFinalPartialMonth","rollingToDayId","rollingFromDayId","intervalNumber","intervalLabel","intervalCount","daily","daysBack","daysBackCo","currentDayId","sinceDateCumulativeIntervals","_h","_j","sinceDateCumulativeInterval","currentToDayId","advanceDayId","advanceBy","currentMonthEndDayId_1","currentQuarterEndDayId","currentYearEndDayId","startingAtDayId","intervalLabelPrefix","intervalCodePrefix","intervalsDone","updatePropertyValues","property","newValue","propTypeIds","PropertyTypeIds","value","from","propertyTypeId","s","valueStrings","b","map","i","d","dt","dayId","t","filter","tag","tagLabel","tagId","e","entity","entityId","r","investment","inv","investmentId","resource","resourceId","user","concat","fullName","primaryEmail","userId","GetDataTypeByPropertyType","String","LongText","Url","Integer","Decimal","Currency","Boolean","Html","TagRef","EntityRef","InvestmentRef","ContactRef","NoteRef","TransactionRef","UserRef","TouchUpValueStringByPropertyType","propValue","updatePropertyValuesWithModelEnv","item","modelEnv","rawValue","tagSet","tagSets","tryGetById","tagRefTagSetId","tryGetTagById","getEntityById","invId","tryGetInvestmentByResourceId","users","idToItemMap","yesterday","relativeTo","offset","AsSpecified","toUtcTimestamp","timestamp","UTC","getHours","getMinutes","getSeconds","getMilliseconds","DecimalHelper","isNull","obj","number","numberStr","trim","isNullOrZero","decimalStringAsNumber","negate","negatedNumberStr","slice","getScale","decimalFound","scale","index","ch","_decimalSeparator","treatNullAsZero","numberOnlyStr","parseFloat","clampNumberToScaleAsString","decimalIndex","indexOf","currentScale","originalNumberStr","newLength","needToRound","firstDigitRemoved","substr","addOneToTheStart","charArray","split","co","fromCharCode","charCodeAt","splice","join","fixupThousandsSeparatorAsNumberString","numberAfterDecimal","lastNonZeroIndexAfterDecimal","digitsBeforeDecimal","finalNumberStr","numberBeforeDecimal","leftInBlock","_thousandsSeparator","pop","setTrailingZeros","numberString","numberStringParts","Number","toFixed","cleanNumberInputString","replace","FormatterHelper","getNumberFormatter","key","JSON","stringify","formatters","Intl","NumberFormat","minimumFractionDigits","decimalPlaces","maximumFractionDigits","style","getBasicNumberFormatter","getWholeNumberFormatter","getPercentageFormatter","__assign","getCurrencyScalarFormatter","fourFractionalDigitFormatter","sixFractionalDigitFormatter","eightFractionalDigitFormatter","scalar","ModelEnvironment","entityIdToEntityMap","entityList","investmentIdToInvestmentMap","investmentList","resourceIdToResourceMap","ownerIdToInvestmentLookup","holdingIdToInvestmentLookup","currencies","Models","IdAndCodeObjectIndex","currencyPairs","exposureProfiles","propertyDefinitions","labelHelper","ModelEnvironmentLabelHelper","prototype","tryGetEntityByResourceId","getResourceById","id","getInvestmentById","getInvestmentsForOwnerId","self","resultList","getInvestmentsForHoldingId","doesEntityOwnOtherEntity","otherEntityId","found","holdingId","mergeEnvironmentData","newModelEnvironment","itemList","addOrReplace","tagSet_1","propDef_1","_k","_l","newEntity","_addEntity","_m","_o","newInvestment","_addInvestment","_p","_q","userData","_r","_s","_t","_u","_v","_w","tagSetData","TagSet","_x","_y","_z","_0","propDefData","propDef","PropertyDefinition","entities","_1","_2","investments","_3","_4","_5","_6","User","ownerId","ModelEnvironmentHelper","isNotNull","forEachChildInvestment","callback","lookThroughAggregateViews","maxLookThroughDepth","internalForEachChildInvestment","depth","childInvestments","childInvestments_1","childInvestment","holding","SpecialEntityTypeIds","isAggregateView","seTypeId","rootEntityId","modelEnvironment","getEntityLabel","entityOrEntityId","getInvestmentLabel","investmentOrInvestmentId","getResourceLabel","resourceOrResourceId","getCurrencyCodeLabel","currencyOrCurrencyId","currency","getPropertyDefinitionLabel","propDefOrpropDefId","allowMultiple","isStaticOverTime","category","getNameForPropertyTypeId","ResourceTypeIds","getName","resourceTypeId","isDrawdownFund","DrawdownFund","ExternalDrawdownFund","AggregateView","AggregateCashView","SelectionSetHelper","unionAssetListWithSelectionSet","assetList","selectionSetRef","resourceIds","assetList_1","asset","unionResourceIdsWithSelectionSet","assetListBlock","blockType","fixedAssetListResourceIds","unionSelectionSetRef","custom","blocks","mods","op","set","isLoginDisabled","codeToItemMap","_addToIndexMaps","tryGetByCode","add","removeById","Tag","tagData","childTags","level","tagOrder","parentTagId","getParentTag","getLevel","levelIndex","parentTag","getLowestLevel","getLevelLabel","levelTag","isInBranch","branchTag","maxLevel","tags","rootTags","rootTagData","rootTag","_loadTagData","flatTagData","max","childTagObjects","childTagData","childTag","tryGetTagByCode","getMaxLevel","getLevelInfoGetter","groupValue","parent"],"mappings":"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","file":"InvData.min.js","sourcesContent":["namespace InvData.Util.DateIndexHelper {\r\n\r\n export var _daysInMonths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n export var _daysInMonthsLeapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\r\n export var _monthNames = [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"];\r\n export var _monthShortNames = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\r\n export const _paMinDateId = 0;\r\n export const _paMaxDateId = 91310;\r\n\r\n export function _isLeapYear(year: number): boolean {\r\n if ((year % 400) == 0) {\r\n return true;\r\n }\r\n else if ((year % 100) == 0) {\r\n return false;\r\n }\r\n else if ((year % 4) == 0) {\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n }\r\n\r\n export function _daysInYear(year: number): number {\r\n if (DateIndexHelper._isLeapYear(year)) {\r\n return 366;\r\n }\r\n else {\r\n return 365;\r\n }\r\n }\r\n\r\n export function getDaysInMonth(dateOrDateIndex: Date | number): number {\r\n var date;\r\n if (dateOrDateIndex instanceof Date) {\r\n date = dateOrDateIndex;\r\n }\r\n else {\r\n date = DateIndexHelper.getDateFromDateIndex(dateOrDateIndex);\r\n }\r\n\r\n var year = date.getFullYear();\r\n var month = date.getMonth();\r\n\r\n var dayCountsToUse;\r\n if (DateIndexHelper._isLeapYear(year)) {\r\n dayCountsToUse = DateIndexHelper._daysInMonthsLeapYear;\r\n }\r\n else {\r\n dayCountsToUse = DateIndexHelper._daysInMonths;\r\n }\r\n\r\n var daysInMonth = dayCountsToUse[month];\r\n return daysInMonth;\r\n }\r\n\r\n export function isLastDayInMonth(dateOrDateIndex: Date | number): boolean {\r\n var date;\r\n if (dateOrDateIndex instanceof Date) {\r\n date = dateOrDateIndex;\r\n }\r\n else {\r\n date = DateIndexHelper.getDateFromDateIndex(dateOrDateIndex);\r\n }\r\n\r\n var day = date.getDate();\r\n\r\n var daysInMonth = DateIndexHelper.getDaysInMonth(date);\r\n\r\n return day == daysInMonth;\r\n }\r\n\r\n export function getDateIndexFromDate(date: Date): number {\r\n // TODO: Replace with method that does not need to count through the years.\r\n return DateIndexHelper.getDateIndexFromDateUsingSlowMethod(date);\r\n }\r\n\r\n export function getDateIndexFromDateUsingSlowMethod(date: Date): number {\r\n if (!date) {\r\n return null;\r\n }\r\n\r\n var year = date.getFullYear();\r\n if (year < 1900) {\r\n throw \"Years less than 1900 are not supported.\";\r\n }\r\n else if (year > 2200) {\r\n throw \"Years greater than 2200 are not supported.\";\r\n }\r\n\r\n var days = 0;\r\n\r\n var yearCo = 1900;\r\n while (yearCo < year) {\r\n days += DateIndexHelper._daysInYear(yearCo);\r\n yearCo++;\r\n }\r\n\r\n var month = date.getMonth();\r\n var dayOfMonth = date.getDate();\r\n\r\n var daysInMonthToUse = DateIndexHelper._isLeapYear(year) ? DateIndexHelper._daysInMonthsLeapYear : DateIndexHelper._daysInMonths;\r\n\r\n var monthCo = 0;\r\n while (monthCo < month) {\r\n days += daysInMonthToUse[monthCo];\r\n monthCo++;\r\n }\r\n\r\n days += (dayOfMonth - 1);\r\n\r\n return days;\r\n }\r\n\r\n export function getTodayLastYear(): Date {\r\n let now = new Date();\r\n let month = now.getMonth();\r\n let day = now.getDate();\r\n if (month == 1 && day == 29) {\r\n day--;\r\n }\r\n\r\n return new Date(now.getFullYear() - 1, month, day);\r\n }\r\n\r\n export function getDateIndexForToday(): number {\r\n return DateIndexHelper.getDateIndexFromDate(new Date());\r\n }\r\n\r\n export function getDateFromDateIndex(dateIndex: number): Date {\r\n // TODO: Check for null too?\r\n if (dateIndex == undefined) {\r\n return null;\r\n }\r\n\r\n // TODO: Replace with method that does not need to count through the years.\r\n return DateIndexHelper.getDateFromDateIndexUsingSlowMethod(dateIndex);\r\n }\r\n\r\n export function getDateFromDateIndexUsingSlowMethod(dateIndex: number): Date {\r\n if (dateIndex < 0) {\r\n throw \"Date indexes less than 0 are not supported (year 1899 and before).\";\r\n }\r\n else if (dateIndex > 91310) {\r\n throw \"Date indexes greater than 91310 are not supported (year 2150 and beyond).\";\r\n }\r\n\r\n var days = 0;\r\n\r\n var year = 1900;\r\n\r\n while (true) {\r\n var daysInYear = DateIndexHelper._daysInYear(year);\r\n var daysAfterThisYear = days + daysInYear;\r\n if (daysAfterThisYear >= dateIndex) {\r\n break;\r\n }\r\n\r\n days = daysAfterThisYear;\r\n year++;\r\n }\r\n\r\n var daysInMonthToUse = DateIndexHelper._isLeapYear(year) ? DateIndexHelper._daysInMonthsLeapYear : DateIndexHelper._daysInMonths;\r\n\r\n var month = 0;\r\n\r\n while (true) {\r\n var daysInMonth = daysInMonthToUse[month];\r\n var daysAfterThisMonth = days + daysInMonth;\r\n if (daysAfterThisMonth >= dateIndex) {\r\n break;\r\n }\r\n\r\n days = daysAfterThisMonth;\r\n month++;\r\n }\r\n\r\n return new Date(year, month, 1 + (dateIndex - days));\r\n }\r\n\r\n export function formatDateAsString(date: Date): string {\r\n // TODO: Check for null too?\r\n if (date == undefined) {\r\n return \"\";\r\n }\r\n\r\n var year = date.getFullYear();\r\n var month = date.getMonth() + 1;\r\n var day = date.getDate();\r\n\r\n var dateStr = year.toString() + \"-\" + ((month < 10) ? (\"0\" + month) : month) + \"-\" + ((day < 10) ? (\"0\" + day) : day);\r\n return dateStr;\r\n }\r\n\r\n export function formatDateIndexAsDateString(dateIndex: number): string {\r\n\r\n if (dateIndex < this._paMinDateId || dateIndex > this._paMaxDateId) {\r\n return \"Invalid Date. DayId: \" + dateIndex;\r\n }\r\n\r\n var date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n return DateIndexHelper.formatDateAsString(date);\r\n }\r\n\r\n export function getDateOfLastDayInMonth(dateOrDateIndex: Date | number): Date {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n date = DateIndexHelper.getDateFromDateIndex(dateOrDateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n // TODO: Check for null too?\r\n if (date == undefined) {\r\n return null;\r\n }\r\n\r\n var year = date.getFullYear();\r\n var daysInMonthToUse = DateIndexHelper._isLeapYear(year) ? DateIndexHelper._daysInMonthsLeapYear : DateIndexHelper._daysInMonths;\r\n var month = date.getMonth();\r\n\r\n return new Date(year, month, daysInMonthToUse[month]);\r\n }\r\n\r\n export function getDateIndexOfLastDayInMonth(dateOrDateIndex: Date | number): number {\r\n var lastDayOfMonth = DateIndexHelper.getDateOfLastDayInMonth(dateOrDateIndex);\r\n var dayId = DateIndexHelper.getDateIndexFromDate(lastDayOfMonth);\r\n return dayId;\r\n }\r\n\r\n export function getDateIndexOfLastDayInPreviousMonth(dateOrDateIndex: Date | number): number {\r\n var date;\r\n var dateIndex;\r\n if (typeof dateOrDateIndex == \"number\") {\r\n dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n dateIndex = DateIndexHelper.getDateIndexFromDate(date);\r\n }\r\n\r\n var dayOfMonth = date.getDate();\r\n var lastDayOfPrevMonth = dateIndex - dayOfMonth;\r\n\r\n return lastDayOfPrevMonth;\r\n }\r\n\r\n export function getDateIndexOfLastDayInPreviousQuarter(dateOrDateIndex: Date | number): number {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n var year = date.getFullYear();\r\n var month = date.getMonth();\r\n\r\n // Determine first day of quarter. Get the date index and go back one day.\r\n if (month <= 2) {\r\n month = 0;\r\n }\r\n else if (month <= 5) {\r\n month = 3;\r\n }\r\n else if (month <= 8) {\r\n month = 6;\r\n }\r\n else if (month <= 11) {\r\n month = 9;\r\n }\r\n\r\n var firstDayDate = new Date(year, month, 1);\r\n\r\n var firstDayDayIndex = DateIndexHelper.getDateIndexFromDate(firstDayDate);\r\n var prevQuarterEndDayId = firstDayDayIndex - 1;\r\n return prevQuarterEndDayId;\r\n }\r\n\r\n export function getDateIndexOfLastDayInQuarter(dateOrDateIndex: Date | number): number {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n var year = date.getFullYear();\r\n var month = date.getMonth();\r\n\r\n // Determine first day of quarter. Get the date index and go back one day.\r\n if (month <= 2) {\r\n month = 0;\r\n }\r\n else if (month <= 5) {\r\n month = 3;\r\n }\r\n else if (month <= 8) {\r\n month = 6;\r\n }\r\n else if (month <= 11) {\r\n month = 9;\r\n }\r\n\r\n var firstDayDate = new Date(year, month + 3, 1);\r\n\r\n var firstDayDayIndex = DateIndexHelper.getDateIndexFromDate(firstDayDate);\r\n var quarterEndDayId = firstDayDayIndex - 1;\r\n return quarterEndDayId;\r\n }\r\n\r\n export function getDateIndexOfLastDayInPreviousYear(dateOrDateIndex: Date | number): number {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n var year = date.getFullYear();\r\n\r\n var endOfLastYear = new Date(year - 1, 11, 31);\r\n return DateIndexHelper.getDateIndexFromDate(endOfLastYear);\r\n }\r\n\r\n export function getDateIndexOfLastDayInYear(dateOrDateIndex: Date | number): number {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n var year = date.getFullYear();\r\n\r\n var endOfLastYear = new Date(year, 11, 31);\r\n return DateIndexHelper.getDateIndexFromDate(endOfLastYear);\r\n }\r\n\r\n export function getMonthNameForMonthOffset(monthOffset: number) {\r\n return this._monthNames[monthOffset]; \r\n }\r\n\r\n export function formatDateAsMonthNameYearString(date: Date): string {\r\n return this._monthNames[date.getMonth()] + \" \" + date.getFullYear();\r\n }\r\n\r\n export function formatAsShortMonthNameYear(dateOrDateIndex: Date | number): string {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n } \r\n\r\n return this._monthShortNames[date.getMonth()] + \" \" + date.getFullYear();\r\n }\r\n\r\n export function formatAsShortMonthDayYear(dateOrDateIndex: Date | number): string {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n } \r\n\r\n return this._monthShortNames[date.getMonth()] + \" \" + date.getDate() + \", \" + date.getFullYear();\r\n }\r\n\r\n export function formatAsQuarterYearString(dateOrDateIndex: Date | number): string {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n // quarter year\r\n var quarter = (1 + (Math.floor(date.getMonth() / 3))).toString();\r\n return quarter + \"Q \" + date.getFullYear().toString();\r\n }\r\n\r\n\r\n /**\r\n * Retrieve last day in the fiscal year.\r\n * @param dateOrDateIndex\r\n * @param fiscalYearStartMonth - January = 1\r\n */\r\n export function getDateIndexOfLastDayInFiscalYear(dateOrDateIndex: Date | number, fiscalYearStartMonth: number): number {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n let year = date.getFullYear();\r\n let monthNumber = 1 + date.getMonth();\r\n if (fiscalYearStartMonth === 1) {\r\n // We're going to go forward.\r\n let endDate = new Date(year, 11, 31);\r\n let endDayId = getDateIndexFromDate(endDate);\r\n return endDayId;\r\n }\r\n else { \r\n let fiscalYearStartMonthOffset = fiscalYearStartMonth - 1;\r\n if (monthNumber >= fiscalYearStartMonth) {\r\n // Going forward into next year.\r\n let endMonthFirstDay = new Date(year + 1, fiscalYearStartMonthOffset - 1, 1);\r\n let endDate = new Date(endMonthFirstDay.getFullYear(), endMonthFirstDay.getMonth(), DateIndexHelper.getDaysInMonth(endMonthFirstDay));\r\n let endDayId = getDateIndexFromDate(endDate);\r\n return endDayId;\r\n }\r\n else {\r\n // Stop this year.\r\n let endMonthFirstDay = new Date(year, fiscalYearStartMonthOffset - 1, 1);\r\n let endDate = new Date(endMonthFirstDay.getFullYear(), endMonthFirstDay.getMonth(), DateIndexHelper.getDaysInMonth(endMonthFirstDay));\r\n let endDayId = getDateIndexFromDate(endDate);\r\n return endDayId;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Retrieve last day in the previous fiscal year.\r\n * @param dateOrDateIndex\r\n * @param fiscalYearStartMonth - January = 1\r\n */\r\n export function getDateIndexOfLastDayInPreviousFiscalYear(dateOrDateIndex: Date | number, fiscalYearStartMonth: number): number {\r\n var date;\r\n if (typeof dateOrDateIndex === \"number\") {\r\n var dateIndex = dateOrDateIndex;\r\n date = DateIndexHelper.getDateFromDateIndex(dateIndex);\r\n }\r\n else {\r\n date = dateOrDateIndex;\r\n }\r\n\r\n let year = date.getFullYear();\r\n let monthNumber = 1 + date.getMonth();\r\n if (fiscalYearStartMonth === 1) {\r\n // We're going to directly to end of last year.\r\n let endDate = new Date(year - 1, 11, 31);\r\n let endDayId = getDateIndexFromDate(endDate);\r\n return endDayId;\r\n }\r\n else {\r\n let fiscalYearStartMonthOffset = fiscalYearStartMonth - 1;\r\n if (monthNumber >= fiscalYearStartMonth) {\r\n // Stop this year.\r\n let endMonthFirstDay = new Date(year, fiscalYearStartMonthOffset - 1, 1);\r\n let endDate = new Date(endMonthFirstDay.getFullYear(), endMonthFirstDay.getMonth(), DateIndexHelper.getDaysInMonth(endMonthFirstDay));\r\n let endDayId = getDateIndexFromDate(endDate);\r\n return endDayId;\r\n }\r\n else {\r\n // Stop the prior year.\r\n let endMonthFirstDay = new Date(year - 1, fiscalYearStartMonthOffset - 1, 1);\r\n let endDate = new Date(endMonthFirstDay.getFullYear(), endMonthFirstDay.getMonth(), DateIndexHelper.getDaysInMonth(endMonthFirstDay));\r\n let endDayId = getDateIndexFromDate(endDate);\r\n return endDayId;\r\n }\r\n }\r\n }\r\n\r\n\r\n export function countMonths(fromDayId: number, toDayId: number, excludePartialMonths?: boolean) {\r\n if (fromDayId && toDayId) {\r\n if (fromDayId == toDayId) {\r\n return 0;\r\n }\r\n\r\n let isNegative = false;\r\n if (fromDayId > toDayId) {\r\n isNegative = true;\r\n let holder = fromDayId;\r\n fromDayId = toDayId;\r\n toDayId = holder;\r\n }\r\n\r\n let monthCount = 0;\r\n let firstMonthEndDayd = InvData.DayId.forDateIndex(fromDayId, InvData.RelativeDate.MonthEnd, 0);\r\n let lastMonthEndDayId = InvData.DayId.forDateIndex(toDayId, InvData.RelativeDate.MonthEnd, 0);\r\n\r\n if (fromDayId < firstMonthEndDayd) {\r\n if (!excludePartialMonths) {\r\n monthCount++;\r\n }\r\n }\r\n\r\n // Really big cut off to stop inadvertent bad data request causing near-infinite loop.\r\n let maxMonthCount = 30000;\r\n\r\n let nextMonthEndDayId = InvData.DayId.forDateIndex(firstMonthEndDayd, InvData.RelativeDate.MonthEnd, 1);\r\n while (nextMonthEndDayId <= lastMonthEndDayId) {\r\n if (!excludePartialMonths) {\r\n monthCount++;\r\n }\r\n else if (toDayId >= nextMonthEndDayId) {\r\n monthCount++;\r\n }\r\n\r\n if (monthCount > maxMonthCount) {\r\n return null;\r\n }\r\n\r\n nextMonthEndDayId = InvData.DayId.forDateIndex(nextMonthEndDayId, InvData.RelativeDate.MonthEnd, 1);\r\n }\r\n\r\n return isNegative ? -monthCount : monthCount;\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n} \r\n","namespace InvData.Util {\r\n\r\n export interface IntervalSetOptions {\r\n oneDay?: boolean;\r\n mtd?: boolean;\r\n qtd?: boolean;\r\n ytd?: boolean;\r\n fiscalYtd?: boolean;\r\n\r\n /**\r\n * Create intervals going through as-of-day and back-dating the calendar month (if the as-of-day is mid-month, the partial month will count as a single month).\r\n */\r\n sinceMonthsBack?: number[];\r\n\r\n /**\r\n * Create intervals going through as of day and back 12 months (if as of day is mid-month, the 12th month will be a partial month for the\r\n * final year).\r\n */\r\n sinceYearsBack?: number[];\r\n\r\n sinceDayIds?: number[];\r\n sinceInception?: boolean;\r\n sinceFirstFullMonth?: boolean;\r\n sinceFirstFullQuarter?: boolean;\r\n\r\n\r\n /**\r\n * Create for intervals for the individual calendar months preceeding current date, starting with the month before current date.\r\n */\r\n consecutiveCalendarMonthsBack?: number;\r\n\r\n /**\r\n * Create for intervals for the individual calendar quarters preceeding current date, starting with the quarter before current date.\r\n */\r\n consecutiveCalendarQuartersBack?: number;\r\n\r\n /**\r\n * Create for intervals for the individual calendar years preceeding current date, starting with the year before current date.\r\n */\r\n consecutiveCalendarYearsBack?: number;\r\n\r\n /**\r\n * Create for intervals for the individual fiscal years preceeding current date, starting with the fiscal year before current date.\r\n */\r\n consecutiveFiscalYearsBack?: number;\r\n\r\n /**\r\n * For consecutive intervals, if the as of date matches the end of a period, include that interval in the consecutive interval collection.\r\n * By default, the consecutive intervals start going back from the end of the prior complete interval.\r\n */\r\n includeFullFinalIntervalForConsecutiveIntervals?: boolean;\r\n\r\n /**\r\n * Create rolling intervals spanning a certain number of months.\r\n */\r\n rollingIntervals?: IntervalSetRollingInterval[];\r\n\r\n /**\r\n * Create daily intervals going back from the to date.\r\n */\r\n daily?: IntervalSetDaily;\r\n\r\n /**\r\n * Create intervals starting at some point in the past and rolling towards the as-of-date.\r\n */\r\n sinceDateCumulativeIntervals?: IntervalSetSinceDateCumulativeInterval[];\r\n }\r\n\r\n export interface IntervalSetRollingInterval {\r\n intervalCount?: number;\r\n monthSpan?: number;\r\n includeFinalPartialMonth?: boolean\r\n endToEnd?: boolean;\r\n }\r\n\r\n export interface IntervalSetDaily {\r\n daysBack?: number; \r\n }\r\n\r\n export interface IntervalSetSinceDateCumulativeInterval {\r\n sinceDayId?: number;\r\n\r\n /**\r\n * Create the intervals going forward starting with this from date (defaults to sinceDayId, but must be specified\r\n * for since inception intervals).\r\n */\r\n startingAtDayId?: number;\r\n\r\n advanceBy?: \"Month\" | \"Year\" | \"Quarter\";\r\n }\r\n\r\n\r\n export interface IntervalSetResult {\r\n codeToIntervalInfoMap: { [code: string]: IntervalInfo };\r\n intervalRequests: IntervalRequestData[];\r\n }\r\n\r\n export interface IntervalRequestData {\r\n code: string;\r\n fromDayId: number;\r\n toDayId: number;\r\n isSinceFirstFullMonth?: boolean;\r\n isSinceFirstFullQuarter?: boolean;\r\n }\r\n\r\n export interface IntervalInfo {\r\n label: string;\r\n timeRangeDescription?: string;\r\n intervalRequest: IntervalRequestData;\r\n }\r\n\r\n export class IntervalSetGenerator {\r\n\r\n public static getIntervalSet(options: IntervalSetOptions, asOfDayId?: number): IntervalSetResult {\r\n if (!options) {\r\n options = {};\r\n }\r\n\r\n if (!asOfDayId) {\r\n asOfDayId = InvData.DayId.today();\r\n }\r\n \r\n let asOfDate = InvData.DayId.toDate(asOfDayId);\r\n\r\n let currentMonthEndDayId = InvData.DayId.forDate(asOfDate, InvData.RelativeDate.MonthEnd);\r\n let priorMonthEndDayId = InvData.DayId.forDate(asOfDate, InvData.RelativeDate.PriorMonthEnd);\r\n let priorQuarterEndDayId = InvData.DayId.forDate(asOfDate, InvData.RelativeDate.PriorQuarterEnd);\r\n let priorYearEndDayId = InvData.DayId.forDate(asOfDate, InvData.RelativeDate.PriorYearEnd);\r\n\r\n let isAsOfDayOnMonthEnd = (asOfDayId === currentMonthEndDayId);\r\n\r\n let fiscalYearStartMonth = 1;\r\n if ((window as any).Solovis) {\r\n let solovisAny = (window as any).Solovis as any;\r\n if (solovisAny && solovisAny.Custom && solovisAny.Custom.ModelDefaults && solovisAny.Custom.ModelDefaults.fiscalYearStartMonth) {\r\n fiscalYearStartMonth = solovisAny.Custom.ModelDefaults.fiscalYearStartMonth;\r\n }\r\n }\r\n\r\n let codeToIntervalInfoMap: { [code: string]: IntervalInfo } = {};\r\n let intervalRequests = [];\r\n\r\n let saveInterval = (interval: IntervalInfo) => {\r\n if (interval.intervalRequest.fromDayId) {\r\n interval.timeRangeDescription = \"Interval goes from after end of \"\r\n + InvData.DayId.format(interval.intervalRequest.fromDayId)\r\n + \" through \"\r\n + InvData.DayId.format(interval.intervalRequest.toDayId)\r\n + \".\";\r\n }\r\n else {\r\n interval.timeRangeDescription = \"Interval goes from inception through \" \r\n + InvData.DayId.format(interval.intervalRequest.toDayId)\r\n + \".\";\r\n }\r\n\r\n if (!codeToIntervalInfoMap[interval.intervalRequest.code]) {\r\n codeToIntervalInfoMap[interval.intervalRequest.code] = interval;\r\n intervalRequests.push(interval.intervalRequest);\r\n }\r\n };\r\n\r\n if (options.oneDay) {\r\n saveInterval({\r\n label: \"1-Day\",\r\n intervalRequest: {\r\n code: \"OneDay\",\r\n fromDayId: asOfDayId - 1,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n\r\n if (options.mtd) {\r\n saveInterval({\r\n label: \"MTD\",\r\n intervalRequest: {\r\n code: \"MTD\",\r\n fromDayId: priorMonthEndDayId,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n\r\n if (options.qtd) {\r\n saveInterval({\r\n label: \"QTD\",\r\n intervalRequest: {\r\n code: \"QTD\",\r\n fromDayId: priorQuarterEndDayId,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n\r\n if (options.ytd) {\r\n saveInterval({\r\n label: \"YTD\",\r\n intervalRequest: {\r\n code: \"YTD\",\r\n fromDayId: priorYearEndDayId,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n\r\n if (options.fiscalYtd) { \r\n let intervalFromDayId = InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousFiscalYear(asOfDate, fiscalYearStartMonth);\r\n\r\n saveInterval({\r\n label: \"FYTD\",\r\n intervalRequest: {\r\n code: \"FYTD\",\r\n fromDayId: intervalFromDayId,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n\r\n if (options.sinceMonthsBack) {\r\n let sinceMonthsBackSeenSet: any = {};\r\n for (let monthsBack of options.sinceMonthsBack) {\r\n // Only include each monthsBack once.\r\n if (!sinceMonthsBackSeenSet[monthsBack]) {\r\n sinceMonthsBackSeenSet[monthsBack] = true;\r\n\r\n let intervalFromDayId = InvData.DayId.forDateIndex(priorMonthEndDayId, InvData.RelativeDate.MonthEnd, (-1 * monthsBack) + 1);\r\n\r\n saveInterval({\r\n label: \"\" + monthsBack + \"M\",\r\n intervalRequest: {\r\n code: \"SinceMonthsBack_\" + monthsBack,\r\n fromDayId: intervalFromDayId,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (options.sinceYearsBack) {\r\n let sinceYearsBackSeenSet: any = {};\r\n for (let yearsBack of options.sinceYearsBack) {\r\n // Only include each yearsBack once.\r\n if (!sinceYearsBackSeenSet[yearsBack]) {\r\n sinceYearsBackSeenSet[yearsBack] = true;\r\n\r\n let intervalFromDayId = InvData.DayId.forDateIndex(priorMonthEndDayId, InvData.RelativeDate.MonthEnd, (-12 * yearsBack) + 1);\r\n\r\n saveInterval({\r\n label: \"\" + yearsBack + \"Y\",\r\n intervalRequest: {\r\n code: \"SinceYearsBack_\" + yearsBack,\r\n fromDayId: intervalFromDayId,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n if (options.sinceDayIds) {\r\n let sinceDayIdSeenSet: any = {};\r\n for (let sinceDayId of options.sinceDayIds) {\r\n // Only include each since day id once.\r\n if (!sinceDayIdSeenSet[sinceDayId]) {\r\n sinceDayIdSeenSet[sinceDayId] = true;\r\n\r\n let sinceDateStr = InvData.DayId.format(sinceDayId);\r\n\r\n saveInterval({\r\n label: \"Since \" + sinceDateStr,\r\n intervalRequest: {\r\n code: \"SinceDay_\" + sinceDayId,\r\n fromDayId: sinceDayId,\r\n toDayId: asOfDayId\r\n } \r\n });\r\n } \r\n }\r\n }\r\n\r\n if (options.sinceInception) {\r\n saveInterval({\r\n label: \"Since Inception\",\r\n intervalRequest: {\r\n code: \"SinceInception\",\r\n fromDayId: null,\r\n toDayId: asOfDayId\r\n }\r\n });\r\n }\r\n\r\n if (options.sinceFirstFullMonth) {\r\n saveInterval({\r\n label: \"Since First Full Month\",\r\n intervalRequest: {\r\n code: \"SinceFirstFullMonth\",\r\n fromDayId: null,\r\n toDayId: asOfDayId,\r\n isSinceFirstFullMonth: true\r\n }\r\n });\r\n }\r\n\r\n if (options.sinceFirstFullQuarter) {\r\n saveInterval({\r\n label: \"Since First Full Quarter\",\r\n intervalRequest: {\r\n code: \"SinceFirstFullQuarter\",\r\n fromDayId: null,\r\n toDayId: asOfDayId,\r\n isSinceFirstFullQuarter: true\r\n }\r\n });\r\n }\r\n\r\n if (options.consecutiveCalendarMonthsBack && options.consecutiveCalendarMonthsBack > 0) {\r\n let lastFromDayId = priorMonthEndDayId;\r\n if (options.includeFullFinalIntervalForConsecutiveIntervals) {\r\n let followingIntervalEndDayId = InvData.DayId.forDateIndex(lastFromDayId + 1, InvData.RelativeDate.MonthEnd);\r\n if (followingIntervalEndDayId === asOfDayId) {\r\n lastFromDayId = followingIntervalEndDayId;\r\n }\r\n }\r\n\r\n for (let monthBackCo = 1; monthBackCo <= options.consecutiveCalendarMonthsBack; monthBackCo++) {\r\n let intervalFromDayId = InvData.DayId.forDateIndex(lastFromDayId, InvData.RelativeDate.PriorMonthEnd);\r\n\r\n saveInterval({\r\n label: InvData.Util.DateIndexHelper.formatAsShortMonthNameYear(lastFromDayId),\r\n intervalRequest: {\r\n code: \"CalendarMonthBack_\" + monthBackCo,\r\n fromDayId: intervalFromDayId,\r\n toDayId: lastFromDayId\r\n }\r\n });\r\n\r\n lastFromDayId = intervalFromDayId;\r\n }\r\n }\r\n\r\n if (options.consecutiveCalendarQuartersBack && options.consecutiveCalendarQuartersBack > 0) {\r\n let lastFromDayId = priorQuarterEndDayId;\r\n if (options.includeFullFinalIntervalForConsecutiveIntervals) {\r\n let followingIntervalEndDayId = InvData.DayId.forDateIndex(lastFromDayId + 1, InvData.RelativeDate.QuarterEnd);\r\n if (followingIntervalEndDayId === asOfDayId) {\r\n lastFromDayId = followingIntervalEndDayId;\r\n }\r\n }\r\n\r\n for (let quarterBackCo = 1; quarterBackCo <= options.consecutiveCalendarQuartersBack; quarterBackCo++) {\r\n let intervalFromDayId = InvData.DayId.forDateIndex(lastFromDayId, InvData.RelativeDate.PriorQuarterEnd);\r\n\r\n saveInterval({\r\n label: InvData.Util.DateIndexHelper.formatAsQuarterYearString(lastFromDayId),\r\n intervalRequest: {\r\n code: \"CalendarQuarterBack_\" + quarterBackCo,\r\n fromDayId: intervalFromDayId,\r\n toDayId: lastFromDayId\r\n }\r\n });\r\n\r\n lastFromDayId = intervalFromDayId;\r\n }\r\n }\r\n\r\n if (options.consecutiveCalendarYearsBack && options.consecutiveCalendarYearsBack > 0) {\r\n let consecutiveCalendarYearsBack = typeof (options.consecutiveCalendarYearsBack) === \"number\" ? options.consecutiveCalendarYearsBack : parseInt((options.consecutiveCalendarYearsBack as any) as string);\r\n\r\n let year = asOfDate.getFullYear();\r\n let startingYearBackCo = 1;\r\n if (options.includeFullFinalIntervalForConsecutiveIntervals) {\r\n let asOfYearEndDayId = InvData.DayId.forDateIndex(asOfDayId, InvData.RelativeDate.YearEnd);\r\n if (asOfYearEndDayId === asOfDayId) {\r\n startingYearBackCo = 0;\r\n }\r\n }\r\n\r\n let endYearCo = startingYearBackCo + consecutiveCalendarYearsBack;\r\n for (let yearBackCo = startingYearBackCo; yearBackCo < endYearCo; yearBackCo++) {\r\n let intervalYear = year - yearBackCo;\r\n \r\n saveInterval({\r\n label: \"\" + intervalYear,\r\n intervalRequest: {\r\n code: \"CalendarYearBack_\" + yearBackCo,\r\n fromDayId: InvData.DayId.forDate(new Date(intervalYear - 1, 11, 31)),\r\n toDayId: InvData.DayId.forDate(new Date(intervalYear, 11, 31))\r\n }\r\n });\r\n } \r\n }\r\n\r\n if (options.consecutiveFiscalYearsBack && options.consecutiveFiscalYearsBack > 0) {\r\n let lastFromDayId = InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousFiscalYear(asOfDate, fiscalYearStartMonth);\r\n if (options.includeFullFinalIntervalForConsecutiveIntervals) {\r\n let followingIntervalEndDayId = InvData.Util.DateIndexHelper.getDateIndexOfLastDayInFiscalYear(lastFromDayId + 1, fiscalYearStartMonth);\r\n if (followingIntervalEndDayId === asOfDayId) {\r\n lastFromDayId = followingIntervalEndDayId;\r\n }\r\n }\r\n\r\n for (let fiscalYearBackCo = 1; fiscalYearBackCo <= options.consecutiveFiscalYearsBack; fiscalYearBackCo++) {\r\n let intervalFromDayId = InvData.DayId.forDateIndex(lastFromDayId, InvData.RelativeDate.MonthEnd, -12);\r\n let intervalToDate = InvData.DayId.toDate(lastFromDayId);\r\n let fiscalYear = intervalToDate.getFullYear();\r\n\r\n saveInterval({\r\n label: \"FY\" + fiscalYear,\r\n intervalRequest: {\r\n code: \"FiscalYearBack_\" + fiscalYearBackCo,\r\n fromDayId: intervalFromDayId,\r\n toDayId: lastFromDayId\r\n }\r\n });\r\n\r\n lastFromDayId = intervalFromDayId;\r\n }\r\n }\r\n\r\n if (options.rollingIntervals) {\r\n let monthSpanSeenSet: any = {};\r\n for (let rollingInterval of options.rollingIntervals) {\r\n let monthSpan = rollingInterval.monthSpan ? rollingInterval.monthSpan : 36;\r\n let monthSpanStr = \"\" + monthSpan + \"M\";\r\n\r\n let rollingPrefix: string;\r\n if (rollingInterval.endToEnd) {\r\n rollingPrefix = \"EndToEndRolling_\";\r\n }\r\n else {\r\n rollingPrefix = \"Rolling_\";\r\n }\r\n\r\n if (!monthSpanSeenSet[monthSpan]) {\r\n monthSpanSeenSet[monthSpan] = true;\r\n\r\n let nextIntervalNumber = 1;\r\n\r\n let nextToDayId = priorMonthEndDayId;\r\n \r\n // Add the rolling intervals.\r\n if (rollingInterval.includeFinalPartialMonth || isAsOfDayOnMonthEnd) {\r\n let rollingToDayId = asOfDayId;\r\n let rollingFromDayId = InvData.DayId.forDateIndex(currentMonthEndDayId, RelativeDate.MonthEnd, -monthSpan);\r\n let intervalNumber = nextIntervalNumber++;\r\n\r\n let intervalLabel;\r\n if (isAsOfDayOnMonthEnd) {\r\n intervalLabel = monthSpanStr + \" \" + InvData.Util.DateIndexHelper.formatAsShortMonthNameYear(asOfDayId);\r\n }\r\n else {\r\n intervalLabel = monthSpanStr + \" \" + InvData.Util.DateIndexHelper.formatAsShortMonthDayYear(asOfDayId);\r\n }\r\n\r\n saveInterval({\r\n label: intervalLabel,\r\n intervalRequest: {\r\n code: rollingPrefix + monthSpan + \"M_\" + intervalNumber,\r\n fromDayId: rollingFromDayId,\r\n toDayId: rollingToDayId\r\n }\r\n });\r\n\r\n if (rollingInterval.endToEnd) {\r\n nextToDayId = rollingFromDayId;\r\n }\r\n } \r\n\r\n if (rollingInterval.intervalCount > 1) {\r\n while (nextIntervalNumber <= rollingInterval.intervalCount) {\r\n let rollingToDayId = nextToDayId;\r\n let rollingFromDayId = InvData.DayId.forDateIndex(rollingToDayId, RelativeDate.MonthEnd, -monthSpan);\r\n let intervalNumber = nextIntervalNumber++;\r\n\r\n let intervalLabel = monthSpanStr + \" \" + InvData.Util.DateIndexHelper.formatAsShortMonthNameYear(rollingToDayId);\r\n \r\n saveInterval({\r\n label: intervalLabel,\r\n intervalRequest: {\r\n code: rollingPrefix + monthSpan + \"M_\" + intervalNumber,\r\n fromDayId: rollingFromDayId,\r\n toDayId: rollingToDayId\r\n }\r\n });\r\n\r\n if (rollingInterval.endToEnd) {\r\n nextToDayId = rollingFromDayId;\r\n }\r\n else {\r\n nextToDayId = InvData.DayId.forDateIndex(nextToDayId, RelativeDate.PriorMonthEnd);\r\n }\r\n }\r\n }\r\n } \r\n }\r\n }\r\n\r\n if (options.daily && options.daily.daysBack) {\r\n for (let daysBackCo = 0; daysBackCo < options.daily.daysBack; daysBackCo++) {\r\n let currentDayId = asOfDayId - daysBackCo;\r\n saveInterval({\r\n label: InvData.DayId.format(currentDayId),\r\n intervalRequest: {\r\n code: \"Daily_\" + daysBackCo,\r\n fromDayId: currentDayId - 1,\r\n toDayId: currentDayId\r\n }\r\n });\r\n }\r\n }\r\n \r\n if (options.sinceDateCumulativeIntervals) {\r\n // Add intervals that start at some date in past where \"To\" date steadily advances towards as-of-date.\r\n for (let sinceDateCumulativeInterval of options.sinceDateCumulativeIntervals) { \r\n let advanceDayId = (toDayId) => {\r\n let nextToDayId = toDayId;\r\n\r\n if (sinceDateCumulativeInterval.advanceBy === \"Month\") {\r\n let currentMonthEndDayId = InvData.DayId.forDateIndex(nextToDayId, RelativeDate.MonthEnd);\r\n if (currentMonthEndDayId === currentToDayId) {\r\n nextToDayId = InvData.DayId.forDateIndex(currentMonthEndDayId, RelativeDate.MonthEnd, 1);\r\n }\r\n else {\r\n nextToDayId = currentMonthEndDayId;\r\n }\r\n }\r\n else if (sinceDateCumulativeInterval.advanceBy === \"Quarter\") {\r\n let currentQuarterEndDayId = InvData.DayId.forDateIndex(nextToDayId, RelativeDate.QuarterEnd);\r\n if (currentQuarterEndDayId === currentToDayId) {\r\n nextToDayId = InvData.DayId.forDateIndex(currentQuarterEndDayId, RelativeDate.QuarterEnd, 1);\r\n }\r\n else {\r\n nextToDayId = currentQuarterEndDayId;\r\n }\r\n }\r\n else {\r\n // We only support Month and Year, so fallback to Year if invalid value appears here.\r\n let currentYearEndDayId = InvData.DayId.forDateIndex(nextToDayId, RelativeDate.YearEnd);\r\n if (currentYearEndDayId === currentToDayId) {\r\n nextToDayId = InvData.DayId.forDateIndex(currentYearEndDayId, RelativeDate.YearEnd, 1);\r\n }\r\n else {\r\n nextToDayId = currentYearEndDayId;\r\n }\r\n }\r\n\r\n if (nextToDayId > asOfDayId) {\r\n nextToDayId = asOfDayId;\r\n }\r\n\r\n return nextToDayId;\r\n };\r\n\r\n let currentToDayId;\r\n if (sinceDateCumulativeInterval.startingAtDayId) {\r\n currentToDayId = sinceDateCumulativeInterval.startingAtDayId;\r\n }\r\n else { \r\n currentToDayId = advanceDayId(sinceDateCumulativeInterval.sinceDayId); \r\n }\r\n\r\n let intervalLabelPrefix: string;\r\n let intervalCodePrefix: string;\r\n if (sinceDateCumulativeInterval.sinceDayId) {\r\n intervalLabelPrefix = \"Since \" + InvData.DayId.format(sinceDateCumulativeInterval.sinceDayId) + \" To \";\r\n intervalCodePrefix = \"SinceDateCumulative_\" + sinceDateCumulativeInterval.sinceDayId + \"_\";\r\n }\r\n else {\r\n intervalLabelPrefix = \"Since Inception To \";\r\n intervalCodePrefix = \"SinceDateCumulative_Inception_\";\r\n }\r\n\r\n let intervalsDone = false;\r\n while (currentToDayId <= asOfDayId && !intervalsDone) {\r\n if (sinceDateCumulativeInterval.sinceDayId !== currentToDayId) {\r\n saveInterval({\r\n label: intervalLabelPrefix + InvData.DayId.format(currentToDayId),\r\n intervalRequest: {\r\n code: intervalCodePrefix + currentToDayId,\r\n fromDayId: sinceDateCumulativeInterval.sinceDayId,\r\n toDayId: currentToDayId\r\n }\r\n });\r\n }\r\n\r\n if (currentToDayId >= asOfDayId) {\r\n // We have all of our intervals.\r\n intervalsDone = true;\r\n }\r\n else {\r\n currentToDayId = advanceDayId(currentToDayId); \r\n }\r\n }\r\n }\r\n }\r\n\r\n let result = {\r\n codeToIntervalInfoMap: codeToIntervalInfoMap,\r\n intervalRequests: intervalRequests\r\n };\r\n\r\n return result;\r\n }\r\n\r\n }\r\n\r\n}","namespace InvData.Util {\r\n export function updatePropertyValues(property: any, newValue: Array, fromDayId?: number) {\r\n const propTypeIds = InvData.PropertyTypeIds;\r\n\r\n property.value = {};\r\n property.value.from = fromDayId;\r\n // Set up valueStrings/HtmlList.\r\n switch (property.property.propertyTypeId) {\r\n case propTypeIds[\"String\"]:\r\n case propTypeIds[\"Html\"]:\r\n case propTypeIds[\"Url\"]:\r\n case propTypeIds[\"LongText\"]:\r\n property.value.s = newValue;\r\n property.valueStrings = property.value.s;\r\n break;\r\n\r\n case propTypeIds[\"Boolean\"]:\r\n property.value.b = newValue;\r\n property.valueStrings = property.value.b.map(function (b) {\r\n return b ? \"Yes\" : \"No\";\r\n });\r\n break;\r\n\r\n case propTypeIds[\"Integer\"]:\r\n property.value.i = newValue;\r\n property.valueStrings = property.value.i.map(function (i) {\r\n return i.toString();\r\n });\r\n break;\r\n\r\n case propTypeIds[\"Decimal\"]:\r\n case propTypeIds[\"Currency\"]:\r\n property.value.d = newValue;\r\n property.valueStrings = property.value.d.map(function (d) {\r\n return d.toString();\r\n });\r\n break;\r\n\r\n case propTypeIds[\"Date\"]:\r\n property.value.dt = newValue;\r\n property.valueStrings = property.value.dt.map(function (dayId) {\r\n return InvData.Util.DateIndexHelper.formatDateIndexAsDateString(dayId);\r\n });\r\n break;\r\n\r\n case propTypeIds[\"TagRef\"]: {\r\n property.value.t = newValue;\r\n property.valueStrings = property.value.t\r\n .filter((tag) => typeof tag !== \"number\")\r\n .map((tag) => tag.tagLabel);\r\n\r\n property.value.t = property.value.t.map((tag) =>\r\n typeof tag === \"number\" ? tag : tag.tagId\r\n );\r\n break;\r\n }\r\n\r\n case propTypeIds[\"EntityRef\"]: {\r\n property.value.e = newValue;\r\n property.valueStrings = property.value.e\r\n .filter((entity) => typeof entity !== \"number\")\r\n .map((entity) => entity.label);\r\n\r\n property.value.e = property.value.e.map((entity) =>\r\n typeof entity === \"number\" ? entity : entity.entityId\r\n );\r\n break;\r\n }\r\n\r\n case propTypeIds[\"InvestmentRef\"]: {\r\n property.value.r = newValue;\r\n property.valueStrings = property.value.r\r\n .filter((investment) => typeof investment !== \"number\")\r\n .map((investment) => investment.label);\r\n\r\n property.value.r = property.value.r.map((inv) =>\r\n typeof inv === \"number\" ? inv : inv.investmentId\r\n );\r\n break;\r\n }\r\n\r\n case propTypeIds[\"NoteRef\"]:\r\n case propTypeIds[\"ContactRef\"]:\r\n case propTypeIds[\"TransactionRef\"]: {\r\n property.value.r = newValue;\r\n property.valueStrings = property.value.r\r\n .filter((resource) => typeof resource !== \"number\")\r\n .map((resource) => resource.label);\r\n\r\n property.value.r = property.value.r.map((resource) =>\r\n typeof resource === \"number\" ? resource : resource.resourceId\r\n );\r\n break;\r\n }\r\n\r\n case propTypeIds[\"UserRef\"]: {\r\n property.value.i = newValue;\r\n property.valueStrings = property.value.i\r\n .filter((user) => typeof user !== \"number\")\r\n .map((user) => `${user.fullName} - ${user.primaryEmail}`);\r\n\r\n property.value.i = property.value.i.map((user) =>\r\n typeof user === \"number\" ? user : user.userId\r\n );\r\n break;\r\n }\r\n }\r\n }\r\n\r\n export function GetDataTypeByPropertyType(propertyTypeId: number): string {\r\n var propTypeIds = InvData.PropertyTypeIds;\r\n\r\n if (propertyTypeId === propTypeIds.String ||\r\n propertyTypeId === propTypeIds.LongText ||\r\n propertyTypeId === propTypeIds.Url) {\r\n return \"string\";\r\n }\r\n else if (propertyTypeId === propTypeIds.Integer ||\r\n propertyTypeId === propTypeIds.Decimal ||\r\n propertyTypeId === propTypeIds.Currency) {\r\n return \"number\";\r\n }\r\n else if (propertyTypeId === propTypeIds.Boolean) {\r\n return \"bool\";\r\n }\r\n else if (propertyTypeId === propTypeIds.Date) {\r\n return \"dayId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.Html) {\r\n return \"html\";\r\n }\r\n else if (propertyTypeId === propTypeIds.TagRef) {\r\n return \"tagId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.EntityRef) {\r\n return \"entityId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.InvestmentRef) {\r\n return \"investment.resourceId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.ContactRef) {\r\n return \"contact.resourceId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.NoteRef) {\r\n return \"note.resourceId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.TransactionRef) {\r\n return \"tx.resourceId\";\r\n }\r\n else if (propertyTypeId === propTypeIds.UserRef) {\r\n return \"userId\";\r\n }\r\n }\r\n\r\n export function TouchUpValueStringByPropertyType(\r\n propertyTypeId: number,\r\n propValue: any) {\r\n\r\n var propTypeIds = InvData.PropertyTypeIds;\r\n switch (propertyTypeId) {\r\n case propTypeIds[\"String\"]:\r\n case propTypeIds[\"Url\"]:\r\n case propTypeIds[\"Html\"]:\r\n case propTypeIds[\"LongText\"]:\r\n if (propValue.value.s) {\r\n propValue.valueStrings = propValue.value.s;\r\n }\r\n break;\r\n\r\n case propTypeIds[\"Boolean\"]:\r\n if (propValue.value.b) {\r\n propValue.valueStrings = propValue.value.b.map(\r\n function (b) {\r\n return b ? \"Yes\" : \"No\"\r\n });\r\n }\r\n break;\r\n\r\n case propTypeIds[\"Integer\"]:\r\n if (propValue.value.i) {\r\n propValue.valueStrings = propValue.value.i.map(\r\n function (i) {\r\n return i.toString();\r\n });\r\n }\r\n break;\r\n\r\n case propTypeIds[\"Date\"]:\r\n if (propValue.value.dt) {\r\n propValue.valueStrings = propValue.value.dt.map(\r\n function (dayId) {\r\n return InvData.DayId.format(dayId as number);\r\n });\r\n }\r\n }\r\n }\r\n export function updatePropertyValuesWithModelEnv(item: any, modelEnv: ModelEnvironment) {\r\n const propTypeIds = InvData.PropertyTypeIds;\r\n switch (item.property.propertyTypeId) {\r\n case propTypeIds[\"String\"]:\r\n case propTypeIds[\"Html\"]:\r\n case propTypeIds[\"Url\"]:\r\n case propTypeIds[\"LongText\"]:\r\n item.valueStrings = item.value.s;\r\n item.rawValue = item.value.s;\r\n break;\r\n\r\n case propTypeIds[\"Boolean\"]:\r\n item.valueStrings = item.value.b.map(\r\n function (b) {\r\n return b ? \"Yes\" : \"No\";\r\n });\r\n item.rawValue = item.value.b;\r\n break;\r\n\r\n case propTypeIds[\"Integer\"]:\r\n if (item.value.i) {\r\n item.valueStrings = item.value.i.map(\r\n function (i) {\r\n return i.toString();\r\n });\r\n }\r\n item.rawValue = item.value.i;\r\n break;\r\n\r\n case propTypeIds[\"Decimal\"]:\r\n case propTypeIds[\"Currency\"]:\r\n if (item.value.d) {\r\n item.valueStrings = item.value.d.map(\r\n function (d) {\r\n return d.toString();\r\n });\r\n }\r\n item.rawValue = item.value.d;\r\n break;\r\n\r\n case propTypeIds[\"Date\"]:\r\n if (item.value.dt) {\r\n item.valueStrings = item.value.dt.map(\r\n function (dayId) {\r\n return InvData.Util.DateIndexHelper.formatDateIndexAsDateString(dayId);\r\n });\r\n }\r\n item.rawValue = item.value.dt;\r\n break;\r\n\r\n case propTypeIds[\"TagRef\"]:\r\n if (item.value.t) {\r\n item.valueStrings = item.value.t.map(\r\n function (tagId) {\r\n var tagSet = modelEnv.tagSets.tryGetById(item.property.tagRefTagSetId);\r\n var tag = tagSet.tryGetTagById(tagId);\r\n\r\n if (typeof tag === \"undefined\" || tag === null) {\r\n return \"Tag Id \" + tagId + \" not found\";\r\n }\r\n\r\n return tag.label;\r\n });\r\n }\r\n item.rawValue = item.value.t;\r\n break;\r\n\r\n case propTypeIds[\"EntityRef\"]:\r\n if (item.value.e) {\r\n item.valueStrings = item.value.e.map(\r\n function (entityId) {\r\n var entity = modelEnv.getEntityById(entityId);\r\n\r\n if (typeof entity === \"undefined\" || entity === null) {\r\n return \"Entity Id \" + entityId + \" not found\";\r\n }\r\n return entity.label;\r\n });\r\n }\r\n item.rawValue = item.value.e;\r\n break;\r\n\r\n case propTypeIds[\"InvestmentRef\"]:\r\n if (item.value.r) {\r\n item.valueStrings = item.value.r.map(\r\n function (invId) {\r\n var investment = modelEnv.tryGetInvestmentByResourceId(invId);\r\n\r\n if (typeof investment === \"undefined\" || investment === null) {\r\n return \"Investment Id \" + invId + \" not found\";\r\n }\r\n\r\n return investment.label;\r\n });\r\n }\r\n item.rawValue = item.value.r;\r\n break;\r\n\r\n case propTypeIds[\"NoteRef\"]:\r\n case propTypeIds[\"ContactRef\"]:\r\n case propTypeIds[\"TransactionRef\"]:\r\n item.valueStrings = item.value.r;\r\n item.rawValue = item.value.r;\r\n break;\r\n\r\n case propTypeIds[\"UserRef\"]:\r\n if (item.value.i) {\r\n item.valueStrings = item.value.i.map(\r\n function (userId) {\r\n var user = modelEnv.users.idToItemMap[userId];\r\n if (typeof user === \"undefined\" || user === null) {\r\n return \"User Id \" + userId + \" not found\";\r\n }\r\n\r\n return user.fullName;\r\n });\r\n }\r\n item.rawValue = item.value.i;\r\n break;\r\n }\r\n }\r\n}","namespace InvData.DayId {\r\n\r\n /**\r\n * Format date or dayId using our standard convention for date formatting.\r\n */\r\n export function format(dateOrDateIndex: Date | number): string {\r\n if (dateOrDateIndex === null || typeof dateOrDateIndex === \"undefined\") {\r\n return \"\";\r\n }\r\n\r\n return InvData.Util.DateIndexHelper.formatAsShortMonthDayYear(dateOrDateIndex);\r\n }\r\n\r\n export function toDate(dayId: number): Date {\r\n return InvData.Util.DateIndexHelper.getDateFromDateIndex(dayId);\r\n }\r\n\r\n export function today(): number {\r\n let todayId = forDate(new Date());\r\n return todayId;\r\n }\r\n\r\n export function yesterday(): number {\r\n let yesterdayId = forDate(new Date()) - 1;\r\n return yesterdayId;\r\n }\r\n\r\n export function forDateIndex(dateIndex: number, relativeTo: RelativeDate = RelativeDate.AsSpecified, offset: number = 0): number {\r\n let date = DayId.toDate(dateIndex);\r\n return DayId.forDate(date, relativeTo, offset);\r\n }\r\n\r\n export function toUtcTimestamp(timestamp: number){\r\n const date = new Date(timestamp);\r\n\r\n const utcTimestamp = Date.UTC(\r\n date.getFullYear(),\r\n date.getMonth(),\r\n date.getDate(),\r\n date.getHours(),\r\n date.getMinutes(),\r\n date.getSeconds(),\r\n date.getMilliseconds()\r\n );\r\n return utcTimestamp;\r\n }\r\n\r\n export function forDate(date: Date, relativeTo: RelativeDate = RelativeDate.AsSpecified, offset: number = 0): number {\r\n switch (relativeTo) {\r\n case RelativeDate.AsSpecified:\r\n {\r\n if (offset != 0) {\r\n throw \"Offset must be zero for RelativeDate.AsSpecified.\";\r\n }\r\n\r\n return InvData.Util.DateIndexHelper.getDateIndexFromDate(date);\r\n }\r\n\r\n case RelativeDate.MonthEnd:\r\n {\r\n if (offset == 0)\r\n return InvData.Util.DateIndexHelper.getDateIndexOfLastDayInMonth(date);\r\n else if (offset > 0)\r\n return DayId.forDateIndex(1 + InvData.Util.DateIndexHelper.getDateIndexOfLastDayInMonth(date), relativeTo, offset - 1);\r\n else {\r\n // offset < 0\r\n return DayId.forDateIndex(InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousMonth(date), relativeTo, offset + 1);\r\n }\r\n }\r\n\r\n case RelativeDate.PriorMonthEnd:\r\n {\r\n if (offset == 0)\r\n return InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousMonth(date);\r\n else if (offset > 0)\r\n return DayId.forDateIndex(1 + InvData.Util.DateIndexHelper.getDateIndexOfLastDayInMonth(date), relativeTo, offset - 1);\r\n else {\r\n // offset < 0\r\n return DayId.forDateIndex(InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousMonth(date), relativeTo, offset + 1);\r\n }\r\n }\r\n\r\n case RelativeDate.QuarterEnd:\r\n {\r\n if (offset == 0)\r\n return InvData.Util.DateIndexHelper.getDateIndexOfLastDayInQuarter(date);\r\n else if (offset > 0)\r\n return DayId.forDateIndex(1 + InvData.Util.DateIndexHelper.getDateIndexOfLastDayInQuarter(date), relativeTo, offset - 1);\r\n else {\r\n // offset < 0\r\n return DayId.forDateIndex(InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousQuarter(date), relativeTo, offset + 1);\r\n }\r\n }\r\n\r\n case RelativeDate.PriorQuarterEnd:\r\n {\r\n if (offset == 0)\r\n return InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousQuarter(date);\r\n else if (offset > 0)\r\n return DayId.forDateIndex(1 + InvData.Util.DateIndexHelper.getDateIndexOfLastDayInQuarter(date), relativeTo, offset - 1);\r\n else {\r\n // offset < 0\r\n return DayId.forDateIndex(InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousQuarter(date), relativeTo, offset + 1);\r\n }\r\n }\r\n\r\n case RelativeDate.YearEnd:\r\n {\r\n if (offset == 0)\r\n return InvData.Util.DateIndexHelper.getDateIndexOfLastDayInYear(date);\r\n else if (offset > 0)\r\n return DayId.forDateIndex(1 + InvData.Util.DateIndexHelper.getDateIndexOfLastDayInYear(date), relativeTo, offset - 1);\r\n else {\r\n // offset < 0\r\n return DayId.forDateIndex(InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousYear(date), relativeTo, offset + 1);\r\n }\r\n }\r\n\r\n case RelativeDate.PriorYearEnd:\r\n {\r\n if (offset == 0)\r\n return InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousYear(date);\r\n else if (offset > 0)\r\n return DayId.forDateIndex(1 + InvData.Util.DateIndexHelper.getDateIndexOfLastDayInYear(date), relativeTo, offset - 1);\r\n else {\r\n // offset < 0\r\n return DayId.forDateIndex(InvData.Util.DateIndexHelper.getDateIndexOfLastDayInPreviousYear(date), relativeTo, offset + 1);\r\n }\r\n }\r\n\r\n default:\r\n throw (\"Unsupported RelativeDate: \" + relativeTo);\r\n }\r\n } \r\n \r\n}\r\n\r\nnamespace InvData {\r\n\r\n export enum RelativeDate {\r\n AsSpecified,\r\n MonthEnd,\r\n PriorMonthEnd,\r\n QuarterEnd,\r\n PriorQuarterEnd,\r\n YearEnd,\r\n PriorYearEnd\r\n }\r\n\r\n}\r\n\r\n","namespace InvData.DecimalHelper {\r\n\r\n let _thousandsSeparator = \",\";\r\n let _decimalSeparator = \".\";\r\n\r\n\r\n function isNull(obj) {\r\n return typeof obj == \"undefined\" || obj === null;\r\n }\r\n\r\n export function isNegative(number: number | string): boolean {\r\n if (isNull(number)) {\r\n return false;\r\n }\r\n\r\n if (typeof (number) === \"number\") {\r\n return number < 0;\r\n }\r\n else if (typeof (number) === \"string\") {\r\n let numberStr = number.toString().trim();\r\n if (numberStr.length > 0 && numberStr[0] === '-') {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n export function isNullOrZero(number: number | string) {\r\n if (isNull(number)) {\r\n return true;\r\n }\r\n\r\n if (typeof (number) === \"number\") {\r\n return (number == 0);\r\n }\r\n else if (typeof (number) === \"string\") {\r\n let numberParsed = InvData.DecimalHelper.decimalStringAsNumber(number);\r\n return (numberParsed == 0);\r\n }\r\n\r\n return false;\r\n }\r\n\r\n export function negate(number: number | string): number | string {\r\n if (isNull(number)) {\r\n return null;\r\n }\r\n\r\n if (typeof (number) === \"number\") {\r\n return -number;\r\n }\r\n else if (typeof (number) === \"string\") {\r\n let numberStr = number.toString().trim();\r\n if (numberStr.length > 0 && numberStr[0] === '-') {\r\n let negatedNumberStr = numberStr.slice(1);\r\n return negatedNumberStr;\r\n }\r\n else {\r\n let negatedNumberStr = \"-\" + numberStr;\r\n return negatedNumberStr;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n\r\n /**\r\n * Retrieve number of digits after the decimal.\r\n * @param number\r\n */\r\n export function getScale(number): number {\r\n if (isNull(number)) {\r\n return 0;\r\n }\r\n\r\n let numberStr = number.toString().trim();\r\n\r\n let decimalFound: boolean = false;\r\n let scale = 0;\r\n\r\n let index = 0;\r\n while (index < numberStr.length) {\r\n let ch = numberStr[index];\r\n if (decimalFound) {\r\n scale++;\r\n }\r\n else {\r\n if (ch === _decimalSeparator) {\r\n // NOTE: This will need to be adapted for internationalization when commas and periods get switched up. Same for rest of this class.\r\n decimalFound = true;\r\n }\r\n }\r\n index++;\r\n }\r\n\r\n return scale;\r\n }\r\n\r\n export function decimalStringAsNumber(number, treatNullAsZero: boolean = true): number {\r\n if (isNull(number)) {\r\n return treatNullAsZero ? 0 : null;\r\n }\r\n\r\n if (typeof (number) === \"number\") {\r\n return number;\r\n }\r\n else if (typeof (number) === \"string\") {\r\n let numberStr = number.trim();\r\n if (numberStr.length == 0) {\r\n return decimalStringAsNumber(null, treatNullAsZero);\r\n }\r\n\r\n let numberOnlyStr = \"\";\r\n let index = 0;\r\n while (index < numberStr.length) {\r\n let ch = numberStr[index];\r\n if (ch === '-' || ch === _decimalSeparator || (ch >= '0' && ch <= '9')) {\r\n numberOnlyStr += ch;\r\n }\r\n index++;\r\n }\r\n\r\n let actualNumber = parseFloat(numberOnlyStr);\r\n return actualNumber;\r\n }\r\n else {\r\n throw \"Unexpected type \" + typeof (number);\r\n }\r\n }\r\n\r\n /**\r\n * Take a decimal number and clamp it to a particular scale, eg. \"2.12345\" at scale of 2 is \"2.12\".\r\n */\r\n export function clampNumberToScaleAsString(number: string | number, scale: number): string {\r\n if (isNull(number)) {\r\n return null;\r\n }\r\n\r\n if (scale < 0) {\r\n scale = 0;\r\n }\r\n\r\n var numberStr = number.toString().trim();\r\n if (numberStr.length == 0) {\r\n return null;\r\n }\r\n\r\n var isNegative = false;\r\n if (numberStr[0] == '-') {\r\n isNegative = true;\r\n }\r\n\r\n var decimalIndex = numberStr.indexOf(\".\");\r\n if (decimalIndex >= 0) {\r\n var currentScale = numberStr.length - decimalIndex - 1;\r\n if (currentScale > scale) {\r\n var originalNumberStr = numberStr;\r\n var newLength = numberStr.length - (currentScale - scale);\r\n\r\n var needToRound = false;\r\n var firstDigitRemoved = originalNumberStr[newLength];\r\n if (firstDigitRemoved >= \"0\" && firstDigitRemoved <= \"9\") {\r\n if (firstDigitRemoved >= \"5\") {\r\n needToRound = true;\r\n }\r\n }\r\n\r\n if (numberStr[newLength - 1] == _decimalSeparator) {\r\n // Get rid of trailing decimal.\r\n newLength--;\r\n }\r\n\r\n numberStr = numberStr.substr(0, newLength);\r\n\r\n if (needToRound) {\r\n var addOneToTheStart = false;\r\n var charArray = numberStr.split('');\r\n for (var co = charArray.length - 1; co >= 0; co--) {\r\n var ch = charArray[co];\r\n if (ch >= \"0\" && ch <= \"9\") {\r\n if (ch == \"9\") {\r\n // We keep going because the next digit needs to be rounded.\r\n charArray[co] = \"0\";\r\n addOneToTheStart = true;\r\n }\r\n else {\r\n // We stop because there is no reason to continue carrying the rounding back.\r\n charArray[co] = String.fromCharCode(ch.charCodeAt(0) + 1);\r\n addOneToTheStart = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (addOneToTheStart) {\r\n if (charArray[0] == \"-\") {\r\n charArray.splice(1, 0, \"1\");\r\n }\r\n else {\r\n charArray.splice(0, 0, \"1\");\r\n }\r\n }\r\n\r\n numberStr = charArray.join(\"\");\r\n }\r\n }\r\n }\r\n\r\n if (numberStr === \"-0\") {\r\n numberStr = \"0\";\r\n }\r\n\r\n return numberStr;\r\n }\r\n\r\n\r\n /**\r\n * Take number or string-based number and return string that has the thousands separator everywhere. If the number is in scientific notation,\r\n * null will be returned.\r\n * @param number\r\n */\r\n export function fixupThousandsSeparatorAsNumberString(number: number | string): string {\r\n if (typeof (number) === \"undefined\" || isNull(number)) {\r\n return null;\r\n }\r\n \r\n let numberStr: string;\r\n if (typeof (number) === \"number\") {\r\n numberStr = number.toString();\r\n }\r\n else if (typeof (number) === \"string\") {\r\n numberStr = number;\r\n }\r\n else {\r\n return null;\r\n }\r\n\r\n if (numberStr.length === 0) {\r\n return null;\r\n }\r\n\r\n if (numberStr.indexOf(\"e-\") !== -1 || numberStr.indexOf(\"e+\") !== -1) {\r\n return null;\r\n }\r\n\r\n let isNegative = InvData.DecimalHelper.isNegative(numberStr);\r\n\r\n let numberAfterDecimal: string = \"\";\r\n let lastNonZeroIndexAfterDecimal: number = -1;\r\n\r\n let digitsBeforeDecimal: string[] = [];\r\n\r\n let decimalFound: boolean = false;\r\n \r\n let index = 0;\r\n while (index < numberStr.length) {\r\n let ch = numberStr[index];\r\n if (decimalFound) {\r\n if (ch >= '0' && ch <= '9') {\r\n numberAfterDecimal += ch;\r\n if (ch != \"0\") {\r\n lastNonZeroIndexAfterDecimal = numberAfterDecimal.length - 1;\r\n }\r\n }\r\n }\r\n else {\r\n if (ch === _decimalSeparator) {\r\n // NOTE: This will need to be adapted for internationalization when commas and periods get switched up. Same for rest of this class.\r\n decimalFound = true;\r\n }\r\n else if (ch >= '0' && ch <= '9') {\r\n digitsBeforeDecimal.push(ch);\r\n }\r\n }\r\n index++;\r\n }\r\n\r\n let finalNumberStr = isNegative ? \"-\" : \"\";\r\n\r\n if (digitsBeforeDecimal.length > 0) {\r\n let numberBeforeDecimal = \"\";\r\n\r\n let leftInBlock = 3;\r\n while (digitsBeforeDecimal.length > 0) {\r\n if (leftInBlock === 0) {\r\n numberBeforeDecimal = _thousandsSeparator + numberBeforeDecimal;\r\n leftInBlock = 3;\r\n }\r\n\r\n let digit = digitsBeforeDecimal.pop();\r\n numberBeforeDecimal = digit + numberBeforeDecimal;\r\n leftInBlock--;\r\n }\r\n\r\n if (numberBeforeDecimal.length > 0) {\r\n finalNumberStr += numberBeforeDecimal;\r\n }\r\n } \r\n\r\n if (numberAfterDecimal.length > 0 && lastNonZeroIndexAfterDecimal > -1) {\r\n finalNumberStr += _decimalSeparator;\r\n finalNumberStr += numberAfterDecimal.substr(0, lastNonZeroIndexAfterDecimal + 1);\r\n }\r\n\r\n return finalNumberStr;\r\n }\r\n \r\n\r\n /**\r\n * Take string-based number and return string that has zeros\r\n * @param numberString\r\n */\r\n export function setTrailingZeros(numberString: string): string {\r\n if (numberString == null) {\r\n return null;\r\n }\r\n\r\n if (numberString.indexOf('.') != -1) {\r\n var numberStringParts = numberString.split('.');\r\n if (numberStringParts[1].length <= 2) {\r\n return numberStringParts[0] + '.' + Number(numberString.split(',').join('')).toFixed(2).toString().split('.')[1];\r\n }\r\n else {\r\n return numberString;\r\n }\r\n }\r\n else {\r\n return numberString + '.00';\r\n }\r\n }\r\n\r\n /**\r\n * Take string-based number and return string that has zeros\r\n * @param numberString\r\n */\r\n export function cleanNumberInputString(numberString: string): string {\r\n if (numberString === null) {\r\n return null;\r\n }\r\n return numberString.toString().replace(/[^0-9.+-]/g, \"\");\r\n }\r\n}","namespace InvData.FormatterHelper {\r\n const formatters = {};\r\n\r\n export type FormatterOptions = {\r\n decimalPlaces: number;\r\n style?: Intl.NumberFormatOptions[\"style\"]; // Intl.NumberFormatOptionsStyle;\r\n };\r\n\r\n export function getNumberFormatter(options: FormatterOptions): Intl.NumberFormat {\r\n const key = JSON.stringify(options);\r\n if (!formatters[key]) {\r\n formatters[key] = new Intl.NumberFormat(\"en-US\", {\r\n minimumFractionDigits: options.decimalPlaces,\r\n maximumFractionDigits: options.decimalPlaces,\r\n style: options.style || \"decimal\",\r\n });\r\n }\r\n return formatters[key];\r\n }\r\n\r\n export function getBasicNumberFormatter(): Intl.NumberFormat {\r\n const key = \"basic\";\r\n if (!formatters[key]) {\r\n formatters[key] = new Intl.NumberFormat(\"en-US\", {\r\n maximumFractionDigits: 4,\r\n style: \"decimal\",\r\n });\r\n }\r\n return formatters[key];\r\n }\r\n\r\n export function getWholeNumberFormatter(): Intl.NumberFormat {\r\n return getNumberFormatter({ decimalPlaces: 0 });\r\n }\r\n\r\n export function getPercentageFormatter(options: FormatterOptions): Intl.NumberFormat {\r\n return getNumberFormatter({style: \"percent\", ...options});\r\n }\r\n\r\n export function getCurrencyScalarFormatter() {\r\n const fourFractionalDigitFormatter = getNumberFormatter({ decimalPlaces: 4 });\r\n const sixFractionalDigitFormatter = getNumberFormatter({ decimalPlaces: 6 });\r\n const eightFractionalDigitFormatter = getNumberFormatter({ decimalPlaces: 8 });\r\n\r\n return {\r\n format: (scalar: number) => {\r\n return scalar >= 0.1 ? fourFractionalDigitFormatter.format(scalar)\r\n : scalar >= 0.001 ? sixFractionalDigitFormatter.format(scalar)\r\n : eightFractionalDigitFormatter.format(scalar);\r\n }\r\n }\r\n }\r\n}","namespace InvData {\r\n\r\n export class ModelEnvironment {\r\n\r\n public entityIdToEntityMap: any;\r\n public entityList: any;\r\n public investmentIdToInvestmentMap: any;\r\n public investmentList: any;\r\n public resourceIdToResourceMap: any;\r\n public ownerIdToInvestmentLookup: any;\r\n public holdingIdToInvestmentLookup: any;\r\n public currencies: InvData.Models.IdAndCodeObjectIndex;\r\n public currencyPairs: InvData.Models.IdAndCodeObjectIndex;\r\n public tagSets: InvData.Models.IdAndCodeObjectIndex;\r\n public exposureProfiles: InvData.Models.IdAndCodeObjectIndex;\r\n public propertyDefinitions: InvData.Models.IdAndCodeObjectIndex;\r\n public labelHelper: ModelEnvironmentLabelHelper;\r\n public users : InvData.Models.IdAndCodeObjectIndex;\r\n\r\n\r\n constructor() {\r\n this.entityIdToEntityMap = {};\r\n this.entityList = [];\r\n\r\n this.investmentIdToInvestmentMap = {};\r\n this.investmentList = [];\r\n\r\n this.resourceIdToResourceMap = {};\r\n\r\n // investment lookup matches entity id to investments that link them.\r\n this.ownerIdToInvestmentLookup = {};\r\n this.holdingIdToInvestmentLookup = {};\r\n \r\n // Collections\r\n this.currencies = new InvData.Models.IdAndCodeObjectIndex();\r\n this.currencyPairs = new InvData.Models.IdAndCodeObjectIndex();\r\n this.tagSets = new InvData.Models.IdAndCodeObjectIndex();\r\n this.exposureProfiles = new InvData.Models.IdAndCodeObjectIndex();\r\n this.propertyDefinitions = new InvData.Models.IdAndCodeObjectIndex();\r\n this.users = new InvData.Models.IdAndCodeObjectIndex();\r\n\r\n // Always create helper for labels.\r\n this.labelHelper = new InvData.ModelEnvironmentLabelHelper(this);\r\n }\r\n\r\n\r\n public getEntityById(entityId) {\r\n if (this.entityIdToEntityMap[entityId])\r\n return this.entityIdToEntityMap[entityId];\r\n else\r\n return null;\r\n }\r\n\r\n public tryGetEntityByResourceId(resourceId) {\r\n var resource = this.getResourceById(resourceId);\r\n if (resource) {\r\n // We have to compare resourceId because entities and investments can have overlapping ids.\r\n var entity = this.getEntityById(resource.id);\r\n if (entity && entity.resourceId === resourceId) {\r\n return entity;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getInvestmentById(investmentId) {\r\n if (this.investmentIdToInvestmentMap[investmentId])\r\n return this.investmentIdToInvestmentMap[investmentId];\r\n else\r\n return null;\r\n }\r\n\r\n public tryGetInvestmentByResourceId(resourceId) {\r\n var resource = this.getResourceById(resourceId);\r\n if (resource) {\r\n // We have to compare resourceId because entities and investments can have overlapping ids.\r\n var investment = this.getInvestmentById(resource.id);\r\n if (investment && investment.resourceId === resourceId) {\r\n return investment;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getResourceById(resourceId) {\r\n if (this.resourceIdToResourceMap[resourceId])\r\n return this.resourceIdToResourceMap[resourceId];\r\n else\r\n return null;\r\n }\r\n\r\n public getInvestmentsForOwnerId(entityId) {\r\n var self = this;\r\n\r\n var resultList = [];\r\n if (this.ownerIdToInvestmentLookup[entityId]) {\r\n for (let investmentId of this.ownerIdToInvestmentLookup[entityId]) { \r\n var investment = self.getInvestmentById(investmentId);\r\n if (investment) {\r\n resultList.push(investment);\r\n }\r\n }\r\n }\r\n\r\n return resultList;\r\n }\r\n\r\n public getInvestmentsForHoldingId(entityId) {\r\n var self = this;\r\n\r\n var resultList = [];\r\n if (this.holdingIdToInvestmentLookup[entityId]) {\r\n for (let investmentId of this.holdingIdToInvestmentLookup[entityId]) {\r\n var investment = self.getInvestmentById(investmentId);\r\n if (investment) {\r\n resultList.push(investment);\r\n }\r\n }\r\n }\r\n\r\n return resultList;\r\n }\r\n\r\n /**\r\n * doesEntityOwnOtherEntity returns true if entityId owns otherEntityId.\r\n * @param entityId\r\n * @param otherEntityId\r\n */\r\n public doesEntityOwnOtherEntity(entityId, otherEntityId) { \r\n var self = this;\r\n\r\n var found = false;\r\n\r\n var resultList = [];\r\n if (this.ownerIdToInvestmentLookup[entityId]) {\r\n for (let investmentId of this.ownerIdToInvestmentLookup[entityId]) {\r\n var investment = self.getInvestmentById(investmentId);\r\n if (investment) {\r\n if (investment.holdingId == otherEntityId) {\r\n found = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return found;\r\n }\r\n\r\n public mergeEnvironmentData(newModelEnvironment: InvData.Models.JsonModelEnvironment | InvData.ModelEnvironment): void {\r\n var self = this;\r\n\r\n if (!newModelEnvironment) {\r\n return;\r\n }\r\n\r\n if (newModelEnvironment instanceof InvData.ModelEnvironment) {\r\n // We are merging a model environment that has already been loaded into the Javascript class representation.\r\n\r\n if (newModelEnvironment.currencies && newModelEnvironment.currencies.itemList) {\r\n for (let item of newModelEnvironment.currencies.itemList) { \r\n self.currencies.addOrReplace(item);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.currencyPairs && newModelEnvironment.currencyPairs.itemList) {\r\n for (let item of newModelEnvironment.currencyPairs.itemList) { \r\n self.currencyPairs.addOrReplace(item);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.tagSets && newModelEnvironment.tagSets.itemList) {\r\n for (let tagSet of newModelEnvironment.tagSets.itemList) { \r\n self.tagSets.addOrReplace(tagSet);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.exposureProfiles && newModelEnvironment.exposureProfiles.itemList) {\r\n for (let item of newModelEnvironment.exposureProfiles.itemList) { \r\n self.exposureProfiles.addOrReplace(item);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.propertyDefinitions && newModelEnvironment.propertyDefinitions.itemList) {\r\n for (let propDef of newModelEnvironment.propertyDefinitions.itemList) { \r\n self.propertyDefinitions.addOrReplace(propDef);\r\n }\r\n }\r\n\r\n\r\n if (newModelEnvironment.entityList) {\r\n for (let newEntity of newModelEnvironment.entityList) { \r\n self._addEntity(newEntity);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.investmentList) {\r\n for (let newInvestment of newModelEnvironment.investmentList) { \r\n self._addInvestment(newInvestment);\r\n }\r\n }\r\n\r\n if(newModelEnvironment.users) {\r\n for(let userData of newModelEnvironment.users.itemList) {\r\n self.users.addOrReplace(userData);\r\n }\r\n }\r\n }\r\n else {\r\n // We are merging a plain JSON representation.\r\n\r\n if (newModelEnvironment.currencies) {\r\n for (let item of newModelEnvironment.currencies) { \r\n self.currencies.addOrReplace(item);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.currencyPairs) {\r\n for (let item of newModelEnvironment.currencyPairs) { \r\n self.currencyPairs.addOrReplace(item);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.tagSets) {\r\n for (let tagSetData of newModelEnvironment.tagSets) {\r\n var tagSet = new InvData.Models.TagSet(tagSetData);\r\n self.tagSets.addOrReplace(tagSet);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.exposureProfiles) {\r\n for (let item of newModelEnvironment.exposureProfiles) { \r\n self.exposureProfiles.addOrReplace(item);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.propertyDefinitions) {\r\n for (let propDefData of newModelEnvironment.propertyDefinitions) { \r\n var propDef = new InvData.PropertyDefinition(propDefData);\r\n self.propertyDefinitions.addOrReplace(propDef);\r\n }\r\n }\r\n\r\n\r\n if (newModelEnvironment.entities) {\r\n for (let newEntity of newModelEnvironment.entities) { \r\n self._addEntity(newEntity);\r\n }\r\n }\r\n\r\n if (newModelEnvironment.investments) {\r\n for (let newInvestment of newModelEnvironment.investments) { \r\n self._addInvestment(newInvestment);\r\n }\r\n }\r\n\r\n if(newModelEnvironment.users){\r\n for(let userData of newModelEnvironment.users){\r\n var user = new InvData.User(userData);\r\n self.users.addOrReplace(user);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\r\n public _addEntity(newEntity) {\r\n if (!this.entityIdToEntityMap[newEntity.id]) {\r\n // New entity, so add it to our list.\r\n this.entityIdToEntityMap[newEntity.id] = newEntity;\r\n\r\n if (newEntity.resourceId)\r\n this.resourceIdToResourceMap[newEntity.resourceId] = newEntity;\r\n\r\n this.entityList.push(newEntity);\r\n }\r\n }\r\n\r\n public _addInvestment(newInvestment) {\r\n if (!this.investmentIdToInvestmentMap[newInvestment.id]) {\r\n // New investment, so add it to our list.\r\n this.investmentIdToInvestmentMap[newInvestment.id] = newInvestment;\r\n\r\n if (newInvestment.resourceId)\r\n this.resourceIdToResourceMap[newInvestment.resourceId] = newInvestment;\r\n\r\n this.investmentList.push(newInvestment);\r\n\r\n // Add investment id to the investment lookup lists.\r\n if (newInvestment.ownerId) {\r\n if (this.ownerIdToInvestmentLookup[newInvestment.ownerId]) {\r\n this.ownerIdToInvestmentLookup[newInvestment.ownerId].push(newInvestment.id);\r\n }\r\n else {\r\n this.ownerIdToInvestmentLookup[newInvestment.ownerId] = [newInvestment.id];\r\n }\r\n }\r\n\r\n if (newInvestment.holdingId) {\r\n if (this.holdingIdToInvestmentLookup[newInvestment.holdingId]) {\r\n this.holdingIdToInvestmentLookup[newInvestment.holdingId].push(newInvestment.id);\r\n }\r\n else {\r\n this.holdingIdToInvestmentLookup[newInvestment.holdingId] = [newInvestment.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\r\n\r\n","namespace InvData.ModelEnvironmentHelper {\r\n\r\n function isNotNull(obj) {\r\n return typeof obj !== \"undefined\" && obj !== null; \r\n }\r\n\r\n /**\r\n * Iterate over child investments and call callback for each investment (excluding the internal edges if\r\n * we are looking through aggregate views).\r\n * @param options\r\n */\r\n export function forEachChildInvestment(\r\n options: {\r\n callback: (childInvestment: any) => void,\r\n modelEnv: ModelEnvironment,\r\n lookThroughAggregateViews?: boolean,\r\n maxLookThroughDepth?: number,\r\n rootEntityId: number\r\n }\r\n ) {\r\n\r\n var callback = options.callback;\r\n var modelEnv = options.modelEnv;\r\n var lookThroughAggregateViews = options.lookThroughAggregateViews ? true : false;\r\n var maxLookThroughDepth = isNotNull(options.maxLookThroughDepth) ? options.maxLookThroughDepth : null;\r\n\r\n var internalForEachChildInvestment = function (entityId, depth) {\r\n var childInvestments = modelEnv.getInvestmentsForOwnerId(entityId);\r\n if (childInvestments) {\r\n for (let childInvestment of childInvestments) {\r\n if (!lookThroughAggregateViews\r\n || (isNotNull(maxLookThroughDepth) && depth >= maxLookThroughDepth)) {\r\n // We are not looking through aggregate views, or we are at max-depth.\r\n callback(childInvestment);\r\n }\r\n else {\r\n var holding = modelEnv.getEntityById(childInvestment.holdingId);\r\n if (holding == null) {\r\n // The holding was not loaded, so we can't know if it is\r\n // an aggregate view, so we just add the investment id to the list.\r\n callback(childInvestment);\r\n }\r\n else {\r\n if (InvData.SpecialEntityTypeIds.isAggregateView(holding.seTypeId)) {\r\n // Holding is an aggregate view, so we need to do a look-through.\r\n internalForEachChildInvestment(holding.id, depth + 1);\r\n }\r\n else {\r\n // Holding is not an aggregate view, so add it to the list.\r\n callback(childInvestment);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n internalForEachChildInvestment(options.rootEntityId, 1);\r\n }\r\n\r\n}","namespace InvData {\r\n\r\n export class ModelEnvironmentLabelHelper {\r\n\r\n public modelEnvironment: ModelEnvironment;\r\n\r\n constructor(modelEnvironment: ModelEnvironment) {\r\n this.modelEnvironment = modelEnvironment;\r\n }\r\n\r\n public getEntityLabel(entityOrEntityId): string {\r\n if (!entityOrEntityId) {\r\n return \"\";\r\n }\r\n\r\n var entity;\r\n if (typeof entityOrEntityId == \"number\") {\r\n entity = this.modelEnvironment.getEntityById(entityOrEntityId);\r\n if (!entity) {\r\n return \"EntityId=\" + entityOrEntityId;\r\n }\r\n }\r\n else {\r\n entity = entityOrEntityId;\r\n }\r\n\r\n if (entity.label) {\r\n return entity.label;\r\n }\r\n else {\r\n return \"EntityId=\" + entity.id;\r\n }\r\n }\r\n\r\n public getInvestmentLabel(investmentOrInvestmentId): string {\r\n if (!investmentOrInvestmentId) {\r\n return \"\";\r\n }\r\n\r\n var investment;\r\n if (typeof investmentOrInvestmentId == \"number\") {\r\n investment = this.modelEnvironment.getInvestmentById(investmentOrInvestmentId);\r\n if (!investment) {\r\n return \"InvestmentId=\" + investmentOrInvestmentId;\r\n }\r\n }\r\n else {\r\n investment = investmentOrInvestmentId;\r\n }\r\n\r\n if (investment.label) {\r\n return investment.label;\r\n }\r\n else {\r\n var ownerLabel = this.getEntityLabel(investment.ownerId);\r\n var holdingLabel = this.getEntityLabel(investment.holdingId);\r\n\r\n return ownerLabel + \" / \" + holdingLabel;\r\n }\r\n }\r\n\r\n public getResourceLabel(resourceOrResourceId): string { \r\n if (!resourceOrResourceId) {\r\n return \"\";\r\n }\r\n\r\n var resource;\r\n if (typeof resourceOrResourceId == \"number\") {\r\n resource = this.modelEnvironment.getResourceById(resourceOrResourceId);\r\n if (!resource) {\r\n return \"ResourceId=\" + resourceOrResourceId;\r\n }\r\n }\r\n else {\r\n resource = resourceOrResourceId;\r\n }\r\n\r\n if (resource.label) {\r\n return resource.label;\r\n }\r\n else {\r\n return \"ResourceId=\" + resource.id;\r\n }\r\n }\r\n\r\n public getCurrencyCodeLabel(currencyOrCurrencyId): string {\r\n if (!currencyOrCurrencyId) {\r\n return \"\";\r\n }\r\n\r\n var currency;\r\n if (typeof currencyOrCurrencyId == \"number\") {\r\n currency = this.modelEnvironment.currencies.tryGetById(currencyOrCurrencyId);\r\n if (!currency) {\r\n return \"CurrencyId=\" + currencyOrCurrencyId;\r\n }\r\n }\r\n else {\r\n currency = currencyOrCurrencyId;\r\n }\r\n\r\n if (currency.code) {\r\n return currency.code;\r\n }\r\n else {\r\n return \"CurrencyId=\" + currency.id;\r\n }\r\n }\r\n\r\n public getPropertyDefinitionLabel(propDefOrpropDefId): string {\r\n if (!propDefOrpropDefId) {\r\n return \"\";\r\n }\r\n\r\n var propDef;\r\n if (typeof propDefOrpropDefId == \"number\") {\r\n propDef = this.modelEnvironment.propertyDefinitions.tryGetById(propDefOrpropDefId);\r\n if (!propDef) {\r\n return \"PropertyDefinitionId=\" + propDefOrpropDefId;\r\n }\r\n }\r\n else {\r\n propDef = propDefOrpropDefId;\r\n }\r\n\r\n if (propDef.label) {\r\n return propDef.label;\r\n }\r\n else {\r\n return \"PropertyDefinitionId=\" + propDef.id;\r\n }\r\n }\r\n }\r\n\r\n}\r\n","namespace InvData {\r\n\r\n export class PropertyDefinition {\r\n\r\n public id: number;\r\n public code: string;\r\n public label: string;\r\n public allowMultiple: boolean;\r\n public isStaticOverTime: boolean;\r\n public propertyTypeId: number;\r\n public tagRefTagSetId: number;\r\n public category: string;\r\n\r\n constructor(propDefData) {\r\n this.id = propDefData.id ? propDefData.id : null;\r\n this.code = propDefData.code ? propDefData.code : null;\r\n this.label = propDefData.label ? propDefData.label : null;\r\n\r\n this.allowMultiple = propDefData.allowMultiple ? propDefData.allowMultiple : false;\r\n this.isStaticOverTime = propDefData.isStaticOverTime ? propDefData.isStaticOverTime : false;\r\n\r\n this.propertyTypeId = propDefData.propertyTypeId ? propDefData.propertyTypeId : null;\r\n this.tagRefTagSetId = propDefData.tagRefTagSetId ? propDefData.tagRefTagSetId : null;\r\n\r\n this.category = propDefData.category;\r\n }\r\n\r\n }\r\n\r\n}\r\n\r\n\r\n","namespace InvData {\r\n\r\n export enum PropertyTypeIds {\r\n String = 1,\r\n Integer = 2,\r\n Boolean = 3,\r\n Decimal = 4,\r\n Date = 5,\r\n LongText = 6,\r\n Html = 7,\r\n EntityRef = 8,\r\n TagRef = 9,\r\n InvestmentRef = 10,\r\n TransactionRef = 11,\r\n ContactRef = 12,\r\n NoteRef = 13,\r\n Url = 14,\r\n UserRef = 15,\r\n Currency = 16,\r\n }\r\n\r\n}\r\n\r\nnamespace InvData.PropertyTypeIds {\r\n\r\n export function getNameForPropertyTypeId(id: string) {\r\n for (var i in this) {\r\n if (typeof this[i] == \"number\") {\r\n if (this[i] == id) {\r\n return i;\r\n }\r\n }\r\n }\r\n }\r\n\r\n}","namespace InvData {\r\n\r\n export enum ResourceTypeIds {\r\n Entity = 1,\r\n Investment = 2,\r\n Transaction = 3,\r\n Contact = 4,\r\n Note = 5,\r\n ReportDefinition = 6,\r\n PropertyDefinition = 7,\r\n TagSet = 8,\r\n User = 9,\r\n ReportDataSource = 10,\r\n LiquidityModel = 11\r\n }\r\n\r\n}\r\n\r\nnamespace InvData.ResourceTypeIds {\r\n\r\n export function getName(resourceTypeId: number): string {\r\n switch (resourceTypeId) {\r\n case 1: return \"Entity\";\r\n case 2: return \"Investment\";\r\n case 3: return \"Transaction\";\r\n case 4: return \"Contact\";\r\n case 5: return \"Note\";\r\n case 6: return \"ReportDefinition\";\r\n case 7: return \"PropertyDefinition\";\r\n case 8: return \"TagSet\";\r\n case 9: return \"User\";\r\n case 10: return \"ReportDataSource\";\r\n case 11: return \"LiquidityModel\";\r\n\r\n default: return \"ResourceTypeId=\" + resourceTypeId;\r\n }\r\n }\r\n\r\n} ","namespace InvData {\r\n\r\n export enum SpecialEntityTypeIds {\r\n\r\n Accounting = 1,\r\n\r\n CashAccount = 2,\r\n Liabilities = 3,\r\n Receivables = 4,\r\n\r\n TotalReturnIndex = 5,\r\n ConstantWeightTotalReturnIndex = 13,\r\n WeightedBenchmark = 14,\r\n\r\n DrawdownFund = 12,\r\n ExternalDrawdownFund = 6,\r\n\r\n ManagedFund = 7,\r\n UnitizedManagedFund = 18,\r\n ExternalManagedFund = 11,\r\n\r\n AggregateView = 8,\r\n AggregateCashView = 10,\r\n\r\n Derivative = 9,\r\n\r\n Composite = 15,\r\n Outsider = 16,\r\n PublicEquity = 17,\r\n\r\n FXMirror = 19\r\n }\r\n\r\n}\r\n\r\nnamespace InvData.SpecialEntityTypeIds {\r\n\r\n export function isDrawdownFund(seTypeId: number): boolean {\r\n if (seTypeId == InvData.SpecialEntityTypeIds.DrawdownFund || seTypeId == InvData.SpecialEntityTypeIds.ExternalDrawdownFund) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n export function isAggregateView(seTypeId: number): boolean {\r\n if (seTypeId == InvData.SpecialEntityTypeIds.AggregateView || seTypeId == InvData.SpecialEntityTypeIds.AggregateCashView) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n}\r\n\r\n","namespace InvData {\r\n\r\n export class SelectionSetHelper {\r\n\r\n /**\r\n * A list of assets which should have resourceId fields will be union'd with an existing selectionSetRef to create\r\n * a combined selectionSetRef.\r\n */ \r\n public static unionAssetListWithSelectionSet(assetList: any[], selectionSetRef: any) {\r\n\r\n if (!assetList || assetList.length === 0) {\r\n return selectionSetRef;\r\n }\r\n\r\n let resourceIds = [];\r\n for (let asset of assetList) {\r\n if (asset.resourceId) {\r\n resourceIds.push(asset.resourceId);\r\n }\r\n }\r\n\r\n return SelectionSetHelper.unionResourceIdsWithSelectionSet(resourceIds, selectionSetRef);\r\n }\r\n\r\n public static unionResourceIdsWithSelectionSet(resourceIds: any[], selectionSetRef: any) {\r\n\r\n if (!resourceIds || resourceIds.length === 0) {\r\n return selectionSetRef;\r\n }\r\n\r\n let assetListBlock = {\r\n blockType: \"FixedAsset\",\r\n fixedAssetListResourceIds: resourceIds\r\n };\r\n\r\n let unionSelectionSetRef: any = {\r\n custom: {\r\n blocks: [assetListBlock]\r\n }\r\n };\r\n\r\n if (selectionSetRef) {\r\n unionSelectionSetRef.mods = [\r\n {\r\n op: \"Add\",\r\n set: selectionSetRef\r\n }\r\n ];\r\n }\r\n\r\n return unionSelectionSetRef;\r\n }\r\n }\r\n\r\n}","namespace InvData {\r\n export class User {\r\n public id: number;\r\n public code: string;\r\n public fullName: string;\r\n public resourceId: number;\r\n public isLoginDisabled: boolean;\r\n\r\n constructor(userData: any) {\r\n this.id = userData.id ? userData.id : null;\r\n this.code = userData.code ? userData.code : null;\r\n this.fullName = userData.fullName ? userData.fullName : null;\r\n this.resourceId = userData.resourceId ? userData.resourceId: null;\r\n this.isLoginDisabled = userData.isLoginDisabled ? userData.isLoginDisabled : null; \r\n }\r\n }\r\n}\r\n\r\n","namespace InvData.Models {\r\n\r\n export interface IdAndCodeObject {\r\n id: number,\r\n code?: string\r\n }\r\n\r\n export class IdAndCodeObjectIndex {\r\n\r\n public itemList: EntryType[];\r\n public idToItemMap: { [id: number]: EntryType } = {};\r\n public codeToItemMap: { [id: string]: EntryType } = {};\r\n\r\n constructor(itemList?: EntryType[]) {\r\n this.itemList = itemList ? itemList : [];\r\n\r\n for (var i = 0; i < this.itemList.length; i++) {\r\n var item = this.itemList[i];\r\n this._addToIndexMaps(item);\r\n }\r\n }\r\n\r\n public _addToIndexMaps(item: EntryType): void {\r\n if (item.id) {\r\n this.idToItemMap[item.id] = item;\r\n }\r\n if (item.code) {\r\n this.codeToItemMap[item.code] = item;\r\n }\r\n }\r\n\r\n /**\r\n * tryGetById will return item with given id, or return null if not found.\r\n * @param id\r\n */\r\n public tryGetById(id: number): EntryType {\r\n var item = this.idToItemMap[id];\r\n return item ? item : null;\r\n }\r\n\r\n /**\r\n * tryGetByCode will return item with given code, or return null if not found.\r\n * @param code\r\n */\r\n public tryGetByCode(code: string): EntryType {\r\n var item = this.codeToItemMap[code];\r\n return item ? item : null;\r\n }\r\n\r\n public add(item: EntryType): void {\r\n if (!this.idToItemMap[item.id]) {\r\n this.itemList.push(item);\r\n this._addToIndexMaps(item);\r\n }\r\n else {\r\n throw \"item id already exists in collection: \" + item.id;\r\n }\r\n }\r\n\r\n public addOrReplace(item: EntryType): void {\r\n if (this.idToItemMap[item.id]) {\r\n this.removeById(item.id);\r\n }\r\n\r\n this.add(item);\r\n }\r\n\r\n public removeById(id: number): void {\r\n var item = this.tryGetById(id);\r\n if (item) {\r\n delete this.idToItemMap[item.id];\r\n\r\n if (item.code) {\r\n delete this.codeToItemMap[item.code]\r\n }\r\n\r\n this.itemList = this.itemList.filter(function (i) { return i.id != item.id; });\r\n }\r\n }\r\n }\r\n\r\n} \r\n","namespace InvData.Models {\r\n\r\n export interface TagClassData {\r\n id?: number;\r\n code?: string;\r\n label?: string;\r\n parentTagId?: number;\r\n tagSet: TagSet;\r\n level?: number;\r\n tagOrder?: number;\r\n\r\n childTags?: Tag[];\r\n }\r\n\r\n export class Tag {\r\n\r\n public id: number;\r\n public code: string;\r\n public label: string;\r\n public childTags: Tag[];\r\n public level: number;\r\n public parentTagId: number;\r\n public tagSet: TagSet;\r\n\r\n /**\r\n * tagOrder is the order the tag appears in within the parent tag.\r\n */\r\n public tagOrder: number;\r\n\r\n\r\n constructor(tagData: TagClassData) {\r\n this.id = tagData.id ? tagData.id : null;\r\n this.code = tagData.code ? tagData.code : null;\r\n this.label = tagData.label ? tagData.label : null;\r\n this.childTags = tagData.childTags ? tagData.childTags : null;\r\n this.level = tagData.level;\r\n this.tagOrder = tagData.tagOrder;\r\n\r\n this.parentTagId = tagData.parentTagId ? tagData.parentTagId : null;\r\n this.tagSet = tagData.tagSet;\r\n }\r\n\r\n public getParentTag(): Tag {\r\n if (this.parentTagId) {\r\n return this.tagSet.tryGetTagById(this.parentTagId);\r\n }\r\n else {\r\n return null;\r\n }\r\n }\r\n\r\n public getLevel(levelIndex: number): Tag {\r\n if (levelIndex == this.level) {\r\n return this;\r\n }\r\n else {\r\n var parentTag = this.getParentTag();\r\n if (parentTag) {\r\n return parentTag.getLevel(levelIndex);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getLowestLevel(levelIndex: number): Tag {\r\n if (levelIndex >= this.level) {\r\n return this;\r\n }\r\n else {\r\n var parentTag = this.getParentTag();\r\n if (parentTag) {\r\n return parentTag.getLevel(levelIndex);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n public getLevelLabel(levelIndex: number): string {\r\n var levelTag = this.getLevel(levelIndex);\r\n if (levelTag) {\r\n return levelTag.label;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns true if this tag is branchTag or a child tag of the branchTag.\r\n * @param branchTag\r\n */\r\n public isInBranch(branchTag: Tag): boolean {\r\n if (this.id == branchTag.id) {\r\n return true;\r\n }\r\n else if (this.parentTagId) {\r\n var parentTag = this.getParentTag();\r\n if (parentTag) {\r\n return parentTag.isInBranch(branchTag);\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n }\r\n\r\n}\r\n","namespace InvData.Models {\r\n\r\n \r\n export class TagSet {\r\n\r\n public id: number;\r\n public code: string;\r\n public label: string;\r\n public maxLevel: number;\r\n public tags: IdAndCodeObjectIndex;\r\n public rootTags: Tag[];\r\n\r\n constructor(tagSetData: JsonTagSet) {\r\n this.id = tagSetData.id ? tagSetData.id : null;\r\n this.code = tagSetData.code ? tagSetData.code : null;\r\n this.label = tagSetData.label ? tagSetData.label : null;\r\n\r\n this.maxLevel = 0;\r\n\r\n this.tags = new IdAndCodeObjectIndex();\r\n this.rootTags = [];\r\n\r\n if (tagSetData.rootTags) {\r\n for (let i = 0; i < tagSetData.rootTags.length; i++) {\r\n let rootTagData = tagSetData.rootTags[i];\r\n let rootTag = this._loadTagData(rootTagData, null, 0, i);\r\n this.rootTags.push(rootTag);\r\n }\r\n }\r\n }\r\n\r\n public _loadTagData(tagData, parentTagId: number, level: number, tagOrder: number) {\r\n var flatTagData: TagClassData = {\r\n id: tagData.id ? tagData.id : null,\r\n code: tagData.code ? tagData.code : null,\r\n label: tagData.label ? tagData.label : null,\r\n parentTagId: parentTagId,\r\n tagSet: this,\r\n level: level,\r\n tagOrder: tagOrder\r\n };\r\n\r\n this.maxLevel = Math.max(this.maxLevel, level);\r\n\r\n var childTagObjects = null;\r\n if (tagData.childTags && tagData.childTags.length > 0) {\r\n childTagObjects = [];\r\n\r\n for (let i = 0; i < tagData.childTags.length; i++) {\r\n let childTagData = tagData.childTags[i];\r\n let childTag = this._loadTagData(childTagData, flatTagData.id, level + 1, i);\r\n childTagObjects.push(childTag);\r\n }\r\n }\r\n\r\n flatTagData.childTags = childTagObjects;\r\n\r\n var tag = new Tag(flatTagData);\r\n this.tags.add(tag);\r\n return tag;\r\n }\r\n\r\n public tryGetTagById(id: number): Tag {\r\n return this.tags.tryGetById(id);\r\n }\r\n\r\n public tryGetTagByCode(code: string): Tag {\r\n return this.tags.tryGetByCode(code);\r\n }\r\n\r\n /**\r\n * Return maximum level depth at which tags exist in this tag set.\r\n */\r\n public getMaxLevel(): number {\r\n return this.maxLevel;\r\n }\r\n\r\n /**\r\n * Return levelInfoGetter for use with data row grouping.\r\n */\r\n public getLevelInfoGetter() {\r\n var self = this;\r\n return function (groupValue) {\r\n var tag = self.tryGetTagById(groupValue);\r\n if (tag) {\r\n return {\r\n parent: tag.parentTagId,\r\n level: tag.level\r\n };\r\n }\r\n else {\r\n return null;\r\n }\r\n };\r\n }\r\n }\r\n\r\n}"]}