-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfetch_raport.mjs
More file actions
101 lines (82 loc) · 4.87 KB
/
Copy pathfetch_raport.mjs
File metadata and controls
101 lines (82 loc) · 4.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { SolidJobsClient } from './client.mjs';
const client = new SolidJobsClient();
const campaign = 'js-raport';
const role = 'ManualTester';
// ─────────────────────────────────────────────────────────────────────────────
// Printing helpers — walk every field the endpoint can return.
// ─────────────────────────────────────────────────────────────────────────────
function printBucket(label, bucket, total) {
console.log(` ${label.padEnd(16)} ${String(bucket.count).padStart(5)} offers (${bucket.percentage}% of ${total})`);
}
function printSeniorityNode(label, node) {
console.log(` ${label.padEnd(16)} ${String(node.count).padStart(5)} offers (${node.percentage}% of seniority.total)`);
// Nested contractType has its own independent total — not the seniority level's count.
const contract = node.contractType;
printBucket(' b2bOnly', contract.b2bOnly, contract.total);
printBucket(' permanentOnly', contract.permanentOnly, contract.total);
printBucket(' both', contract.both, contract.total);
}
function printSalaryBand(label, band) {
// Zero fields mean this seniority has no salary data that year — the object is still present.
console.log(` ${label.padEnd(14)} median=${band.medianLower}..${band.medianUpper} average=${band.averageLower}..${band.averageUpper} ranges=${band.salaryRangeCount}`);
}
function printSalary(label, salary) {
// salaryB2B / salaryUoP are omitted entirely when the year has no data at all for that contract type.
if (!salary) return console.log(` ${label}: (no data for this year)`);
printSalaryBand(`${label} junior`, salary.junior);
printSalaryBand(`${label} regular`, salary.regular);
printSalaryBand(`${label} senior`, salary.senior);
}
function printYear(year) {
console.log(`\n[${year.year}] offerCount=${year.offerCount}`);
// NOTE: every `total` below is an independent denominator — none of them equal `offerCount`
// or each other. Offers proposing neither B2B nor a permanent contract fall outside
// contractType, and offers with no declared experience level fall outside seniority.
const contract = year.contractType;
console.log(` contractType (total=${contract.total}, offerCount=${year.offerCount}):`);
printBucket('b2bOnly', contract.b2bOnly, contract.total);
printBucket('permanentOnly', contract.permanentOnly, contract.total);
printBucket('both', contract.both, contract.total);
const seniority = year.seniority;
console.log(` seniority (total=${seniority.total}, offerCount=${year.offerCount}):`);
printSeniorityNode('junior', seniority.junior);
printSeniorityNode('regular', seniority.regular);
printSeniorityNode('senior', seniority.senior);
console.log(' salary (PLN, per seniority — lower..upper band):');
printSalary('B2B', year.salaryB2B);
printSalary('UoP', year.salaryUoP);
console.log(` topSkills (${year.topSkills.length}):`);
for (const skill of year.topSkills.slice(0, 10)) {
console.log(` ${skill.name.padEnd(20)} ${skill.count} offers`);
}
console.log(` quarters (${year.quarters.length}):`);
for (const quarter of year.quarters) {
printQuarter(quarter);
}
}
function printQuarter(quarter) {
console.log(` Q${quarter.quarter} offerCount=${quarter.offerCount}`);
// Same independent-denominator caveat as at year level, scoped to the quarter.
const contract = quarter.contractType;
console.log(` contractType (total=${contract.total}, offerCount=${quarter.offerCount}):`);
printBucket('b2bOnly', contract.b2bOnly, contract.total);
printBucket('permanentOnly', contract.permanentOnly, contract.total);
printBucket('both', contract.both, contract.total);
const seniority = quarter.seniority;
console.log(` seniority (total=${seniority.total}, offerCount=${quarter.offerCount}):`);
printSeniorityNode('junior', seniority.junior);
printSeniorityNode('regular', seniority.regular);
printSeniorityNode('senior', seniority.senior);
console.log(' salary (PLN, per seniority — lower..upper band):');
printSalary('B2B', quarter.salaryB2B);
printSalary('UoP', quarter.salaryUoP);
}
// Yearly market report for a single role — up to 3 calendar years, oldest first.
// There is no `fields` parameter here: the report always comes back whole.
const raport = await client.getMarketRaport(role, campaign);
console.log(`Role: ${raport.scopeKey}`);
console.log(`Generated at: ${raport.generatedAt}`);
console.log(`Years: ${raport.years.length}`);
for (const year of raport.years) {
printYear(year);
}