gis-lookup
Version:
Lookup Guaranteed Income Supplement amounts for Canada
99 lines (86 loc) • 2.36 kB
JavaScript
const Decimal = require('decimal.js');
const metadata = require('./data/current/metadata.json');
const table1Single = require('./data/current/table1-single.json');
const table2PartnerOAS = require('./data/current/table2-partner-oas.json');
const table3PartnerNoOAS = require('./data/current/table3-partner-no-oas.json');
const STATUS_ENUM = Object.freeze({
SINGLE: 'SINGLE',
PARTNER_OAS: 'PARTNER_OAS',
PARTNER_NO_OAS: 'PARTNER_NO_OAS',
});
function _validate(status, income) {
let dIncome;
let dIncomeNeg;
let result = {
isValid: true,
messages: [],
};
if (!STATUS_ENUM[status]) {
result.messages.push({
en_CA: 'Unknown status',
fr_CA: 'TBD',
});
result.isValid = false;
}
try {
dIncome = new Decimal(income);
dIncomeNeg = dIncome.isNeg();
} catch (err) {
result.messages.push({
en_CA: 'Invalid income',
fr_CA: 'TBD',
});
result.isValid = false;
}
if (dIncomeNeg) {
result.messages.push({
en_CA: 'Income cannot be negative',
fr_CA: 'TBD',
});
result.isValid = false;
}
return result;
}
function _lookupTable(status) {
if (status === STATUS_ENUM.SINGLE) {
return table1Single;
}
if (status === STATUS_ENUM.PARTNER_OAS) {
return table2PartnerOAS;
}
if (status === STATUS_ENUM.PARTNER_NO_OAS) {
return table3PartnerNoOAS;
}
}
function splitDate(val) {
const parts = val.split(' ');
return parts[0];
}
function parseCoveragePeriod(metadata) {
const start = splitDate(metadata.result.time_period_coverage_start);
const end = splitDate(metadata.result.time_period_coverage_end);
return { start, end };
}
function find(status, income) {
const validateResult = _validate(status, income);
if (!validateResult.isValid) {
return {
input: { status, income },
error: validateResult.messages,
};
}
const lookupTable = _lookupTable(status);
const result = lookupTable.find(gisData => {
const dFrom = new Decimal(gisData.from);
const dTo = new Decimal(gisData.to);
const dIncome = new Decimal(income);
return dFrom.lte(dIncome) && dTo.gte(dIncome);
});
return {
input: { status, income },
output: result ? result : { gis: '0' },
metadata: metadata,
coverage: parseCoveragePeriod(metadata),
};
}
module.exports = { find, STATUS: STATUS_ENUM };