mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-30 08:48:11 +00:00
feat(operations-targets): plan at any of the eight report grains
Targets could only be committed weekly, monthly, quarterly or yearly, so a figure the business quotes per half-year or per 90 days had to be split by hand into buckets it was never expressed in. The reports already re-gather a target into whatever grain the viewer asks for; this just lets the plan be entered at the grain it was agreed in. Adds day, half-year, nine-month and 90-day, matching the report units added alongside. normalisePeriodStart snaps each to its block start with the same calendar-year anchoring the SQL uses — Jan/Jul for half-years, Jan/Oct for nine-months, days 1/91/181/271 for 90-day blocks, including the same cap on the fourth block so late December does not snap into a stub of its own. That agreement is the load-bearing part. The unique index is keyed on period_start, and a target snapped to a boundary the report does not bucket on is a plan measured against a period that does not exist. The two halves live in different files and different languages, so the spec pins the boundaries rather than trusting them to stay in step. Adds operations-targets.service.spec.ts, which the module had none of: every period type, idempotency, the leap year, and the block-four cap.
This commit is contained in:
@@ -1,8 +1,26 @@
|
||||
import { BaseEntity } from '@edr/api-common';
|
||||
import { Column, Entity, Index } from 'typeorm';
|
||||
|
||||
/** Planning buckets the reports offer. Mirrors the reports' period filter. */
|
||||
export const TARGET_PERIOD_TYPES = ['week', 'month', 'quarter', 'year'] as const;
|
||||
/**
|
||||
* Planning buckets the reports offer. Mirrors the reports' period filter
|
||||
* (`PERIOD_UNITS` in `reports/revenue-classification.ts`) — a planner must be
|
||||
* able to commit a number at whatever grain the business quotes it, and the
|
||||
* report then re-gathers it into whatever grain the viewer asks for.
|
||||
*
|
||||
* All eight anchor to the calendar year. `nine_month` and `ninety_day` are the
|
||||
* two that do not divide it evenly: their last block of a year is short (Oct–Dec
|
||||
* and the 5–6 days after day 360). That is inherent to the unit, not a bug.
|
||||
*/
|
||||
export const TARGET_PERIOD_TYPES = [
|
||||
'day',
|
||||
'week',
|
||||
'month',
|
||||
'quarter',
|
||||
'half_year',
|
||||
'nine_month',
|
||||
'ninety_day',
|
||||
'year',
|
||||
] as const;
|
||||
export type TargetPeriodType = (typeof TARGET_PERIOD_TYPES)[number];
|
||||
|
||||
/** What is being planned. */
|
||||
@@ -31,9 +49,13 @@ export const TARGET_DIMENSION_LABELS: Record<TargetDimension, string> = {
|
||||
};
|
||||
|
||||
export const TARGET_PERIOD_LABELS: Record<TargetPeriodType, string> = {
|
||||
day: 'Daily',
|
||||
week: 'Weekly',
|
||||
month: 'Monthly',
|
||||
quarter: 'Quarterly',
|
||||
half_year: 'Half-yearly',
|
||||
nine_month: 'Nine-monthly',
|
||||
ninety_day: '90-day',
|
||||
year: 'Yearly',
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user