imm-noc
Version:
A tool for noc inquiry
297 lines (296 loc) • 10.3 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nocs = exports.Noc = exports.Area = void 0;
const path = require('path');
var arraySort = require('array-sort');
var Typo = require("typo-js");
const fs = require('fs');
function getDetailsData() {
let rawdata = fs.readFileSync(path.join(__dirname, "./nocdescription.json"));
var noc_data = JSON.parse(rawdata);
return noc_data;
}
function getSpecialPrograms() {
let rawdata = fs.readFileSync(path.join(__dirname, "./specialnocs.json"));
var programs = JSON.parse(rawdata);
return programs;
}
class Area {
constructor(area_index) {
this.area_index = area_index;
}
get prov_index() {
for (const [key, value] of Object.entries(Area.provinces)) {
if (this.area_index >= value[0] && this.area_index <= value[1])
return Number(key);
}
}
get prov_name() {
return Area.province_names[this.prov_index];
}
get prov_name_short() {
return Area.province_names_short[this.prov_index];
}
}
exports.Area = Area;
Area.province_names = [
'Newfoundland and Labrador',
'Prince Edward Island',
'Nova Scotia',
'New Brunswick',
'Quebec',
'Ontario',
'Manitoba',
'Saskatchewan',
'Alberta',
'British Columbia',
'Yukon Territory',
'Northwest Territories',
'Nunavut'
];
Area.province_names_short = [
'NL',
'PE',
'NS',
'NB',
'QB',
'ON',
'MB',
'SK',
'AB',
'BC',
'YT',
'NT',
'NU'
];
Area.provinces = {
0: [0, 3],
1: [-1, -1],
2: [4, 8],
3: [9, 13],
4: [14, 30],
5: [31, 41],
6: [42, 49],
7: [50, 55],
8: [56, 63],
9: [64, 71],
10: [-1, -1],
11: [-1, -1],
12: [-1, -1] //'Nunavut'
};
// NOC class
class Noc {
constructor(noc_code) {
this.noc_code = noc_code;
}
area_outlook(area_index = 66) {
return Noc.nocs[this.noc_code].region[area_index].outlook;
}
prov_outlook(prov_index = 9) {
return Noc.nocs[this.noc_code].province[prov_index].outlook;
}
area_salary_lowest(area_index = 66) {
return Noc.nocs[this.noc_code].region[area_index].lowest;
}
area_salary_median(area_index = 66) {
return Noc.nocs[this.noc_code].region[area_index].median;
}
area_salary_highest(area_index = 66) {
return Noc.nocs[this.noc_code].region[area_index].highest;
}
prov_salary_lowest(prov_index = 9) {
return Noc.nocs[this.noc_code].province[prov_index].lowest;
}
prov_salary_median(prov_index = 9) {
return Noc.nocs[this.noc_code].province[prov_index].median;
}
prov_salary_highest(prov_index = 9) {
return Noc.nocs[this.noc_code].province[prov_index].highest;
}
area_name(area_index = 66) {
return Noc.nocs[this.noc_code].region[area_index].region;
}
prov_name(prov_index = 9) {
return Noc.nocs[this.noc_code].province[prov_index].region;
}
get_area_outlook_wages(area_index = 66) {
return Noc.nocs[this.noc_code].region[area_index];
}
get_prov_outlook_wages(prov_index = 9) {
return Noc.nocs[this.noc_code].province[prov_index];
}
get_canada_outlook_wages() {
return Noc.nocs[this.noc_code].canada;
}
static getNocs() {
try {
const filename = path.join(__dirname, './nocs.json');
const rawdata = fs.readFileSync(filename);
return JSON.parse(rawdata);
}
catch (err) {
console.log(`${err}`);
process.exit(1);
}
}
// get noc details
getDetails(args) {
const noc = this.noc_code;
var noc_data = getDetailsData()[noc];
switch (args) {
case 'tt':
return { noc: noc, label: "Title", content: noc_data['title'] };
break;
case 'gd':
return { noc: noc, label: "general_description", content: noc_data['general_description'] };
break;
case 'md':
return { noc: noc, label: "main_duties", content: noc_data['main_duties'] };
break;
case 'er':
return { noc: noc, label: "employment_requirements", content: noc_data['employment_requirements'] };
break;
case 'ai':
return { noc: noc, label: "additional_information", content: noc_data['additional_information'] };
break;
case 'te':
return { noc: noc, label: "title_examples", content: noc_data['title_examples'] };
break;
case 'ec':
return { noc: noc, label: "exclusion", content: noc_data['exclusion'] };
break;
default:
return {};
break;
}
}
// Find related special programs
getRelatedPrograms() {
var related_programs = [];
const programs = getSpecialPrograms().noc;
for (var program of programs) {
program.noc_codes && program.noc_codes.includes(this.noc_code) && related_programs.push(program);
}
return related_programs;
}
showRelatedPrograms(related_programs, with_source = false, with_description = false) {
// description and source list
var description = [];
var source = [];
for (var p of related_programs) {
delete p.noc_codes;
p.stream = p.stream ? p.stream.slice(0, 60) : "";
p.remark = p.remark ? p.remark.slice(0, 60) : "";
// get source and description seperately
source.push(p.source);
delete p.source;
description.push(p.description);
delete p.description;
}
console.table(related_programs);
if (with_source) {
for (var [index, s] of Object.entries(source))
console.log(`Program ${index} source: ${s}`);
}
console.log("\n");
if (with_description) {
for (var [index, d] of Object.entries(description))
console.log(`Program ${index} description: ${d}`);
}
}
}
exports.Noc = Noc;
_a = Noc;
Noc.nocs = _a.getNocs();
class Nocs {
constructor(nocs = []) {
this.nocs = nocs;
}
qualifiedNocs(starts_with, outlook, area_index, order_by = "median", reverse = false) {
const nocs = Noc.nocs;
const prov_index = (new Area(area_index)).prov_index || null;
var qualified_nocs = [];
for (const [key, value] of Object.entries(nocs)) {
if (prov_index && key.startsWith(starts_with) && nocs[key].province[prov_index].outlook === Number(outlook)) {
qualified_nocs.push(Object.assign({ noc: key }, nocs[key].province[prov_index]));
}
if (key.startsWith(starts_with) && nocs[key].region[area_index].outlook === Number(outlook)) {
qualified_nocs.push(Object.assign({ noc: key }, nocs[key].region[area_index]));
}
}
arraySort(qualified_nocs, order_by, reverse);
return qualified_nocs;
}
qualifiedPlaces(noc, outlook, order_by = 'median', reverse = false) {
var qualified_places = [];
const nocs = Noc.nocs;
// for provinces
for (const prov of nocs[noc].province) {
if (prov.outlook == outlook)
qualified_places.push(Object.assign({ province: prov.region }, prov));
}
// for regions
for (const [i, area] of nocs[noc].region.entries()) {
const the_area = new Area(i);
if (area.outlook == outlook)
qualified_places.push(Object.assign({ province: the_area.prov_name }, area));
}
// arraySort(qualified_places, order_by, reverse);
return qualified_places;
}
include_title_element(noc_title, key_words) {
var included = [];
for (var key of key_words) {
if (noc_title.includes(key)) {
included.push(true);
}
else {
included.push(false);
}
}
return included.every(e => e == true);
}
getNocCodes(keywords, title_examples = null, main_duties = null) {
var dictionary = new Typo("en_US");
var suggestions = [];
for (var kw of keywords) {
var is_spelled_correctly = dictionary.check(kw);
if (!is_spelled_correctly) {
suggestions.push({ word: kw, suggestion: dictionary.suggest(kw) });
}
}
if (suggestions.length > 0) {
var err = false;
for (var suggestion of suggestions) {
console.log(`"${suggestion.word}" is misspelled. Suggestions:`, suggestion.suggestion);
err = true;
}
err && process.exit(1);
}
const title = keywords.join(' ').toLowerCase().split(" ");
const noc_data = getDetailsData();
var nocs = [];
for (var noc of Object.keys(noc_data)) {
if (this.include_title_element(noc_data[noc].title.toLowerCase(), title))
nocs.push({ noc: noc, title: noc_data[noc].title });
title_examples && this.include_title_element(noc_data[noc].title_examples.toLowerCase(), title) && nocs.push({ noc: noc, title: noc_data[noc].title });
main_duties && this.include_title_element(noc_data[noc].main_duties.toLowerCase(), title) && nocs.push({ noc: noc, title: noc_data[noc].title });
}
return nocs;
}
}
exports.Nocs = Nocs;
const noc1 = new Noc('0213');
var ps = noc1.getRelatedPrograms();
// noc1.showRelatedPrograms(ps);
// console.log(noc1.getDetails('md').main_duties);
// console.table(noc1.get_area_outlook_wages(16))
// const noc2 = new Noc("1111");
// const noc3 = new Noc("0111");
// // console.log(noc1.prov_outlook())
// // console.log(noc1.noc_code, noc1.prov_name(), noc1.prov_salary_lowest(), noc1.prov_salary_median(), noc1.prov_salary_highest())
// const nocs = new Nocs();
// console.table(nocs.getNocCodes('marketing', true, true))
// console.log(nocs.qualifiedNocs('11', 3, 47))
// // console.log(nocs.qualifiedPlaces('1111', 3))