mite-cli
Version:
command line tool for time tracking service mite.de
169 lines (164 loc) • 4.42 kB
JavaScript
;
const formater = require('./../formater');
const { BUDGET_TYPE } = require('./../../lib/constants');
const supportsExtendedFormat = require('./../data-output').supportsExtendedFormat;
function getBudgetUsage(project) {
if (!project.used_budget) return undefined;
let percentage = 0;
switch (project.budget_type) {
case BUDGET_TYPE.MINUTES_PER_MONTH:
case BUDGET_TYPE.MINUTES:
percentage = project.used_budget.minutes / project.budget;
break;
case BUDGET_TYPE.CENTS_PER_MONTH:
case BUDGET_TYPE.CENTS:
percentage = (project.used_budget.revenue || 0) / project.budget;
break;
}
return percentage;
}
module.exports.sort = {
default: 'name',
options: [
'archived',
'budget',
'created_at',
'customer_id',
'customer_name',
'customer',
'hourly_rate',
'id',
'name',
'updated_at',
]
};
module.exports.columns = {
default: 'name,customer,budget,budget_used,budget_used_chart,hourly_rate',
options: {
archived: {
label: 'Archived',
attribute: 'archived',
format: formater.booleanToHumanvalue,
},
budget: {
label: 'Budget',
attribute: 'budget',
width: 12,
alignment: 'right',
format: (value, item, format) => {
if (!value && supportsExtendedFormat(format)) {
return '-';
}
return formater.budget(item.budget_type, value);
},
},
// shows the relative usage of the budget defined, requires the "project"
// item to have information about the total budget
budget_usage: {
label: 'Budget' + "\n" + 'Used',
attribute: 'budget',
width: 6,
alignment: 'right',
format: (value, item) => {
if (!value || !item.used_budget) return;
let percentage = getBudgetUsage(item);
return formater.getBudgetPercentageColor(percentage)(`${formater.number(percentage * 100, 0)}%`);
}
},
budget_used_chart: {
label: 'Budget\nUsed',
attribute: 'budget',
width: 10,
alignment: 'left',
format: (value, item) => {
if (!value || !item.used_budget) return;
let percentage = getBudgetUsage(item);
return formater.getBudgetPercentageColor(percentage)(formater.percentChart(percentage, 10));
}
},
budget_used: {
label: 'Budget' + "\n" + 'Used',
attribute: 'budget',
width: 12,
alignment: 'right',
format: (value, item) => {
if (!item.used_budget || !value) return '';
switch (item.budget_type) {
case BUDGET_TYPE.MINUTES_PER_MONTH:
case BUDGET_TYPE.MINUTES:
return formater.budget(BUDGET_TYPE.MINUTES, item.used_budget.minutes);
case BUDGET_TYPE.CENTS_PER_MONTH:
case BUDGET_TYPE.CENTS:
return formater.budget(BUDGET_TYPE.CENTS, item.used_budget.revenue);
}
}
},
budget_type: {
label: 'Budget Type',
attribute: 'budget_type',
},
created_at: {
label: 'Created At',
attribute: 'created_at',
},
customer_id: {
label: 'Customer ID',
attribute: 'customer_id'
},
customer_name: {
label: 'Customer Name',
attribute: 'customer_name'
},
customer: {
label: 'Customer',
attribute: 'customer_name',
format: (value, item) => {
if (!value) return '';
return item.customer_name;
}
},
id: {
label: 'ID',
attribute: 'id',
width: 10,
alignment: 'right'
},
name: {
label: 'Name',
attribute: 'name',
},
note: {
label: 'Note',
attribute: 'note',
width: 50,
wrapWord: true,
alignment: 'left',
format: formater.note,
},
hourly_rate: {
label: 'Rate',
attribute: 'hourly_rate',
width: 10,
alignment: 'right',
format: (value, item, format) => {
if (!value && supportsExtendedFormat(format)) {
return '-';
}
return formater.budget(formater.BUDGET_TYPE.CENTS, value || 0);
},
},
revenue: {
label: 'Revenue',
attribute: 'revenue',
width: 12,
alignment: 'right',
format: (value) => {
return formater.budget(formater.BUDGET_TYPE.CENTS, value || 0);
}
},
updated_at: {
label: 'Updated At',
attribute: 'updated_at',
}
}
};