@eficode/tscli
Version:
A simple CLI for Eficode Timesheets
114 lines (113 loc) • 4.72 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createWorktime = exports.listWeek = exports.getDefaultTaskFor = void 0;
const dayjs_1 = __importDefault(require("dayjs"));
const isoWeek_1 = __importDefault(require("dayjs/plugin/isoWeek"));
const jsonpath_1 = __importDefault(require("jsonpath"));
const console_table_printer_1 = require("console-table-printer");
const api_1 = require("./api");
const phases_1 = require("./phases");
const utils_1 = require("./utils");
const getWorktimes = (dt) => __awaiter(void 0, void 0, void 0, function* () {
dayjs_1.default.extend(isoWeek_1.default);
const date = (0, dayjs_1.default)(dt);
const weekly = yield (0, api_1.get)(`worktimes/weekly?year=${date.format('YYYY')}&week=${date.isoWeek()}`);
return weekly.worktimes.map((w) => ({
id: w.id,
phaseId: w.task.phaseId,
taskId: w.taskId,
date: w.date,
duration: w.duration,
}));
});
const getPhasesForDays = (phases, worktimes) => {
const weekdays = (0, utils_1.getWeekdays)();
const phasesForDays = phases.map((phase) => {
const phaseWeek = {
Name: phase.projectName === phase.name ? phase.name : `${phase.projectName} (${phase.name})`,
Id: phase.id,
};
weekdays.forEach((day) => {
const worktime = worktimes.find((w) => w.date === day.date && w.phaseId === phase.id);
if (worktime) {
phaseWeek[day.name] = worktime.duration || 0;
}
else {
phaseWeek[day.name] = '';
}
});
return phaseWeek;
});
return phasesForDays;
};
const getDefaultTaskFor = (phaseId) => __awaiter(void 0, void 0, void 0, function* () {
if (phaseId) {
const projects = yield (0, api_1.get)('projects?active=true&userHasAccess=true');
const defaultTasks = jsonpath_1.default.query(projects, `$..phases[?(@.id==${phaseId})].tasks[?(@.name=='No task')]`);
if (defaultTasks && defaultTasks.length > 0) {
return defaultTasks[0];
}
}
return {};
});
exports.getDefaultTaskFor = getDefaultTaskFor;
const listWeek = () => __awaiter(void 0, void 0, void 0, function* () {
try {
const worktimes = yield getWorktimes();
const phases = yield (0, phases_1.getCurrentPhases)();
const phasesForDays = yield getPhasesForDays(phases, worktimes);
(0, console_table_printer_1.printTable)(phasesForDays);
}
catch (err) {
console.error(err);
process.exit(1);
}
});
exports.listWeek = listWeek;
const createWorktime = (argv) => __awaiter(void 0, void 0, void 0, function* () {
const task = yield (0, exports.getDefaultTaskFor)(argv.id);
const date = (0, dayjs_1.default)(argv.date).format('YYYY-MM-DD');
const worktimes = yield getWorktimes(argv.date);
const worktime = worktimes.find((w) => w.date === date && w.phaseId === argv.id);
if (!date || !task.id) {
console.log('Creating worktime failed. Please check your parameters.');
return;
}
try {
if (worktime) {
yield (0, api_1.put)(`worktimes/${worktime.id}`, {
date,
id: worktime.id,
taskId: task.id,
duration: argv.duration.toString(),
description: argv.description,
});
console.log(`Updated worktime for ${date}`);
}
else {
yield (0, api_1.post)('worktimes', {
date,
taskId: task.id,
duration: argv.duration.toString(),
description: argv.description,
});
console.log(`Created worktime for ${date}`);
}
}
catch (err) {
console.log('Creating worktime failed.');
}
});
exports.createWorktime = createWorktime;