sec-edgar-api 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -5
- package/build/services/DocumentParser/HtmlTableExtractor.d.ts +41 -0
- package/build/services/DocumentParser/HtmlTableExtractor.js +408 -0
- package/build/services/DocumentParser/XMLParser.d.ts +20 -5
- package/build/services/DocumentParser/XMLParser.js +122 -118
- package/build/services/DocumentParser/parsers/index.d.ts +5 -3
- package/build/services/DocumentParser/parsers/index.js +5 -3
- package/build/services/DocumentParser/parsers/parse-current-filings.d.ts +3 -0
- package/build/services/DocumentParser/parsers/parse-current-filings.js +98 -0
- package/build/services/DocumentParser/parsers/parse-form-13f.d.ts +6 -0
- package/build/services/DocumentParser/parsers/parse-form-13f.js +91 -0
- package/build/services/DocumentParser/parsers/parse-form-13g.js +2 -2
- package/build/services/DocumentParser/parsers/parse-form-4.d.ts +6 -1
- package/build/services/DocumentParser/parsers/parse-form-4.js +134 -204
- package/build/services/DocumentParser/parsers/parse-form-def14a.d.ts +1 -2
- package/build/services/DocumentParser/parsers/parse-form-def14a.js +157 -106
- package/build/services/ReportBuilder/FactFiscalCalculator.d.ts +47 -0
- package/build/services/ReportBuilder/FactFiscalCalculator.js +228 -0
- package/build/services/ReportBuilder/FactPeriodResolver.d.ts +44 -0
- package/build/services/ReportBuilder/FactPeriodResolver.js +185 -0
- package/build/services/ReportBuilder/FactRecordBuilder.d.ts +7 -0
- package/build/services/ReportBuilder/FactRecordBuilder.js +49 -0
- package/build/services/ReportBuilder/FactSplitAdjuster.d.ts +39 -0
- package/build/services/ReportBuilder/FactSplitAdjuster.js +192 -0
- package/build/services/ReportBuilder/ReportBuilder.d.ts +37 -0
- package/build/services/ReportBuilder/ReportBuilder.js +180 -0
- package/build/services/ReportBuilder/ReportRawResolvable.d.ts +17 -0
- package/build/services/ReportBuilder/ReportRawResolvable.js +114 -0
- package/build/services/ReportBuilder/index.d.ts +2 -0
- package/build/services/ReportBuilder/index.js +4 -0
- package/build/services/ReportParser/FactItem.d.ts +66 -0
- package/build/services/ReportParser/FactItem.js +50 -0
- package/build/services/ReportParser/FactItemFactory.d.ts +22 -0
- package/build/services/ReportParser/FactItemFactory.js +150 -0
- package/build/services/ReportParser/FactSplitMap.d.ts +16 -0
- package/build/services/ReportParser/FactSplitMap.js +101 -0
- package/build/services/ReportParser/PropertyResolver.d.ts +1 -0
- package/build/services/ReportParser/PropertyResolver.js +1 -0
- package/build/services/ReportParser/ReportParser.d.ts +3 -10
- package/build/services/ReportParser/ReportParser.js +8 -23
- package/build/services/ReportParser/ReportRawParser.d.ts +5 -28
- package/build/services/ReportParser/ReportRawParser.js +29 -141
- package/build/services/ReportParser/ReportWrapper.js +2 -5
- package/build/services/ReportParser/resolvers/index.d.ts +2 -0
- package/build/services/ReportParser/resolvers/index.js +2 -0
- package/build/services/ReportParser/resolvers/resolve-cash-flow-capex.js +4 -3
- package/build/services/ReportParser/resolvers/resolve-cash-flow-operating.js +1 -1
- package/build/services/ReportParser/resolvers/resolve-cash-flow-working-capital-non-cash.js +1 -1
- package/build/services/ReportParser/resolvers/resolve-expense-depreciation.js +1 -1
- package/build/services/ReportParser/resolvers/resolve-fiscal-year-cumulative-properties.js +28 -14
- package/build/services/ReportParser/resolvers/resolve-q4-fiscal-year-matching-properties.js +32 -4
- package/build/services/ReportParser/resolvers/resolve-split-ratio.d.ts +2 -0
- package/build/services/ReportParser/resolvers/resolve-split-ratio.js +37 -0
- package/build/services/SecEdgarApi/SecEdgarApi.d.ts +85 -47
- package/build/services/SecEdgarApi/SecEdgarApi.js +246 -108
- package/build/types/current-filings-xml.type.d.ts +74 -0
- package/build/types/current-filings-xml.type.js +6 -0
- package/build/types/current-filings.type.d.ts +44 -0
- package/build/types/current-filings.type.js +2 -0
- package/build/types/form-13f-xml.type.d.ts +105 -0
- package/build/types/form-13f-xml.type.js +2 -0
- package/build/types/form-4-xml.type.d.ts +132 -0
- package/build/types/form-4-xml.type.js +2 -0
- package/build/types/index.d.ts +2 -2
- package/build/types/index.js +2 -2
- package/build/types/parsed-filings.type.d.ts +144 -5
- package/build/types/report-raw.type.d.ts +4 -7
- package/build/types/report-translated.type.d.ts +1 -2
- package/build/types/submission.type.d.ts +3 -2
- package/build/util/calculation-map-by-ns.d.ts +6 -0
- package/build/util/calculation-map-by-ns.js +9 -0
- package/build/util/key-translations.js +1 -2
- package/package.json +5 -2
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var FactFiscalCalculator_1 = require("./FactFiscalCalculator");
|
|
4
|
+
var FactPeriodResolver_1 = require("./FactPeriodResolver");
|
|
5
|
+
var FactRecordBuilder_1 = require("./FactRecordBuilder");
|
|
6
|
+
var FactSplitAdjuster_1 = require("./FactSplitAdjuster");
|
|
7
|
+
var ReportBuilder = /** @class */ (function () {
|
|
8
|
+
function ReportBuilder() {
|
|
9
|
+
this.factRecordBuilder = new FactRecordBuilder_1.default();
|
|
10
|
+
}
|
|
11
|
+
ReportBuilder.prototype.createFacts = function (companyFacts) {
|
|
12
|
+
return this.factRecordBuilder.createFacts(companyFacts);
|
|
13
|
+
};
|
|
14
|
+
ReportBuilder.prototype.buildReports = function (params) {
|
|
15
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
16
|
+
var facts = params.facts, reportDates = params.reportDates;
|
|
17
|
+
if (facts.length === 0) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
var accessionByYearQuarter = new Map();
|
|
21
|
+
reportDates === null || reportDates === void 0 ? void 0 : reportDates.forEach(function (params) {
|
|
22
|
+
var year = params.year, quarter = params.quarter, accn = params.accn;
|
|
23
|
+
if (accn)
|
|
24
|
+
accessionByYearQuarter.set("".concat(year, "_").concat(quarter), accn);
|
|
25
|
+
});
|
|
26
|
+
var reportsCik = Number(facts[0].cik);
|
|
27
|
+
var factFiscalCalculator = new FactFiscalCalculator_1.default();
|
|
28
|
+
var factPeriodResolver = new FactPeriodResolver_1.default({ cik: reportsCik });
|
|
29
|
+
var factSplitAdjuster = new FactSplitAdjuster_1.default();
|
|
30
|
+
facts.forEach(function (fact) { return factFiscalCalculator.add(fact); });
|
|
31
|
+
reportDates === null || reportDates === void 0 ? void 0 : reportDates.forEach(function (params) { return factFiscalCalculator.setReportDates(params); });
|
|
32
|
+
var unitByPropertyName = new Map();
|
|
33
|
+
var splitDateDataByKey = new Map();
|
|
34
|
+
var minYear = Infinity;
|
|
35
|
+
var maxYear = -Infinity;
|
|
36
|
+
var countByAccnByYearQuarter = new Map();
|
|
37
|
+
for (var _i = 0, facts_1 = facts; _i < facts_1.length; _i++) {
|
|
38
|
+
var fact = facts_1[_i];
|
|
39
|
+
var end = fact.end, name_1 = fact.name, unit = fact.unit, segments = fact.segments, start = fact.start, value = fact.value, cik = fact.cik, form = fact.form, filed = fact.filed, accn = fact.accn;
|
|
40
|
+
if (Number(fact.cik) !== Number(reportsCik)) {
|
|
41
|
+
throw new Error("All facts must have the same cik ".concat(reportsCik, " !== ").concat(Number(cik)));
|
|
42
|
+
}
|
|
43
|
+
var segmentValue = segments === null || segments === void 0 ? void 0 : segments.map(function (seg) { return "".concat(seg.dimension, "_").concat(seg.value); }).join('&');
|
|
44
|
+
var propertyName = (_a = name_1.split(':').pop()) !== null && _a !== void 0 ? _a : '';
|
|
45
|
+
var propertyNameWithSegment = propertyName + (segmentValue ? "_".concat(segmentValue) : '');
|
|
46
|
+
var _h = factFiscalCalculator.getFiscalYearQuarter({ dateStr: end }), quarter = _h.quarter, year = _h.year;
|
|
47
|
+
if (year < minYear)
|
|
48
|
+
minYear = year;
|
|
49
|
+
if (year > maxYear)
|
|
50
|
+
maxYear = year;
|
|
51
|
+
var splitKey = "".concat(year, "_").concat(value);
|
|
52
|
+
var isSplit = factSplitAdjuster.isSplitProperty(propertyName);
|
|
53
|
+
unitByPropertyName.set(propertyNameWithSegment, unit);
|
|
54
|
+
if (isSplit && new Date(end) > new Date((_c = (_b = splitDateDataByKey.get(splitKey)) === null || _b === void 0 ? void 0 : _b.end) !== null && _c !== void 0 ? _c : 0)) {
|
|
55
|
+
splitDateDataByKey.set(splitKey, { end: end, quarter: quarter });
|
|
56
|
+
}
|
|
57
|
+
var accnKey = "".concat(year, "_").concat(quarter);
|
|
58
|
+
var accnGiven = accessionByYearQuarter.get(accnKey);
|
|
59
|
+
var filedDistance = Math.abs(new Date(filed).getTime() - new Date(end !== null && end !== void 0 ? end : 0).getTime()) / 86400000;
|
|
60
|
+
var isFiledRecent = filedDistance < 60;
|
|
61
|
+
if (!accnGiven && isFiledRecent && accn && (!form || form === '10-K' || form === '10-Q')) {
|
|
62
|
+
var countByAccn = (_d = countByAccnByYearQuarter.get(accnKey)) !== null && _d !== void 0 ? _d : new Map();
|
|
63
|
+
countByAccn.set(accn, ((_e = countByAccn.get(accn)) !== null && _e !== void 0 ? _e : 0) + 1);
|
|
64
|
+
countByAccnByYearQuarter.set(accnKey, countByAccn);
|
|
65
|
+
}
|
|
66
|
+
var dates = factFiscalCalculator.getDatesByYearQuarter({ quarter: quarter, year: year });
|
|
67
|
+
factPeriodResolver.add({
|
|
68
|
+
year: year,
|
|
69
|
+
start: start,
|
|
70
|
+
end: end,
|
|
71
|
+
name: propertyNameWithSegment,
|
|
72
|
+
quarter: quarter,
|
|
73
|
+
value: value,
|
|
74
|
+
dateFiled: (_f = dates === null || dates === void 0 ? void 0 : dates.filed) !== null && _f !== void 0 ? _f : '',
|
|
75
|
+
dateReport: (_g = dates === null || dates === void 0 ? void 0 : dates.end) !== null && _g !== void 0 ? _g : '',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
countByAccnByYearQuarter.forEach(function (countByAccn, yearQuarter) {
|
|
79
|
+
if (accessionByYearQuarter.has(yearQuarter))
|
|
80
|
+
return;
|
|
81
|
+
var maxCount = 0;
|
|
82
|
+
var accessionNumber = '';
|
|
83
|
+
countByAccn.forEach(function (count, accn) {
|
|
84
|
+
if (count > maxCount) {
|
|
85
|
+
maxCount = count;
|
|
86
|
+
accessionNumber = accn;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
accessionByYearQuarter.set(yearQuarter, accessionNumber);
|
|
90
|
+
});
|
|
91
|
+
minYear = Number.isFinite(minYear) ? minYear : new Date().getFullYear();
|
|
92
|
+
maxYear = Number.isFinite(maxYear) ? maxYear : new Date().getFullYear();
|
|
93
|
+
var reportsByKey = new Map();
|
|
94
|
+
// resolves quarterly and annual properties and creates reports
|
|
95
|
+
factPeriodResolver.forEach(function (data) {
|
|
96
|
+
var _a;
|
|
97
|
+
var fiscalPeriod = data.fiscalPeriod, propertyName = data.propertyName, value = data.value, year = data.year;
|
|
98
|
+
var key = "".concat(year, "_").concat(fiscalPeriod);
|
|
99
|
+
var quarter = fiscalPeriod === 'FY' ? 4 : Number(fiscalPeriod[1]);
|
|
100
|
+
var dates = factFiscalCalculator.getDatesByYearQuarter({ quarter: quarter, year: year });
|
|
101
|
+
var _b = dates !== null && dates !== void 0 ? dates : { filed: '', end: '' }, filed = _b.filed, end = _b.end;
|
|
102
|
+
var accessionNumber = accessionByYearQuarter.get("".concat(year, "_").concat(quarter));
|
|
103
|
+
var accessionNoHyphen = accessionNumber === null || accessionNumber === void 0 ? void 0 : accessionNumber.replace(/-/g, '');
|
|
104
|
+
var url = accessionNumber
|
|
105
|
+
? "https://www.sec.gov/Archives/edgar/data/".concat(reportsCik, "/").concat(accessionNoHyphen, "/").concat(accessionNumber, ".txt")
|
|
106
|
+
: null;
|
|
107
|
+
if (!reportsByKey.has(key)) {
|
|
108
|
+
reportsByKey.set(key, {
|
|
109
|
+
cik: reportsCik,
|
|
110
|
+
url: url,
|
|
111
|
+
dateFiled: filed,
|
|
112
|
+
dateReport: end,
|
|
113
|
+
fiscalPeriod: fiscalPeriod,
|
|
114
|
+
fiscalYear: year,
|
|
115
|
+
splitDate: null,
|
|
116
|
+
splitRatio: null,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// add facts to adjust for splits
|
|
120
|
+
factSplitAdjuster.add({
|
|
121
|
+
end: end,
|
|
122
|
+
filed: filed,
|
|
123
|
+
fiscalPeriod: fiscalPeriod,
|
|
124
|
+
name: propertyName,
|
|
125
|
+
unit: (_a = unitByPropertyName.get(propertyName)) !== null && _a !== void 0 ? _a : '',
|
|
126
|
+
year: year,
|
|
127
|
+
value: Number(value),
|
|
128
|
+
accn: accessionNumber !== null && accessionNumber !== void 0 ? accessionNumber : '',
|
|
129
|
+
});
|
|
130
|
+
var report = reportsByKey.get(key);
|
|
131
|
+
report[propertyName] = value;
|
|
132
|
+
});
|
|
133
|
+
// iterate through facts adjustable for splits and assign values to reports
|
|
134
|
+
factSplitAdjuster.forEach(function (data) {
|
|
135
|
+
var year = data.year, fiscalPeriod = data.fiscalPeriod, propertyName = data.propertyName, value = data.value;
|
|
136
|
+
var key = "".concat(year, "_").concat(fiscalPeriod);
|
|
137
|
+
var report = reportsByKey.get(key);
|
|
138
|
+
if (!report)
|
|
139
|
+
return;
|
|
140
|
+
report[propertyName] = Math.round(value * 10000) / 10000;
|
|
141
|
+
});
|
|
142
|
+
// add split dates and values to reports
|
|
143
|
+
factSplitAdjuster.getSplitsAsc().forEach(function (split) {
|
|
144
|
+
var _a, _b, _c, _d;
|
|
145
|
+
var _e = factFiscalCalculator.getFiscalYearQuarter({ dateStr: split.end }), quarter = _e.quarter, year = _e.year;
|
|
146
|
+
var keySplit = "".concat(year, "_").concat(split.value);
|
|
147
|
+
var splitDateData = (_a = splitDateDataByKey.get(keySplit)) !== null && _a !== void 0 ? _a : { end: null, quarter: null };
|
|
148
|
+
var splitDate = (_b = splitDateData.end) !== null && _b !== void 0 ? _b : split.filed;
|
|
149
|
+
var splitQuarter = (_c = splitDateData.quarter) !== null && _c !== void 0 ? _c : quarter;
|
|
150
|
+
var fiscalPeriod = "Q".concat(splitQuarter);
|
|
151
|
+
var keyReport = "".concat(year, "_").concat(fiscalPeriod);
|
|
152
|
+
var report = reportsByKey.get(keyReport);
|
|
153
|
+
var reportAnnual = splitQuarter === 4 ? (_d = reportsByKey.get("".concat(year, "_FY"))) !== null && _d !== void 0 ? _d : null : null;
|
|
154
|
+
if (report) {
|
|
155
|
+
report.splitRatio = split.value;
|
|
156
|
+
report.splitDate = splitDate;
|
|
157
|
+
}
|
|
158
|
+
// also assign to annual for Q4
|
|
159
|
+
if (reportAnnual) {
|
|
160
|
+
reportAnnual.splitRatio = split.value;
|
|
161
|
+
reportAnnual.splitDate = splitDate;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
// sort reports ASC by year and quarter
|
|
165
|
+
var reportsSorted = [];
|
|
166
|
+
for (var year = minYear; year <= maxYear; year++) {
|
|
167
|
+
for (var i = 0; i < 5; i++) {
|
|
168
|
+
var fiscalPeriod = i === 4 ? 'FY' : "Q".concat(i + 1);
|
|
169
|
+
var key = "".concat(year, "_").concat(fiscalPeriod);
|
|
170
|
+
var report = reportsByKey.get(key);
|
|
171
|
+
if (report && report.dateReport) {
|
|
172
|
+
reportsSorted.push(report);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return reportsSorted;
|
|
177
|
+
};
|
|
178
|
+
return ReportBuilder;
|
|
179
|
+
}());
|
|
180
|
+
exports.default = ReportBuilder;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReportRaw } from '../../types';
|
|
2
|
+
export type TemplateCode = 'I' | 'T' | 'B' | 'M' | 'N' | 'U';
|
|
3
|
+
export default class ReportRawResolvable {
|
|
4
|
+
readonly report: ReportRaw;
|
|
5
|
+
private readonly emptyKeys;
|
|
6
|
+
private readonly addedProps;
|
|
7
|
+
private readonly calcMap;
|
|
8
|
+
private readonly templateCode;
|
|
9
|
+
private readonly keyStack;
|
|
10
|
+
constructor(report: ReportRaw, templateCode?: TemplateCode | null, calcMap?: Record<string, Record<string, string[]>>);
|
|
11
|
+
get(key: string): string | number | boolean | undefined;
|
|
12
|
+
getNumber(key: string): number;
|
|
13
|
+
isAdded(key: string): boolean;
|
|
14
|
+
private getChildKeysArr;
|
|
15
|
+
private calculateNumericKey;
|
|
16
|
+
toJSON(): ReportRaw;
|
|
17
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var calculation_map_by_ns_1 = require("../../util/calculation-map-by-ns");
|
|
4
|
+
var ReportRawResolvable = /** @class */ (function () {
|
|
5
|
+
function ReportRawResolvable(report, templateCode, calcMap) {
|
|
6
|
+
if (templateCode === void 0) { templateCode = null; }
|
|
7
|
+
if (calcMap === void 0) { calcMap = calculation_map_by_ns_1.calculationMapByNs; }
|
|
8
|
+
this.emptyKeys = new Set();
|
|
9
|
+
this.addedProps = new Set();
|
|
10
|
+
this.keyStack = new Set();
|
|
11
|
+
this.templateCode = templateCode !== null && templateCode !== void 0 ? templateCode : 'N';
|
|
12
|
+
this.report = report;
|
|
13
|
+
this.calcMap = calcMap;
|
|
14
|
+
}
|
|
15
|
+
ReportRawResolvable.prototype.get = function (key) {
|
|
16
|
+
var _a;
|
|
17
|
+
return (_a = this.report[key]) !== null && _a !== void 0 ? _a : this.calculateNumericKey(key, key);
|
|
18
|
+
};
|
|
19
|
+
ReportRawResolvable.prototype.getNumber = function (key) {
|
|
20
|
+
return Number(this.get(key)) || 0;
|
|
21
|
+
};
|
|
22
|
+
ReportRawResolvable.prototype.isAdded = function (key) {
|
|
23
|
+
return this.addedProps.has(key);
|
|
24
|
+
};
|
|
25
|
+
ReportRawResolvable.prototype.getChildKeysArr = function (key) {
|
|
26
|
+
var calcsByRole = this.calcMap[key];
|
|
27
|
+
if (calcsByRole === undefined) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
if (calcsByRole._) {
|
|
31
|
+
return [calcsByRole._];
|
|
32
|
+
}
|
|
33
|
+
var preferredKeys = [];
|
|
34
|
+
switch (this.templateCode) {
|
|
35
|
+
case 'I':
|
|
36
|
+
preferredKeys = [
|
|
37
|
+
'StatementOfCashFlowsIndirectInvestmentBasedOperations',
|
|
38
|
+
'StatementOfFinancialPositionUnclassified-InvestmentBasedOperations',
|
|
39
|
+
'StatementOfCashFlowsIndirectDepositBasedOperations',
|
|
40
|
+
'StatementOfFinancialPositionUnclassified-DepositBasedOperationsFirstAlternate',
|
|
41
|
+
'StatementOfFinancialPositionUnclassified-DepositBasedOperations',
|
|
42
|
+
];
|
|
43
|
+
break;
|
|
44
|
+
case 'B':
|
|
45
|
+
preferredKeys = [
|
|
46
|
+
'StatementOfFinancialPositionUnclassified-DepositBasedOperationsFirstAlternate',
|
|
47
|
+
'StatementOfFinancialPositionUnclassified-DepositBasedOperations',
|
|
48
|
+
];
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
var k = preferredKeys.find(function (k) { return calcsByRole[k]; });
|
|
52
|
+
if (!k) {
|
|
53
|
+
k = Object.keys(calcsByRole)[0];
|
|
54
|
+
}
|
|
55
|
+
return Object.keys(calcsByRole)
|
|
56
|
+
.sort(function (a, b) {
|
|
57
|
+
var indexA = preferredKeys.indexOf(a);
|
|
58
|
+
var indexB = preferredKeys.indexOf(b);
|
|
59
|
+
if (indexB === -1)
|
|
60
|
+
return -1;
|
|
61
|
+
if (indexA === -1)
|
|
62
|
+
return 1;
|
|
63
|
+
return indexA - indexB;
|
|
64
|
+
})
|
|
65
|
+
.map(function (k) { return calcsByRole[k]; });
|
|
66
|
+
};
|
|
67
|
+
ReportRawResolvable.prototype.calculateNumericKey = function (key, topLevelKey) {
|
|
68
|
+
var _a;
|
|
69
|
+
if (this.keyStack.has(key)) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
this.keyStack.add(key);
|
|
73
|
+
if (this.emptyKeys.has(key)) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
var childKeysArr = this.getChildKeysArr(key);
|
|
77
|
+
if (childKeysArr.length === 0) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
var didAdd = false;
|
|
81
|
+
var finalSum = 0;
|
|
82
|
+
for (var _i = 0, childKeysArr_1 = childKeysArr; _i < childKeysArr_1.length; _i++) {
|
|
83
|
+
var childKeys = childKeysArr_1[_i];
|
|
84
|
+
var sum = 0;
|
|
85
|
+
for (var _b = 0, childKeys_1 = childKeys; _b < childKeys_1.length; _b++) {
|
|
86
|
+
var k = childKeys_1[_b];
|
|
87
|
+
var _c = k.split('|'), childKey = _c[0], weightStr = _c[1];
|
|
88
|
+
var value = (_a = this.report[childKey]) !== null && _a !== void 0 ? _a : this.calculateNumericKey(childKey, topLevelKey);
|
|
89
|
+
if (typeof value !== 'number') {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
didAdd = true;
|
|
93
|
+
sum += value * Number(weightStr);
|
|
94
|
+
}
|
|
95
|
+
if (sum === 0) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
finalSum = sum;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
if (!didAdd) {
|
|
102
|
+
this.emptyKeys.add(key);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
this.report[key] = finalSum;
|
|
106
|
+
this.addedProps.add(key);
|
|
107
|
+
return finalSum;
|
|
108
|
+
};
|
|
109
|
+
ReportRawResolvable.prototype.toJSON = function () {
|
|
110
|
+
return this.report;
|
|
111
|
+
};
|
|
112
|
+
return ReportRawResolvable;
|
|
113
|
+
}());
|
|
114
|
+
exports.default = ReportRawResolvable;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { FactValue, FiscalPeriod } from '../../types';
|
|
2
|
+
interface FactItemArgs {
|
|
3
|
+
factValue: FactValue;
|
|
4
|
+
propertyName: string;
|
|
5
|
+
description: string;
|
|
6
|
+
label: string;
|
|
7
|
+
unit: string;
|
|
8
|
+
taxonomy: string;
|
|
9
|
+
fiscalYear: number;
|
|
10
|
+
fiscalPeriod: FiscalPeriod;
|
|
11
|
+
fiscalYearEnd: string;
|
|
12
|
+
fiscalPeriodEnd: string;
|
|
13
|
+
fiscalPeriodFiled: string;
|
|
14
|
+
fiscalYearFiled: string;
|
|
15
|
+
quarter: number;
|
|
16
|
+
factsByYearPeriod: Map<string, FactItem[]>;
|
|
17
|
+
factsByPropertyYearPeriod: Map<string, FactItem[]>;
|
|
18
|
+
}
|
|
19
|
+
export default class FactItem {
|
|
20
|
+
readonly description: string;
|
|
21
|
+
readonly factValue: FactValue;
|
|
22
|
+
readonly label: string;
|
|
23
|
+
readonly propertyName: string;
|
|
24
|
+
readonly taxonomy: string;
|
|
25
|
+
readonly unit: string;
|
|
26
|
+
readonly fiscalYear: number;
|
|
27
|
+
readonly fiscalPeriod: FiscalPeriod;
|
|
28
|
+
/** ex: 2023-09-29 */
|
|
29
|
+
readonly fiscalPeriodEnd: string;
|
|
30
|
+
/** ex: 2023-09-29 */
|
|
31
|
+
readonly fiscalYearEnd: string;
|
|
32
|
+
/** ex: 2023-09-29 */
|
|
33
|
+
readonly fiscalPeriodFiled: string;
|
|
34
|
+
/** ex: 2023-09-29 */
|
|
35
|
+
readonly fiscalYearFiled: string;
|
|
36
|
+
/** number 1 - 4 */
|
|
37
|
+
readonly quarter: number;
|
|
38
|
+
private readonly factsByYearPeriod;
|
|
39
|
+
private readonly factsByPropertyYearPeriod;
|
|
40
|
+
constructor(data: FactItemArgs);
|
|
41
|
+
toJSON(): {
|
|
42
|
+
description: string;
|
|
43
|
+
factValue: FactValue;
|
|
44
|
+
label: string;
|
|
45
|
+
propertyName: string;
|
|
46
|
+
taxonomy: string;
|
|
47
|
+
unit: string;
|
|
48
|
+
fiscalYear: number;
|
|
49
|
+
fiscalPeriod: FiscalPeriod;
|
|
50
|
+
fiscalYearEnd: string;
|
|
51
|
+
fiscalPeriodEnd: string;
|
|
52
|
+
fiscalPeriodFiled: string;
|
|
53
|
+
fiscalYearFiled: string;
|
|
54
|
+
quarter: number;
|
|
55
|
+
};
|
|
56
|
+
getFactsInPeriod(params?: {
|
|
57
|
+
fiscalYear?: number;
|
|
58
|
+
fiscalPeriod?: FiscalPeriod;
|
|
59
|
+
}): FactItem[];
|
|
60
|
+
getFactsInPeriodProperty(params?: {
|
|
61
|
+
fiscalYear?: number;
|
|
62
|
+
fiscalPeriod?: FiscalPeriod;
|
|
63
|
+
propertyName?: string;
|
|
64
|
+
}): FactItem[];
|
|
65
|
+
}
|
|
66
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var FactItem = /** @class */ (function () {
|
|
4
|
+
function FactItem(data) {
|
|
5
|
+
this.description = data.description;
|
|
6
|
+
this.factValue = data.factValue;
|
|
7
|
+
this.label = data.label;
|
|
8
|
+
this.propertyName = data.propertyName;
|
|
9
|
+
this.taxonomy = data.taxonomy;
|
|
10
|
+
this.unit = data.unit;
|
|
11
|
+
this.fiscalYear = data.fiscalYear;
|
|
12
|
+
this.fiscalPeriod = data.fiscalPeriod;
|
|
13
|
+
this.quarter = data.quarter;
|
|
14
|
+
this.fiscalYearEnd = data.fiscalYearEnd;
|
|
15
|
+
this.fiscalPeriodEnd = data.fiscalPeriodEnd;
|
|
16
|
+
this.fiscalPeriodFiled = data.fiscalPeriodFiled;
|
|
17
|
+
this.fiscalYearFiled = data.fiscalYearFiled;
|
|
18
|
+
this.factsByYearPeriod = data.factsByYearPeriod;
|
|
19
|
+
this.factsByPropertyYearPeriod = data.factsByPropertyYearPeriod;
|
|
20
|
+
}
|
|
21
|
+
FactItem.prototype.toJSON = function () {
|
|
22
|
+
return {
|
|
23
|
+
description: this.description,
|
|
24
|
+
factValue: this.factValue,
|
|
25
|
+
label: this.label,
|
|
26
|
+
propertyName: this.propertyName,
|
|
27
|
+
taxonomy: this.taxonomy,
|
|
28
|
+
unit: this.unit,
|
|
29
|
+
fiscalYear: this.fiscalYear,
|
|
30
|
+
fiscalPeriod: this.fiscalPeriod,
|
|
31
|
+
fiscalYearEnd: this.fiscalYearEnd,
|
|
32
|
+
fiscalPeriodEnd: this.fiscalPeriodEnd,
|
|
33
|
+
fiscalPeriodFiled: this.fiscalPeriodFiled,
|
|
34
|
+
fiscalYearFiled: this.fiscalYearFiled,
|
|
35
|
+
quarter: this.quarter,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
FactItem.prototype.getFactsInPeriod = function (params) {
|
|
39
|
+
var _a;
|
|
40
|
+
var _b = params !== null && params !== void 0 ? params : {}, _c = _b.fiscalPeriod, fiscalPeriod = _c === void 0 ? this.fiscalPeriod : _c, _d = _b.fiscalYear, fiscalYear = _d === void 0 ? this.fiscalYear : _d;
|
|
41
|
+
return (_a = this.factsByYearPeriod.get("".concat(fiscalYear, "-").concat(fiscalPeriod))) !== null && _a !== void 0 ? _a : [];
|
|
42
|
+
};
|
|
43
|
+
FactItem.prototype.getFactsInPeriodProperty = function (params) {
|
|
44
|
+
var _a;
|
|
45
|
+
var _b = params !== null && params !== void 0 ? params : {}, _c = _b.fiscalPeriod, fiscalPeriod = _c === void 0 ? this.fiscalPeriod : _c, _d = _b.fiscalYear, fiscalYear = _d === void 0 ? this.fiscalYear : _d, _e = _b.propertyName, propertyName = _e === void 0 ? this.propertyName : _e;
|
|
46
|
+
return (_a = this.factsByPropertyYearPeriod.get("".concat(propertyName, "-").concat(fiscalYear, "-").concat(fiscalPeriod))) !== null && _a !== void 0 ? _a : [];
|
|
47
|
+
};
|
|
48
|
+
return FactItem;
|
|
49
|
+
}());
|
|
50
|
+
exports.default = FactItem;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CompanyFactListData } from '../../types';
|
|
2
|
+
import FactItem from './FactItem';
|
|
3
|
+
import FactIterator from './FactIterator';
|
|
4
|
+
import { default as FactSplitMap, default as FactSplitMapper } from './FactSplitMap';
|
|
5
|
+
interface ReportRawParserArgs {
|
|
6
|
+
factIterator?: FactIterator;
|
|
7
|
+
factSplitMapper?: FactSplitMapper;
|
|
8
|
+
}
|
|
9
|
+
export default class FactItemFactory {
|
|
10
|
+
private readonly factIterator;
|
|
11
|
+
constructor(args?: ReportRawParserArgs);
|
|
12
|
+
/**
|
|
13
|
+
* Creates FactItem instances from sorted by end date ascending
|
|
14
|
+
*/
|
|
15
|
+
createFactItems(companyFactListData: Pick<CompanyFactListData, 'facts'>): {
|
|
16
|
+
factSplitMap: FactSplitMap;
|
|
17
|
+
factItems: FactItem[];
|
|
18
|
+
};
|
|
19
|
+
private getFiscalPeriod;
|
|
20
|
+
private getFiscalYearQuarter;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var FactItem_1 = require("./FactItem");
|
|
4
|
+
var FactIterator_1 = require("./FactIterator");
|
|
5
|
+
var FactSplitMap_1 = require("./FactSplitMap");
|
|
6
|
+
var FactItemFactory = /** @class */ (function () {
|
|
7
|
+
function FactItemFactory(args) {
|
|
8
|
+
var _a = (args !== null && args !== void 0 ? args : {}).factIterator, factIterator = _a === void 0 ? new FactIterator_1.default() : _a;
|
|
9
|
+
this.factIterator = factIterator;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Creates FactItem instances from sorted by end date ascending
|
|
13
|
+
*/
|
|
14
|
+
FactItemFactory.prototype.createFactItems = function (companyFactListData) {
|
|
15
|
+
var _this = this;
|
|
16
|
+
var dateStrsQuarter = new Set();
|
|
17
|
+
var endDateByYear = new Map();
|
|
18
|
+
var factsFlat = [];
|
|
19
|
+
var filedByEndDate = new Map();
|
|
20
|
+
var factSplitMap = new FactSplitMap_1.default();
|
|
21
|
+
this.factIterator.iterateCompanyFacts(companyFactListData, function (data) {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
factsFlat.push(data);
|
|
24
|
+
var filedProp = data.factValue.filed;
|
|
25
|
+
var earliestFiled = (_a = filedByEndDate.get(data.factValue.end)) !== null && _a !== void 0 ? _a : filedProp;
|
|
26
|
+
// all report filed dates matter, even if not included because missing frame.
|
|
27
|
+
if (filedProp <= earliestFiled && filedProp > data.factValue.end && data.factValue.form !== '8-K') {
|
|
28
|
+
filedByEndDate.set(data.factValue.end, filedProp);
|
|
29
|
+
}
|
|
30
|
+
if (!data.factValue.frame || data.factValue.frame.endsWith('I')) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
dateStrsQuarter.add(data.factValue.end);
|
|
34
|
+
if (((_b = data.factValue.frame) === null || _b === void 0 ? void 0 : _b.length) === 6) {
|
|
35
|
+
var calendarYear = data.factValue.end.split('-')[0];
|
|
36
|
+
endDateByYear.set(Number(calendarYear), new Date(data.factValue.end));
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
var fiscalsByDates = new Map();
|
|
40
|
+
var endDateByYearQuarter = new Map();
|
|
41
|
+
dateStrsQuarter.forEach(function (dateStr) {
|
|
42
|
+
var fiscals = _this.getFiscalYearQuarter({ dateStr: dateStr, endDateByYear: endDateByYear });
|
|
43
|
+
var quarter = fiscals.quarter, year = fiscals.year;
|
|
44
|
+
var key = "".concat(year, "-").concat(quarter);
|
|
45
|
+
fiscalsByDates.set(dateStr, fiscals);
|
|
46
|
+
endDateByYearQuarter.set(key, dateStr);
|
|
47
|
+
});
|
|
48
|
+
// factsFlat.sort((a, b) => (a.factValue.end > b.factValue.end ? 1 : -1))
|
|
49
|
+
var factsByYearPeriod = new Map();
|
|
50
|
+
var factsByPropertyYearPeriod = new Map();
|
|
51
|
+
var factItems = factsFlat.map(function (data) {
|
|
52
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
53
|
+
var factValue = data.factValue, description = data.description, label = data.label, propertyName = data.propertyName, taxonomy = data.taxonomy, unit = data.unit;
|
|
54
|
+
var dateStr = factValue.end;
|
|
55
|
+
var fiscals = (_a = fiscalsByDates.get(dateStr)) !== null && _a !== void 0 ? _a : _this.getFiscalYearQuarter({ dateStr: dateStr, endDateByYear: endDateByYear });
|
|
56
|
+
fiscalsByDates.set(dateStr, fiscals);
|
|
57
|
+
var fiscalPeriod = _this.getFiscalPeriod({ factValue: factValue, quarter: fiscals.quarter });
|
|
58
|
+
var fiscalPeriodEnd = (_b = endDateByYearQuarter.get("".concat(fiscals.year, "-").concat(fiscals.quarter))) !== null && _b !== void 0 ? _b : factValue.end;
|
|
59
|
+
var fiscalYearEnd = (_c = endDateByYearQuarter.get("".concat(fiscals.year, "-4"))) !== null && _c !== void 0 ? _c : factValue.end;
|
|
60
|
+
var factItem = new FactItem_1.default({
|
|
61
|
+
description: description,
|
|
62
|
+
factValue: factValue,
|
|
63
|
+
label: label,
|
|
64
|
+
propertyName: propertyName,
|
|
65
|
+
taxonomy: taxonomy,
|
|
66
|
+
unit: unit,
|
|
67
|
+
fiscalYear: fiscals.year,
|
|
68
|
+
fiscalPeriod: fiscalPeriod,
|
|
69
|
+
fiscalYearEnd: fiscalYearEnd,
|
|
70
|
+
fiscalPeriodEnd: fiscalPeriodEnd,
|
|
71
|
+
factsByYearPeriod: factsByYearPeriod,
|
|
72
|
+
factsByPropertyYearPeriod: factsByPropertyYearPeriod,
|
|
73
|
+
fiscalPeriodFiled: (_d = filedByEndDate.get(fiscalPeriodEnd)) !== null && _d !== void 0 ? _d : factValue.filed,
|
|
74
|
+
fiscalYearFiled: (_e = filedByEndDate.get(fiscalYearEnd)) !== null && _e !== void 0 ? _e : factValue.filed,
|
|
75
|
+
quarter: fiscals.quarter,
|
|
76
|
+
});
|
|
77
|
+
var keyFiscal = "".concat(fiscals.year, "-").concat(fiscalPeriod);
|
|
78
|
+
var keyProperty = "".concat(data.propertyName, "-").concat(keyFiscal);
|
|
79
|
+
var bucket = (_f = factsByYearPeriod.get(keyFiscal)) !== null && _f !== void 0 ? _f : [];
|
|
80
|
+
bucket.push(factItem);
|
|
81
|
+
factsByYearPeriod.set(keyFiscal, bucket);
|
|
82
|
+
var bucketProperty = (_g = factsByPropertyYearPeriod.get(keyProperty)) !== null && _g !== void 0 ? _g : [];
|
|
83
|
+
bucketProperty.push(factItem);
|
|
84
|
+
factsByPropertyYearPeriod.set(keyProperty, bucketProperty);
|
|
85
|
+
factSplitMap.addFact(factItem);
|
|
86
|
+
return factItem;
|
|
87
|
+
});
|
|
88
|
+
factItems.sort(function (a, b) { return (a.factValue.filed > b.factValue.filed ? 1 : -1); });
|
|
89
|
+
return { factSplitMap: factSplitMap, factItems: factItems };
|
|
90
|
+
};
|
|
91
|
+
FactItemFactory.prototype.getFiscalPeriod = function (params) {
|
|
92
|
+
var _a;
|
|
93
|
+
var factValue = params.factValue, quarter = params.quarter;
|
|
94
|
+
if (factValue.frame) {
|
|
95
|
+
return factValue.frame.length === 6 ? 'FY' : "Q".concat(quarter);
|
|
96
|
+
}
|
|
97
|
+
var startDate = new Date((_a = factValue.start) !== null && _a !== void 0 ? _a : factValue.end);
|
|
98
|
+
var endDate = new Date(factValue.end);
|
|
99
|
+
var isYearDuration = (endDate.getTime() - startDate.getTime()) / 86400000 > 245;
|
|
100
|
+
return isYearDuration ? 'FY' : "Q".concat(quarter);
|
|
101
|
+
};
|
|
102
|
+
FactItemFactory.prototype.getFiscalYearQuarter = function (params) {
|
|
103
|
+
var dateStr = params.dateStr, endDateByYear = params.endDateByYear;
|
|
104
|
+
var getYearEndDate = function (year) {
|
|
105
|
+
var _a;
|
|
106
|
+
var YEAR_MS = 31536000000;
|
|
107
|
+
var date = endDateByYear.get(year);
|
|
108
|
+
var datePrev = endDateByYear.get(year - 1);
|
|
109
|
+
var dateNext = endDateByYear.get(year + 1);
|
|
110
|
+
if (date)
|
|
111
|
+
return date;
|
|
112
|
+
if (datePrev)
|
|
113
|
+
return new Date(datePrev.getTime() + YEAR_MS);
|
|
114
|
+
if (dateNext)
|
|
115
|
+
return new Date(dateNext.getTime() - YEAR_MS);
|
|
116
|
+
var prevKnownYear = Math.max.apply(Math, Array.from(endDateByYear.keys()));
|
|
117
|
+
var prevKnownDate = endDateByYear.get(prevKnownYear);
|
|
118
|
+
var years = (year - prevKnownYear) * YEAR_MS;
|
|
119
|
+
return new Date(((_a = prevKnownDate === null || prevKnownDate === void 0 ? void 0 : prevKnownDate.getTime()) !== null && _a !== void 0 ? _a : 0) + years);
|
|
120
|
+
};
|
|
121
|
+
var getDaysBefore = function (dateA, dateB) {
|
|
122
|
+
return (dateB.getTime() - dateA.getTime()) / 86400000;
|
|
123
|
+
};
|
|
124
|
+
var getFiscalQuarter = function (daysBeforeYearEnd) {
|
|
125
|
+
var fiscalPeriod = 1;
|
|
126
|
+
if (daysBeforeYearEnd < 45) {
|
|
127
|
+
fiscalPeriod = 4;
|
|
128
|
+
}
|
|
129
|
+
else if (daysBeforeYearEnd < 135) {
|
|
130
|
+
fiscalPeriod = 3;
|
|
131
|
+
}
|
|
132
|
+
else if (daysBeforeYearEnd < 225) {
|
|
133
|
+
fiscalPeriod = 2;
|
|
134
|
+
}
|
|
135
|
+
return fiscalPeriod;
|
|
136
|
+
};
|
|
137
|
+
var yearQuarter = Number(dateStr.split('-')[0]);
|
|
138
|
+
var dateQuarter = new Date(dateStr);
|
|
139
|
+
var yearEndDate = getYearEndDate(yearQuarter);
|
|
140
|
+
var daysBefore = getDaysBefore(dateQuarter, yearEndDate);
|
|
141
|
+
var isCurFiscalYear = daysBefore > -30;
|
|
142
|
+
var fiscalYear = isCurFiscalYear ? yearQuarter : yearQuarter + 1;
|
|
143
|
+
var fiscalYearEndDate = isCurFiscalYear ? yearEndDate : getYearEndDate(fiscalYear);
|
|
144
|
+
var daysFromYearEnd = (fiscalYearEndDate.getTime() - dateQuarter.getTime()) / 86400000;
|
|
145
|
+
var quarter = getFiscalQuarter(daysFromYearEnd);
|
|
146
|
+
return { quarter: quarter, year: fiscalYear };
|
|
147
|
+
};
|
|
148
|
+
return FactItemFactory;
|
|
149
|
+
}());
|
|
150
|
+
exports.default = FactItemFactory;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import FactItem from './FactItem';
|
|
2
|
+
interface SplitData {
|
|
3
|
+
factItem: FactItem;
|
|
4
|
+
firstFiled: string;
|
|
5
|
+
}
|
|
6
|
+
export default class FactSplitMap {
|
|
7
|
+
private readonly splitKey;
|
|
8
|
+
private readonly splitByFiscalYearAmount;
|
|
9
|
+
constructor();
|
|
10
|
+
addFact(factItem: FactItem): void;
|
|
11
|
+
getSplits(): SplitData[];
|
|
12
|
+
isSplitFact(factItem: FactItem): boolean;
|
|
13
|
+
private didApplySplit;
|
|
14
|
+
getSplitAdjustedValue(factItem: FactItem): number;
|
|
15
|
+
}
|
|
16
|
+
export {};
|