Skip to content

Commit f55527e

Browse files
committed
fix: extract shared indicatorColumns to reduce duplication in export
SonarCloud flagged 3.9% duplication (threshold 3%) caused by identical indicator column listings in queries.ts and buildExportRows.ts. Extract the 42 indicator columns into a shared `indicatorColumns` object and spread it in both queries.
1 parent 51c0510 commit f55527e

2 files changed

Lines changed: 50 additions & 99 deletions

File tree

packages/app/src/modules/export/buildExportRows.ts

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from "~/server/db/schema";
1212
import type { CseOpinionRow } from "./mapIndicators";
1313
import { mapCseOpinions } from "./mapIndicators";
14+
import { indicatorColumns } from "./queries";
1415
import type { ExportRow, IndicatorGRow } from "./types";
1516

1617
/**
@@ -49,55 +50,7 @@ export async function buildExportRows(
4950
declarantLastName: users.lastName,
5051
declarantEmail: users.email,
5152
declarantPhone: users.phone,
52-
// Indicator A
53-
indicatorAAnnualWomen: declarations.indicatorAAnnualWomen,
54-
indicatorAAnnualMen: declarations.indicatorAAnnualMen,
55-
indicatorAHourlyWomen: declarations.indicatorAHourlyWomen,
56-
indicatorAHourlyMen: declarations.indicatorAHourlyMen,
57-
// Indicator B
58-
indicatorBAnnualWomen: declarations.indicatorBAnnualWomen,
59-
indicatorBAnnualMen: declarations.indicatorBAnnualMen,
60-
indicatorBHourlyWomen: declarations.indicatorBHourlyWomen,
61-
indicatorBHourlyMen: declarations.indicatorBHourlyMen,
62-
// Indicator C
63-
indicatorCAnnualWomen: declarations.indicatorCAnnualWomen,
64-
indicatorCAnnualMen: declarations.indicatorCAnnualMen,
65-
indicatorCHourlyWomen: declarations.indicatorCHourlyWomen,
66-
indicatorCHourlyMen: declarations.indicatorCHourlyMen,
67-
// Indicator D
68-
indicatorDAnnualWomen: declarations.indicatorDAnnualWomen,
69-
indicatorDAnnualMen: declarations.indicatorDAnnualMen,
70-
indicatorDHourlyWomen: declarations.indicatorDHourlyWomen,
71-
indicatorDHourlyMen: declarations.indicatorDHourlyMen,
72-
// Indicator E
73-
indicatorEWomen: declarations.indicatorEWomen,
74-
indicatorEMen: declarations.indicatorEMen,
75-
// Indicator F — annual
76-
indicatorFAnnualThreshold1: declarations.indicatorFAnnualThreshold1,
77-
indicatorFAnnualThreshold2: declarations.indicatorFAnnualThreshold2,
78-
indicatorFAnnualThreshold3: declarations.indicatorFAnnualThreshold3,
79-
indicatorFAnnualThreshold4: declarations.indicatorFAnnualThreshold4,
80-
indicatorFAnnualWomen1: declarations.indicatorFAnnualWomen1,
81-
indicatorFAnnualWomen2: declarations.indicatorFAnnualWomen2,
82-
indicatorFAnnualWomen3: declarations.indicatorFAnnualWomen3,
83-
indicatorFAnnualWomen4: declarations.indicatorFAnnualWomen4,
84-
indicatorFAnnualMen1: declarations.indicatorFAnnualMen1,
85-
indicatorFAnnualMen2: declarations.indicatorFAnnualMen2,
86-
indicatorFAnnualMen3: declarations.indicatorFAnnualMen3,
87-
indicatorFAnnualMen4: declarations.indicatorFAnnualMen4,
88-
// Indicator F — hourly
89-
indicatorFHourlyThreshold1: declarations.indicatorFHourlyThreshold1,
90-
indicatorFHourlyThreshold2: declarations.indicatorFHourlyThreshold2,
91-
indicatorFHourlyThreshold3: declarations.indicatorFHourlyThreshold3,
92-
indicatorFHourlyThreshold4: declarations.indicatorFHourlyThreshold4,
93-
indicatorFHourlyWomen1: declarations.indicatorFHourlyWomen1,
94-
indicatorFHourlyWomen2: declarations.indicatorFHourlyWomen2,
95-
indicatorFHourlyWomen3: declarations.indicatorFHourlyWomen3,
96-
indicatorFHourlyWomen4: declarations.indicatorFHourlyWomen4,
97-
indicatorFHourlyMen1: declarations.indicatorFHourlyMen1,
98-
indicatorFHourlyMen2: declarations.indicatorFHourlyMen2,
99-
indicatorFHourlyMen3: declarations.indicatorFHourlyMen3,
100-
indicatorFHourlyMen4: declarations.indicatorFHourlyMen4,
53+
...indicatorColumns,
10154
})
10255
.from(declarations)
10356
.innerJoin(companies, eq(declarations.siren, companies.siren))

packages/app/src/modules/export/queries.ts

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,53 @@ import {
1313
} from "~/server/db/schema";
1414
import type { CseRow, IndicatorGEntry } from "./fetchDeclarations";
1515

16+
// ── Shared select columns for indicators A–F ───────────────────────
17+
18+
export const indicatorColumns = {
19+
indicatorAAnnualWomen: declarations.indicatorAAnnualWomen,
20+
indicatorAAnnualMen: declarations.indicatorAAnnualMen,
21+
indicatorAHourlyWomen: declarations.indicatorAHourlyWomen,
22+
indicatorAHourlyMen: declarations.indicatorAHourlyMen,
23+
indicatorBAnnualWomen: declarations.indicatorBAnnualWomen,
24+
indicatorBAnnualMen: declarations.indicatorBAnnualMen,
25+
indicatorBHourlyWomen: declarations.indicatorBHourlyWomen,
26+
indicatorBHourlyMen: declarations.indicatorBHourlyMen,
27+
indicatorCAnnualWomen: declarations.indicatorCAnnualWomen,
28+
indicatorCAnnualMen: declarations.indicatorCAnnualMen,
29+
indicatorCHourlyWomen: declarations.indicatorCHourlyWomen,
30+
indicatorCHourlyMen: declarations.indicatorCHourlyMen,
31+
indicatorDAnnualWomen: declarations.indicatorDAnnualWomen,
32+
indicatorDAnnualMen: declarations.indicatorDAnnualMen,
33+
indicatorDHourlyWomen: declarations.indicatorDHourlyWomen,
34+
indicatorDHourlyMen: declarations.indicatorDHourlyMen,
35+
indicatorEWomen: declarations.indicatorEWomen,
36+
indicatorEMen: declarations.indicatorEMen,
37+
indicatorFAnnualThreshold1: declarations.indicatorFAnnualThreshold1,
38+
indicatorFAnnualThreshold2: declarations.indicatorFAnnualThreshold2,
39+
indicatorFAnnualThreshold3: declarations.indicatorFAnnualThreshold3,
40+
indicatorFAnnualThreshold4: declarations.indicatorFAnnualThreshold4,
41+
indicatorFAnnualWomen1: declarations.indicatorFAnnualWomen1,
42+
indicatorFAnnualWomen2: declarations.indicatorFAnnualWomen2,
43+
indicatorFAnnualWomen3: declarations.indicatorFAnnualWomen3,
44+
indicatorFAnnualWomen4: declarations.indicatorFAnnualWomen4,
45+
indicatorFAnnualMen1: declarations.indicatorFAnnualMen1,
46+
indicatorFAnnualMen2: declarations.indicatorFAnnualMen2,
47+
indicatorFAnnualMen3: declarations.indicatorFAnnualMen3,
48+
indicatorFAnnualMen4: declarations.indicatorFAnnualMen4,
49+
indicatorFHourlyThreshold1: declarations.indicatorFHourlyThreshold1,
50+
indicatorFHourlyThreshold2: declarations.indicatorFHourlyThreshold2,
51+
indicatorFHourlyThreshold3: declarations.indicatorFHourlyThreshold3,
52+
indicatorFHourlyThreshold4: declarations.indicatorFHourlyThreshold4,
53+
indicatorFHourlyWomen1: declarations.indicatorFHourlyWomen1,
54+
indicatorFHourlyWomen2: declarations.indicatorFHourlyWomen2,
55+
indicatorFHourlyWomen3: declarations.indicatorFHourlyWomen3,
56+
indicatorFHourlyWomen4: declarations.indicatorFHourlyWomen4,
57+
indicatorFHourlyMen1: declarations.indicatorFHourlyMen1,
58+
indicatorFHourlyMen2: declarations.indicatorFHourlyMen2,
59+
indicatorFHourlyMen3: declarations.indicatorFHourlyMen3,
60+
indicatorFHourlyMen4: declarations.indicatorFHourlyMen4,
61+
};
62+
1663
// ── Shared helper ────────────────────────────────────────────────────
1764

1865
function groupByKey<T>(rows: T[], keyFn: (row: T) => string): Map<string, T[]> {
@@ -60,63 +107,14 @@ export async function fetchSubmittedDeclarations(
60107
declarantLastName: users.lastName,
61108
declarantEmail: users.email,
62109
declarantPhone: users.phone,
63-
// Indicator A — Global remuneration gap (mean)
64-
indicatorAAnnualWomen: declarations.indicatorAAnnualWomen,
65-
indicatorAAnnualMen: declarations.indicatorAAnnualMen,
66-
indicatorAHourlyWomen: declarations.indicatorAHourlyWomen,
67-
indicatorAHourlyMen: declarations.indicatorAHourlyMen,
68-
// Indicator B — Variable remuneration gap (mean)
69-
indicatorBAnnualWomen: declarations.indicatorBAnnualWomen,
70-
indicatorBAnnualMen: declarations.indicatorBAnnualMen,
71-
indicatorBHourlyWomen: declarations.indicatorBHourlyWomen,
72-
indicatorBHourlyMen: declarations.indicatorBHourlyMen,
73-
// Indicator C — Global remuneration gap (median)
74-
indicatorCAnnualWomen: declarations.indicatorCAnnualWomen,
75-
indicatorCAnnualMen: declarations.indicatorCAnnualMen,
76-
indicatorCHourlyWomen: declarations.indicatorCHourlyWomen,
77-
indicatorCHourlyMen: declarations.indicatorCHourlyMen,
78-
// Indicator D — Variable remuneration gap (median)
79-
indicatorDAnnualWomen: declarations.indicatorDAnnualWomen,
80-
indicatorDAnnualMen: declarations.indicatorDAnnualMen,
81-
indicatorDHourlyWomen: declarations.indicatorDHourlyWomen,
82-
indicatorDHourlyMen: declarations.indicatorDHourlyMen,
83-
// Indicator E — Variable pay beneficiary count
84-
indicatorEWomen: declarations.indicatorEWomen,
85-
indicatorEMen: declarations.indicatorEMen,
86-
// Indicator F — Quartile distribution (annual)
87-
indicatorFAnnualThreshold1: declarations.indicatorFAnnualThreshold1,
88-
indicatorFAnnualThreshold2: declarations.indicatorFAnnualThreshold2,
89-
indicatorFAnnualThreshold3: declarations.indicatorFAnnualThreshold3,
90-
indicatorFAnnualThreshold4: declarations.indicatorFAnnualThreshold4,
91-
indicatorFAnnualWomen1: declarations.indicatorFAnnualWomen1,
92-
indicatorFAnnualWomen2: declarations.indicatorFAnnualWomen2,
93-
indicatorFAnnualWomen3: declarations.indicatorFAnnualWomen3,
94-
indicatorFAnnualWomen4: declarations.indicatorFAnnualWomen4,
95-
indicatorFAnnualMen1: declarations.indicatorFAnnualMen1,
96-
indicatorFAnnualMen2: declarations.indicatorFAnnualMen2,
97-
indicatorFAnnualMen3: declarations.indicatorFAnnualMen3,
98-
indicatorFAnnualMen4: declarations.indicatorFAnnualMen4,
99-
// Indicator F — Quartile distribution (hourly)
100-
indicatorFHourlyThreshold1: declarations.indicatorFHourlyThreshold1,
101-
indicatorFHourlyThreshold2: declarations.indicatorFHourlyThreshold2,
102-
indicatorFHourlyThreshold3: declarations.indicatorFHourlyThreshold3,
103-
indicatorFHourlyThreshold4: declarations.indicatorFHourlyThreshold4,
104-
indicatorFHourlyWomen1: declarations.indicatorFHourlyWomen1,
105-
indicatorFHourlyWomen2: declarations.indicatorFHourlyWomen2,
106-
indicatorFHourlyWomen3: declarations.indicatorFHourlyWomen3,
107-
indicatorFHourlyWomen4: declarations.indicatorFHourlyWomen4,
108-
indicatorFHourlyMen1: declarations.indicatorFHourlyMen1,
109-
indicatorFHourlyMen2: declarations.indicatorFHourlyMen2,
110-
indicatorFHourlyMen3: declarations.indicatorFHourlyMen3,
111-
indicatorFHourlyMen4: declarations.indicatorFHourlyMen4,
110+
...indicatorColumns,
112111
})
113112
.from(declarations)
114113
.innerJoin(companies, eq(declarations.siren, companies.siren))
115114
.innerJoin(users, eq(declarations.declarantId, users.id))
116115
.where(
117116
and(
118117
eq(declarations.status, "submitted"),
119-
// Timestamps are stored in UTC (withTimezone: true)
120118
gte(declarations.updatedAt, new Date(`${dateBegin}T00:00:00Z`)),
121119
lt(declarations.updatedAt, new Date(`${dateEnd}T00:00:00Z`)),
122120
),

0 commit comments

Comments
 (0)