Skip to content

Commit 36493ed

Browse files
authored
Merge pull request #241 from Foxy/copilot/fix-reportform-last-quarter-dates
fix: `foxy-report-form` preset range boundaries for quarter/month/year dates
2 parents 452609b + 0515619 commit 36493ed

2 files changed

Lines changed: 48 additions & 13 deletions

File tree

src/elements/public/ReportForm/ReportForm.test.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,17 @@ import { ReportForm as Form } from './ReportForm';
55
import { InternalSelectControl } from '../../internal/InternalSelectControl/InternalSelectControl';
66
import { InternalNativeDateControl } from '../../internal/InternalNativeDateControl/InternalNativeDateControl';
77
import { InternalSwitchControl } from '../../internal/InternalSwitchControl/InternalSwitchControl';
8-
import { getCurrentMonth, toAPIDateTime } from './utils';
8+
import {
9+
getCurrentMonth,
10+
getCurrentQuarter,
11+
getCurrentYear,
12+
getLast30Days,
13+
getLast365Days,
14+
getPreviousMonth,
15+
getPreviousQuarter,
16+
getPreviousYear,
17+
toAPIDateTime,
18+
} from './utils';
919
import { getTestData } from '../../../testgen/getTestData';
1020
import { stub } from 'sinon';
1121

@@ -156,6 +166,31 @@ describe('ReportForm', () => {
156166
expect(control.getValue()).to.equal('4'); // 'this_month' preset
157167
});
158168

169+
it('uses calendar-aligned boundaries for all report date range presets', () => {
170+
const now = new Date(2026, 3, 17, 12, 34, 56);
171+
const cases = [
172+
{ range: getPreviousQuarter(now), start: '2026-01-01T00:00:00', end: '2026-03-31T23:59:59' },
173+
{ range: getCurrentQuarter(now), start: '2026-04-01T00:00:00', end: '2026-06-30T23:59:59' },
174+
{ range: getPreviousMonth(now), start: '2026-03-01T00:00:00', end: '2026-03-31T23:59:59' },
175+
{ range: getCurrentMonth(now), start: '2026-04-01T00:00:00', end: '2026-04-30T23:59:59' },
176+
{ range: getPreviousYear(now), start: '2025-01-01T00:00:00', end: '2025-12-31T23:59:59' },
177+
{ range: getCurrentYear(now), start: '2026-01-01T00:00:00', end: '2026-12-31T23:59:59' },
178+
{ range: getLast365Days(now), start: '2025-04-17T00:00:00', end: '2026-04-17T23:59:59' },
179+
{ range: getLast30Days(now), start: '2026-03-18T00:00:00', end: '2026-04-17T23:59:59' },
180+
];
181+
182+
cases.forEach(({ range, start, end }) => {
183+
expect(toAPIDateTime(range.start)).to.equal(start);
184+
expect(toAPIDateTime(range.end)).to.equal(end);
185+
});
186+
});
187+
188+
it('uses previous year when previous quarter crosses year boundary', () => {
189+
const { start, end } = getPreviousQuarter(new Date(2026, 0, 7, 9, 0, 0));
190+
expect(toAPIDateTime(start)).to.equal('2025-10-01T00:00:00');
191+
expect(toAPIDateTime(end)).to.equal('2025-12-31T23:59:59');
192+
});
193+
159194
it('uses custom setValue for preset control to set datetime_start and datetime_end', async () => {
160195
const element = await fixture<Form>(html`<foxy-report-form></foxy-report-form>`);
161196
const control = element.renderRoot.querySelector<InternalSelectControl>('[infer="preset"]')!;

src/elements/public/ReportForm/utils.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ export function getPreviousQuarter(now = new Date()): Range {
1818
const previousQuarterYear = now.getFullYear() - (currentQuarter === 0 ? 1 : 0);
1919

2020
const previousQuarterStart = quarters[previousQuarter][0];
21-
const start = safeDate(previousQuarterYear, previousQuarterStart);
21+
const start = safeDate(previousQuarterYear, previousQuarterStart, 1);
2222

2323
const previousQuarterEnd = quarters[previousQuarter][2];
24-
const end = new Date(new Date(previousQuarterYear, previousQuarterEnd + 1).getTime() - 1);
24+
const end = new Date(safeDate(previousQuarterYear, previousQuarterEnd + 1, 1).getTime() - 1);
2525

2626
return { start, end };
2727
}
@@ -31,38 +31,38 @@ export function getCurrentQuarter(now = new Date()): Range {
3131
const currentQuarter = quarters.findIndex(months => months.includes(currentMonth));
3232

3333
const currentQuarterStart = quarters[currentQuarter][0];
34-
const start = safeDate(now.getFullYear(), currentQuarterStart);
34+
const start = safeDate(now.getFullYear(), currentQuarterStart, 1);
3535

3636
const currentQuarterEnd = quarters[currentQuarter][2];
37-
const end = new Date(safeDate(now.getFullYear(), currentQuarterEnd + 1).getTime() - 1);
37+
const end = new Date(safeDate(now.getFullYear(), currentQuarterEnd + 1, 1).getTime() - 1);
3838

3939
return { start, end };
4040
}
4141

4242
export function getPreviousMonth(now = new Date()): Range {
43-
const start = safeDate(now.getFullYear(), now.getMonth() - 1);
44-
const end = new Date(safeDate(now.getFullYear(), now.getMonth()).getTime() - 1);
43+
const start = safeDate(now.getFullYear(), now.getMonth() - 1, 1);
44+
const end = new Date(safeDate(now.getFullYear(), now.getMonth(), 1).getTime() - 1);
4545

4646
return { start, end };
4747
}
4848

4949
export function getCurrentMonth(now = new Date()): Range {
50-
const start = safeDate(now.getFullYear(), now.getMonth());
51-
const end = new Date(safeDate(now.getFullYear(), now.getMonth() + 1).getTime() - 1);
50+
const start = safeDate(now.getFullYear(), now.getMonth(), 1);
51+
const end = new Date(safeDate(now.getFullYear(), now.getMonth() + 1, 1).getTime() - 1);
5252

5353
return { start, end };
5454
}
5555

5656
export function getPreviousYear(now = new Date()): Range {
57-
const start = safeDate(now.getFullYear() - 1, 0);
58-
const end = new Date(safeDate(now.getFullYear(), 0).getTime() - 1);
57+
const start = safeDate(now.getFullYear() - 1, 0, 1);
58+
const end = new Date(safeDate(now.getFullYear(), 0, 1).getTime() - 1);
5959

6060
return { start, end };
6161
}
6262

6363
export function getCurrentYear(now = new Date()): Range {
64-
const start = safeDate(now.getFullYear(), 0);
65-
const end = new Date(safeDate(now.getFullYear() + 1, 0).getTime() - 1);
64+
const start = safeDate(now.getFullYear(), 0, 1);
65+
const end = new Date(safeDate(now.getFullYear() + 1, 0, 1).getTime() - 1);
6666

6767
return { start, end };
6868
}

0 commit comments

Comments
 (0)