ts-time-utils 4.1.0 → 4.4.1
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 +83 -32
- package/dist/{age.js → age.cjs} +14 -6
- package/dist/{calculate.js → calculate.cjs} +42 -18
- package/dist/calculate.d.ts +7 -0
- package/dist/calculate.d.ts.map +1 -1
- package/dist/{calendar.js → calendar.cjs} +80 -39
- package/dist/{calendars.js → calendars.cjs} +48 -23
- package/dist/{chain.js → chain.cjs} +41 -40
- package/dist/{compare.js → compare.cjs} +58 -28
- package/dist/constants.cjs +19 -0
- package/dist/{countdown.js → countdown.cjs} +16 -7
- package/dist/{cron.js → cron.cjs} +20 -9
- package/dist/{dateRange.js → dateRange.cjs} +42 -26
- package/dist/{duration.js → duration.cjs} +56 -44
- package/dist/esm/calculate.d.ts +7 -0
- package/dist/esm/calculate.d.ts.map +1 -1
- package/dist/esm/calculate.js +11 -0
- package/dist/esm/chain.js +0 -5
- package/dist/esm/format.d.ts.map +1 -1
- package/dist/esm/format.js +3 -3
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/naturalLanguage.d.ts +1 -3
- package/dist/esm/naturalLanguage.d.ts.map +1 -1
- package/dist/esm/naturalLanguage.js +9 -2
- package/dist/esm/plugins.d.ts +0 -6
- package/dist/esm/plugins.d.ts.map +1 -1
- package/dist/esm/plugins.js +36 -42
- package/dist/esm/recurrence.d.ts.map +1 -1
- package/dist/esm/recurrence.js +3 -5
- package/dist/esm/timezone.d.ts +6 -1
- package/dist/esm/timezone.d.ts.map +1 -1
- package/dist/esm/timezone.js +106 -66
- package/dist/esm/types.d.ts +0 -4
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/{finance.js → finance.cjs} +39 -22
- package/dist/{fiscal.js → fiscal.cjs} +36 -17
- package/dist/{format.js → format.cjs} +85 -72
- package/dist/format.d.ts.map +1 -1
- package/dist/{healthcare.js → healthcare.cjs} +37 -22
- package/dist/{holidays.js → holidays.cjs} +52 -25
- package/dist/index.cjs +596 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/{interval.js → interval.cjs} +24 -11
- package/dist/{iterate.js → iterate.cjs} +84 -41
- package/dist/{locale.js → locale.cjs} +54 -26
- package/dist/{naturalLanguage.js → naturalLanguage.cjs} +36 -23
- package/dist/naturalLanguage.d.ts +1 -3
- package/dist/naturalLanguage.d.ts.map +1 -1
- package/dist/{parse.js → parse.cjs} +24 -11
- package/dist/{performance.js → performance.cjs} +23 -10
- package/dist/{plugins.js → plugins.cjs} +48 -47
- package/dist/plugins.d.ts +0 -6
- package/dist/plugins.d.ts.map +1 -1
- package/dist/{precision.js → precision.cjs} +74 -37
- package/dist/{rangePresets.js → rangePresets.cjs} +40 -19
- package/dist/{recurrence.js → recurrence.cjs} +27 -21
- package/dist/recurrence.d.ts.map +1 -1
- package/dist/{scheduling.js → scheduling.cjs} +46 -31
- package/dist/{serialize.js → serialize.cjs} +36 -17
- package/dist/{temporal.js → temporal.cjs} +28 -13
- package/dist/{timezone.js → timezone.cjs} +140 -82
- package/dist/timezone.d.ts +6 -1
- package/dist/timezone.d.ts.map +1 -1
- package/dist/{types.js → types.cjs} +9 -3
- package/dist/types.d.ts +0 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/{validate.js → validate.cjs} +54 -26
- package/dist/{workingHours.js → workingHours.cjs} +36 -17
- package/package.json +41 -38
- package/dist/constants.js +0 -16
- package/dist/index.js +0 -72
|
@@ -1,9 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* @fileoverview Finance utilities for market-aware date calculations
|
|
3
4
|
* Provides US market hours, trading days, settlement dates, and options expiration
|
|
4
5
|
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.US_MARKET_HOLIDAYS = exports.MARKET_HOURS = void 0;
|
|
8
|
+
exports.isMarketHoliday = isMarketHoliday;
|
|
9
|
+
exports.isTradingDay = isTradingDay;
|
|
10
|
+
exports.isMarketOpen = isMarketOpen;
|
|
11
|
+
exports.getMarketHours = getMarketHours;
|
|
12
|
+
exports.getMarketOpen = getMarketOpen;
|
|
13
|
+
exports.getMarketClose = getMarketClose;
|
|
14
|
+
exports.getNextMarketOpen = getNextMarketOpen;
|
|
15
|
+
exports.getNextMarketClose = getNextMarketClose;
|
|
16
|
+
exports.getSettlementDate = getSettlementDate;
|
|
17
|
+
exports.getTradeDateFromSettlement = getTradeDateFromSettlement;
|
|
18
|
+
exports.eachTradingDay = eachTradingDay;
|
|
19
|
+
exports.countTradingDays = countTradingDays;
|
|
20
|
+
exports.addTradingDays = addTradingDays;
|
|
21
|
+
exports.getOptionsExpiration = getOptionsExpiration;
|
|
5
22
|
/** Market hours for US exchanges */
|
|
6
|
-
|
|
23
|
+
exports.MARKET_HOURS = {
|
|
7
24
|
NYSE: {
|
|
8
25
|
open: { hour: 9, minute: 30 },
|
|
9
26
|
close: { hour: 16, minute: 0 },
|
|
@@ -20,7 +37,7 @@ export const MARKET_HOURS = {
|
|
|
20
37
|
}
|
|
21
38
|
};
|
|
22
39
|
/** US market holidays (NYSE/NASDAQ follow same schedule) */
|
|
23
|
-
|
|
40
|
+
exports.US_MARKET_HOLIDAYS = [
|
|
24
41
|
"New Year's Day",
|
|
25
42
|
'Martin Luther King Jr. Day',
|
|
26
43
|
"Presidents' Day",
|
|
@@ -147,7 +164,7 @@ function isSameDay(date1, date2) {
|
|
|
147
164
|
* isMarketHoliday(new Date('2024-01-02')); // false
|
|
148
165
|
* ```
|
|
149
166
|
*/
|
|
150
|
-
|
|
167
|
+
function isMarketHoliday(date, market = 'NYSE') {
|
|
151
168
|
const d = toDate(date);
|
|
152
169
|
const year = d.getFullYear();
|
|
153
170
|
const holidays = getUSMarketHolidays(year);
|
|
@@ -165,7 +182,7 @@ export function isMarketHoliday(date, market = 'NYSE') {
|
|
|
165
182
|
* isTradingDay(new Date('2024-01-13')); // false (Saturday)
|
|
166
183
|
* ```
|
|
167
184
|
*/
|
|
168
|
-
|
|
185
|
+
function isTradingDay(date, market = 'NYSE') {
|
|
169
186
|
const d = toDate(date);
|
|
170
187
|
const day = d.getDay();
|
|
171
188
|
// Weekend check
|
|
@@ -189,12 +206,12 @@ export function isTradingDay(date, market = 'NYSE') {
|
|
|
189
206
|
* isMarketOpen(new Date('2024-01-15T10:30:00-05:00')); // true
|
|
190
207
|
* ```
|
|
191
208
|
*/
|
|
192
|
-
|
|
209
|
+
function isMarketOpen(date, market = 'NYSE') {
|
|
193
210
|
const d = toDate(date);
|
|
194
211
|
// First check if it's a trading day
|
|
195
212
|
if (!isTradingDay(d, market))
|
|
196
213
|
return false;
|
|
197
|
-
const hours = MARKET_HOURS[market];
|
|
214
|
+
const hours = exports.MARKET_HOURS[market];
|
|
198
215
|
// Convert to market timezone for comparison
|
|
199
216
|
// For simplicity, we assume the input is already in market timezone
|
|
200
217
|
// or we compare hours directly
|
|
@@ -216,8 +233,8 @@ export function isMarketOpen(date, market = 'NYSE') {
|
|
|
216
233
|
* console.log(hours.open); // { hour: 9, minute: 30 }
|
|
217
234
|
* ```
|
|
218
235
|
*/
|
|
219
|
-
|
|
220
|
-
const source = MARKET_HOURS[market];
|
|
236
|
+
function getMarketHours(market = 'NYSE') {
|
|
237
|
+
const source = exports.MARKET_HOURS[market];
|
|
221
238
|
return {
|
|
222
239
|
open: { ...source.open },
|
|
223
240
|
close: { ...source.close },
|
|
@@ -238,9 +255,9 @@ export function getMarketHours(market = 'NYSE') {
|
|
|
238
255
|
* console.log(open); // 2024-01-15T09:30:00
|
|
239
256
|
* ```
|
|
240
257
|
*/
|
|
241
|
-
|
|
258
|
+
function getMarketOpen(date, market = 'NYSE') {
|
|
242
259
|
const d = toDate(date);
|
|
243
|
-
const hours = MARKET_HOURS[market];
|
|
260
|
+
const hours = exports.MARKET_HOURS[market];
|
|
244
261
|
const result = new Date(d);
|
|
245
262
|
result.setHours(hours.open.hour, hours.open.minute, 0, 0);
|
|
246
263
|
return result;
|
|
@@ -257,9 +274,9 @@ export function getMarketOpen(date, market = 'NYSE') {
|
|
|
257
274
|
* console.log(close); // 2024-01-15T16:00:00
|
|
258
275
|
* ```
|
|
259
276
|
*/
|
|
260
|
-
|
|
277
|
+
function getMarketClose(date, market = 'NYSE') {
|
|
261
278
|
const d = toDate(date);
|
|
262
|
-
const hours = MARKET_HOURS[market];
|
|
279
|
+
const hours = exports.MARKET_HOURS[market];
|
|
263
280
|
const result = new Date(d);
|
|
264
281
|
result.setHours(hours.close.hour, hours.close.minute, 0, 0);
|
|
265
282
|
return result;
|
|
@@ -276,9 +293,9 @@ export function getMarketClose(date, market = 'NYSE') {
|
|
|
276
293
|
* const nextOpen = getNextMarketOpen(new Date('2024-01-12T17:00:00'));
|
|
277
294
|
* ```
|
|
278
295
|
*/
|
|
279
|
-
|
|
296
|
+
function getNextMarketOpen(after, market = 'NYSE') {
|
|
280
297
|
const d = toDate(after);
|
|
281
|
-
const hours = MARKET_HOURS[market];
|
|
298
|
+
const hours = exports.MARKET_HOURS[market];
|
|
282
299
|
// Start with current day's open
|
|
283
300
|
let candidate = getMarketOpen(d, market);
|
|
284
301
|
// If we're past today's open, start from tomorrow
|
|
@@ -305,9 +322,9 @@ export function getNextMarketOpen(after, market = 'NYSE') {
|
|
|
305
322
|
* // Returns 2024-01-15T16:00:00 (same day close)
|
|
306
323
|
* ```
|
|
307
324
|
*/
|
|
308
|
-
|
|
325
|
+
function getNextMarketClose(after, market = 'NYSE') {
|
|
309
326
|
const d = toDate(after);
|
|
310
|
-
const hours = MARKET_HOURS[market];
|
|
327
|
+
const hours = exports.MARKET_HOURS[market];
|
|
311
328
|
// Start with current day's close
|
|
312
329
|
let candidate = getMarketClose(d, market);
|
|
313
330
|
// If we're past today's close or not a trading day, go to next trading day
|
|
@@ -335,7 +352,7 @@ export function getNextMarketClose(after, market = 'NYSE') {
|
|
|
335
352
|
* // Returns 2024-01-17 (skipping weekends/holidays)
|
|
336
353
|
* ```
|
|
337
354
|
*/
|
|
338
|
-
|
|
355
|
+
function getSettlementDate(tradeDate, days, market = 'NYSE') {
|
|
339
356
|
const d = toDate(tradeDate);
|
|
340
357
|
const result = new Date(d);
|
|
341
358
|
result.setHours(0, 0, 0, 0);
|
|
@@ -361,7 +378,7 @@ export function getSettlementDate(tradeDate, days, market = 'NYSE') {
|
|
|
361
378
|
* // Returns 2024-01-15
|
|
362
379
|
* ```
|
|
363
380
|
*/
|
|
364
|
-
|
|
381
|
+
function getTradeDateFromSettlement(settlementDate, days, market = 'NYSE') {
|
|
365
382
|
const d = toDate(settlementDate);
|
|
366
383
|
const result = new Date(d);
|
|
367
384
|
result.setHours(0, 0, 0, 0);
|
|
@@ -387,7 +404,7 @@ export function getTradeDateFromSettlement(settlementDate, days, market = 'NYSE'
|
|
|
387
404
|
* // Returns Mon, Tue, Wed, Thu, Fri (if no holidays)
|
|
388
405
|
* ```
|
|
389
406
|
*/
|
|
390
|
-
|
|
407
|
+
function eachTradingDay(start, end, market = 'NYSE') {
|
|
391
408
|
const startDate = toDate(start);
|
|
392
409
|
const endDate = toDate(end);
|
|
393
410
|
startDate.setHours(0, 0, 0, 0);
|
|
@@ -415,7 +432,7 @@ export function eachTradingDay(start, end, market = 'NYSE') {
|
|
|
415
432
|
* // Returns 5 (Mon-Fri if no holidays)
|
|
416
433
|
* ```
|
|
417
434
|
*/
|
|
418
|
-
|
|
435
|
+
function countTradingDays(start, end, market = 'NYSE') {
|
|
419
436
|
return eachTradingDay(start, end, market).length;
|
|
420
437
|
}
|
|
421
438
|
/**
|
|
@@ -431,7 +448,7 @@ export function countTradingDays(start, end, market = 'NYSE') {
|
|
|
431
448
|
* // Returns 5 trading days later
|
|
432
449
|
* ```
|
|
433
450
|
*/
|
|
434
|
-
|
|
451
|
+
function addTradingDays(date, days, market = 'NYSE') {
|
|
435
452
|
const d = toDate(date);
|
|
436
453
|
const result = new Date(d);
|
|
437
454
|
result.setHours(0, 0, 0, 0);
|
|
@@ -466,7 +483,7 @@ export function addTradingDays(date, days, market = 'NYSE') {
|
|
|
466
483
|
* const quarterly = getOptionsExpiration(2024, 3, 'quarterly');
|
|
467
484
|
* ```
|
|
468
485
|
*/
|
|
469
|
-
|
|
486
|
+
function getOptionsExpiration(year, month, type = 'monthly') {
|
|
470
487
|
// Adjust month to 0-indexed
|
|
471
488
|
const monthIndex = month - 1;
|
|
472
489
|
switch (type) {
|
|
@@ -1,7 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
/**
|
|
2
3
|
* @fileoverview Fiscal year and accounting period utilities
|
|
3
4
|
* Supports configurable fiscal year start months for business calculations
|
|
4
5
|
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.FISCAL_PRESETS = void 0;
|
|
8
|
+
exports.getFiscalYear = getFiscalYear;
|
|
9
|
+
exports.getFiscalQuarter = getFiscalQuarter;
|
|
10
|
+
exports.getFiscalYearStart = getFiscalYearStart;
|
|
11
|
+
exports.getFiscalYearEnd = getFiscalYearEnd;
|
|
12
|
+
exports.getFiscalQuarterStart = getFiscalQuarterStart;
|
|
13
|
+
exports.getFiscalQuarterEnd = getFiscalQuarterEnd;
|
|
14
|
+
exports.isSameFiscalYear = isSameFiscalYear;
|
|
15
|
+
exports.isSameFiscalQuarter = isSameFiscalQuarter;
|
|
16
|
+
exports.getFiscalMonth = getFiscalMonth;
|
|
17
|
+
exports.getDaysRemainingInFiscalYear = getDaysRemainingInFiscalYear;
|
|
18
|
+
exports.getDaysElapsedInFiscalYear = getDaysElapsedInFiscalYear;
|
|
19
|
+
exports.getFiscalYearProgress = getFiscalYearProgress;
|
|
20
|
+
exports.getFiscalWeek = getFiscalWeek;
|
|
21
|
+
exports.formatFiscalYear = formatFiscalYear;
|
|
22
|
+
exports.formatFiscalQuarter = formatFiscalQuarter;
|
|
23
|
+
exports.getFiscalPeriodInfo = getFiscalPeriodInfo;
|
|
5
24
|
const DEFAULT_CONFIG = {
|
|
6
25
|
startMonth: 1, // January (calendar year)
|
|
7
26
|
};
|
|
@@ -22,7 +41,7 @@ const DEFAULT_CONFIG = {
|
|
|
22
41
|
* getFiscalYear(new Date('2024-06-15'), { startMonth: 7 }) // 2023
|
|
23
42
|
* getFiscalYear(new Date('2024-07-15'), { startMonth: 7 }) // 2024
|
|
24
43
|
*/
|
|
25
|
-
|
|
44
|
+
function getFiscalYear(date, config = {}) {
|
|
26
45
|
const { startMonth } = { ...DEFAULT_CONFIG, ...config };
|
|
27
46
|
const month = date.getMonth() + 1; // 1-12
|
|
28
47
|
const year = date.getFullYear();
|
|
@@ -47,7 +66,7 @@ export function getFiscalYear(date, config = {}) {
|
|
|
47
66
|
* getFiscalQuarter(new Date('2024-04-15'), { startMonth: 4 }) // 1
|
|
48
67
|
* getFiscalQuarter(new Date('2024-07-15'), { startMonth: 4 }) // 2
|
|
49
68
|
*/
|
|
50
|
-
|
|
69
|
+
function getFiscalQuarter(date, config = {}) {
|
|
51
70
|
const { startMonth } = { ...DEFAULT_CONFIG, ...config };
|
|
52
71
|
const month = date.getMonth() + 1; // 1-12
|
|
53
72
|
// Calculate months since fiscal year start
|
|
@@ -67,7 +86,7 @@ export function getFiscalQuarter(date, config = {}) {
|
|
|
67
86
|
* getFiscalYearStart(2024, { startMonth: 4 }) // 2024-04-01 (FY2024 starts Apr 2024)
|
|
68
87
|
* getFiscalYearStart(2024, { startMonth: 7 }) // 2024-07-01 (FY2024 starts Jul 2024)
|
|
69
88
|
*/
|
|
70
|
-
|
|
89
|
+
function getFiscalYearStart(fiscalYear, config = {}) {
|
|
71
90
|
const { startMonth } = { ...DEFAULT_CONFIG, ...config };
|
|
72
91
|
// Fiscal year N starts in the startMonth of calendar year N
|
|
73
92
|
return new Date(fiscalYear, startMonth - 1, 1);
|
|
@@ -82,7 +101,7 @@ export function getFiscalYearStart(fiscalYear, config = {}) {
|
|
|
82
101
|
* getFiscalYearEnd(2024, { startMonth: 4 }) // 2025-03-31 (FY2024 ends Mar 2025)
|
|
83
102
|
* getFiscalYearEnd(2024, { startMonth: 7 }) // 2025-06-30 (FY2024 ends Jun 2025)
|
|
84
103
|
*/
|
|
85
|
-
|
|
104
|
+
function getFiscalYearEnd(fiscalYear, config = {}) {
|
|
86
105
|
const { startMonth } = { ...DEFAULT_CONFIG, ...config };
|
|
87
106
|
if (startMonth === 1) {
|
|
88
107
|
return new Date(fiscalYear, 11, 31, 23, 59, 59, 999);
|
|
@@ -107,7 +126,7 @@ export function getFiscalYearEnd(fiscalYear, config = {}) {
|
|
|
107
126
|
* getFiscalQuarterStart(2024, 1, { startMonth: 4 }) // 2023-04-01
|
|
108
127
|
* getFiscalQuarterStart(2024, 2, { startMonth: 4 }) // 2023-07-01
|
|
109
128
|
*/
|
|
110
|
-
|
|
129
|
+
function getFiscalQuarterStart(fiscalYear, quarter, config = {}) {
|
|
111
130
|
if (quarter < 1 || quarter > 4) {
|
|
112
131
|
throw new Error('Quarter must be between 1 and 4');
|
|
113
132
|
}
|
|
@@ -129,7 +148,7 @@ export function getFiscalQuarterStart(fiscalYear, quarter, config = {}) {
|
|
|
129
148
|
* getFiscalQuarterEnd(2024, 2) // 2024-06-30
|
|
130
149
|
* getFiscalQuarterEnd(2024, 1, { startMonth: 4 }) // 2023-06-30
|
|
131
150
|
*/
|
|
132
|
-
|
|
151
|
+
function getFiscalQuarterEnd(fiscalYear, quarter, config = {}) {
|
|
133
152
|
if (quarter < 1 || quarter > 4) {
|
|
134
153
|
throw new Error('Quarter must be between 1 and 4');
|
|
135
154
|
}
|
|
@@ -146,7 +165,7 @@ export function getFiscalQuarterEnd(fiscalYear, quarter, config = {}) {
|
|
|
146
165
|
* @param config - Fiscal year configuration
|
|
147
166
|
* @returns True if both dates are in the same fiscal year
|
|
148
167
|
*/
|
|
149
|
-
|
|
168
|
+
function isSameFiscalYear(date1, date2, config = {}) {
|
|
150
169
|
return getFiscalYear(date1, config) === getFiscalYear(date2, config);
|
|
151
170
|
}
|
|
152
171
|
/**
|
|
@@ -156,7 +175,7 @@ export function isSameFiscalYear(date1, date2, config = {}) {
|
|
|
156
175
|
* @param config - Fiscal year configuration
|
|
157
176
|
* @returns True if both dates are in the same fiscal year and quarter
|
|
158
177
|
*/
|
|
159
|
-
|
|
178
|
+
function isSameFiscalQuarter(date1, date2, config = {}) {
|
|
160
179
|
return (getFiscalYear(date1, config) === getFiscalYear(date2, config) &&
|
|
161
180
|
getFiscalQuarter(date1, config) === getFiscalQuarter(date2, config));
|
|
162
181
|
}
|
|
@@ -170,7 +189,7 @@ export function isSameFiscalQuarter(date1, date2, config = {}) {
|
|
|
170
189
|
* getFiscalMonth(new Date('2024-04-15'), { startMonth: 4 }) // 1
|
|
171
190
|
* getFiscalMonth(new Date('2024-03-15'), { startMonth: 4 }) // 12
|
|
172
191
|
*/
|
|
173
|
-
|
|
192
|
+
function getFiscalMonth(date, config = {}) {
|
|
174
193
|
const { startMonth } = { ...DEFAULT_CONFIG, ...config };
|
|
175
194
|
const month = date.getMonth() + 1; // 1-12
|
|
176
195
|
let fiscalMonth = month - startMonth + 1;
|
|
@@ -185,7 +204,7 @@ export function getFiscalMonth(date, config = {}) {
|
|
|
185
204
|
* @param config - Fiscal year configuration
|
|
186
205
|
* @returns Number of days remaining in the fiscal year
|
|
187
206
|
*/
|
|
188
|
-
|
|
207
|
+
function getDaysRemainingInFiscalYear(date, config = {}) {
|
|
189
208
|
const fiscalYear = getFiscalYear(date, config);
|
|
190
209
|
const fyEnd = getFiscalYearEnd(fiscalYear, config);
|
|
191
210
|
const startOfDay = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
@@ -198,7 +217,7 @@ export function getDaysRemainingInFiscalYear(date, config = {}) {
|
|
|
198
217
|
* @param config - Fiscal year configuration
|
|
199
218
|
* @returns Number of days elapsed in the fiscal year (including the given date)
|
|
200
219
|
*/
|
|
201
|
-
|
|
220
|
+
function getDaysElapsedInFiscalYear(date, config = {}) {
|
|
202
221
|
const fiscalYear = getFiscalYear(date, config);
|
|
203
222
|
const fyStart = getFiscalYearStart(fiscalYear, config);
|
|
204
223
|
const startOfDay = new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
|
@@ -211,7 +230,7 @@ export function getDaysElapsedInFiscalYear(date, config = {}) {
|
|
|
211
230
|
* @param config - Fiscal year configuration
|
|
212
231
|
* @returns Percentage of fiscal year completed (0-100)
|
|
213
232
|
*/
|
|
214
|
-
|
|
233
|
+
function getFiscalYearProgress(date, config = {}) {
|
|
215
234
|
const fiscalYear = getFiscalYear(date, config);
|
|
216
235
|
const fyStart = getFiscalYearStart(fiscalYear, config);
|
|
217
236
|
const fyEnd = getFiscalYearEnd(fiscalYear, config);
|
|
@@ -225,14 +244,14 @@ export function getFiscalYearProgress(date, config = {}) {
|
|
|
225
244
|
* @param config - Fiscal year configuration
|
|
226
245
|
* @returns The fiscal week number
|
|
227
246
|
*/
|
|
228
|
-
|
|
247
|
+
function getFiscalWeek(date, config = {}) {
|
|
229
248
|
const elapsed = getDaysElapsedInFiscalYear(date, config);
|
|
230
249
|
return Math.ceil(elapsed / 7);
|
|
231
250
|
}
|
|
232
251
|
/**
|
|
233
252
|
* Common fiscal year configurations
|
|
234
253
|
*/
|
|
235
|
-
|
|
254
|
+
exports.FISCAL_PRESETS = {
|
|
236
255
|
/** Calendar year (January start) - Default */
|
|
237
256
|
CALENDAR: { startMonth: 1 },
|
|
238
257
|
/** UK/India government fiscal year (April start) */
|
|
@@ -249,7 +268,7 @@ export const FISCAL_PRESETS = {
|
|
|
249
268
|
* @param format - Format style: 'short' (FY2024) or 'long' (FY2023/24)
|
|
250
269
|
* @returns Formatted fiscal year string
|
|
251
270
|
*/
|
|
252
|
-
|
|
271
|
+
function formatFiscalYear(fiscalYear, config = {}, format = 'short') {
|
|
253
272
|
const { startMonth } = { ...DEFAULT_CONFIG, ...config };
|
|
254
273
|
if (format === 'short' || startMonth === 1) {
|
|
255
274
|
return `FY${fiscalYear}`;
|
|
@@ -266,7 +285,7 @@ export function formatFiscalYear(fiscalYear, config = {}, format = 'short') {
|
|
|
266
285
|
* @param config - Fiscal year configuration
|
|
267
286
|
* @returns Formatted fiscal quarter string
|
|
268
287
|
*/
|
|
269
|
-
|
|
288
|
+
function formatFiscalQuarter(fiscalYear, quarter, config = {}) {
|
|
270
289
|
const fyString = formatFiscalYear(fiscalYear, config, 'short');
|
|
271
290
|
return `Q${quarter} ${fyString}`;
|
|
272
291
|
}
|
|
@@ -276,7 +295,7 @@ export function formatFiscalQuarter(fiscalYear, quarter, config = {}) {
|
|
|
276
295
|
* @param config - Fiscal year configuration
|
|
277
296
|
* @returns Object with fiscal period information
|
|
278
297
|
*/
|
|
279
|
-
|
|
298
|
+
function getFiscalPeriodInfo(date, config = {}) {
|
|
280
299
|
const fiscalYear = getFiscalYear(date, config);
|
|
281
300
|
const fiscalQuarter = getFiscalQuarter(date, config);
|
|
282
301
|
return {
|