@marcfargas/odoo-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/cli.d.ts +27 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +152 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/accounting.d.ts +16 -0
  6. package/dist/commands/accounting.d.ts.map +1 -0
  7. package/dist/commands/accounting.js +363 -0
  8. package/dist/commands/accounting.js.map +1 -0
  9. package/dist/commands/attendance.d.ts +14 -0
  10. package/dist/commands/attendance.d.ts.map +1 -0
  11. package/dist/commands/attendance.js +339 -0
  12. package/dist/commands/attendance.js.map +1 -0
  13. package/dist/commands/config.d.ts +12 -0
  14. package/dist/commands/config.d.ts.map +1 -0
  15. package/dist/commands/config.js +159 -0
  16. package/dist/commands/config.js.map +1 -0
  17. package/dist/commands/mail.d.ts +12 -0
  18. package/dist/commands/mail.d.ts.map +1 -0
  19. package/dist/commands/mail.js +236 -0
  20. package/dist/commands/mail.js.map +1 -0
  21. package/dist/commands/modules.d.ts +14 -0
  22. package/dist/commands/modules.d.ts.map +1 -0
  23. package/dist/commands/modules.js +351 -0
  24. package/dist/commands/modules.js.map +1 -0
  25. package/dist/commands/records.d.ts +15 -0
  26. package/dist/commands/records.d.ts.map +1 -0
  27. package/dist/commands/records.js +591 -0
  28. package/dist/commands/records.js.map +1 -0
  29. package/dist/commands/schema.d.ts +16 -0
  30. package/dist/commands/schema.d.ts.map +1 -0
  31. package/dist/commands/schema.js +381 -0
  32. package/dist/commands/schema.js.map +1 -0
  33. package/dist/commands/state.d.ts +14 -0
  34. package/dist/commands/state.d.ts.map +1 -0
  35. package/dist/commands/state.js +373 -0
  36. package/dist/commands/state.js.map +1 -0
  37. package/dist/commands/timesheets.d.ts +15 -0
  38. package/dist/commands/timesheets.d.ts.map +1 -0
  39. package/dist/commands/timesheets.js +453 -0
  40. package/dist/commands/timesheets.js.map +1 -0
  41. package/dist/commands/url.d.ts +12 -0
  42. package/dist/commands/url.d.ts.map +1 -0
  43. package/dist/commands/url.js +149 -0
  44. package/dist/commands/url.js.map +1 -0
  45. package/dist/help/extra-help.d.ts +18 -0
  46. package/dist/help/extra-help.d.ts.map +1 -0
  47. package/dist/help/extra-help.js +207 -0
  48. package/dist/help/extra-help.js.map +1 -0
  49. package/dist/middleware/auth.d.ts +29 -0
  50. package/dist/middleware/auth.d.ts.map +1 -0
  51. package/dist/middleware/auth.js +68 -0
  52. package/dist/middleware/auth.js.map +1 -0
  53. package/dist/middleware/common-params.d.ts +90 -0
  54. package/dist/middleware/common-params.d.ts.map +1 -0
  55. package/dist/middleware/common-params.js +169 -0
  56. package/dist/middleware/common-params.js.map +1 -0
  57. package/dist/middleware/safety.d.ts +30 -0
  58. package/dist/middleware/safety.d.ts.map +1 -0
  59. package/dist/middleware/safety.js +64 -0
  60. package/dist/middleware/safety.js.map +1 -0
  61. package/dist/output/errors.d.ts +69 -0
  62. package/dist/output/errors.d.ts.map +1 -0
  63. package/dist/output/errors.js +193 -0
  64. package/dist/output/errors.js.map +1 -0
  65. package/dist/output/formatter.d.ts +80 -0
  66. package/dist/output/formatter.d.ts.map +1 -0
  67. package/dist/output/formatter.js +285 -0
  68. package/dist/output/formatter.js.map +1 -0
  69. package/dist/output/stream-writer.d.ts +33 -0
  70. package/dist/output/stream-writer.d.ts.map +1 -0
  71. package/dist/output/stream-writer.js +74 -0
  72. package/dist/output/stream-writer.js.map +1 -0
  73. package/dist/parsing/domain-parser.d.ts +61 -0
  74. package/dist/parsing/domain-parser.d.ts.map +1 -0
  75. package/dist/parsing/domain-parser.js +427 -0
  76. package/dist/parsing/domain-parser.js.map +1 -0
  77. package/dist/parsing/json-arg.d.ts +48 -0
  78. package/dist/parsing/json-arg.d.ts.map +1 -0
  79. package/dist/parsing/json-arg.js +165 -0
  80. package/dist/parsing/json-arg.js.map +1 -0
  81. package/package.json +53 -0
@@ -0,0 +1,453 @@
1
+ "use strict";
2
+ /**
3
+ * `odoo timesheets` command group.
4
+ *
5
+ * Commands:
6
+ * timesheets start Start a timer [WRITE]
7
+ * timesheets stop Stop running timer [WRITE]
8
+ * timesheets running Show running timer [READ]
9
+ * timesheets log Log time retroactively [WRITE]
10
+ * timesheets list List timesheets [READ]
11
+ *
12
+ * Requires hr_timesheet module to be installed.
13
+ */
14
+ var __importDefault = (this && this.__importDefault) || function (mod) {
15
+ return (mod && mod.__esModule) ? mod : { "default": mod };
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.buildTimesheetsCommand = buildTimesheetsCommand;
19
+ const commander_1 = require("commander");
20
+ const debug_1 = __importDefault(require("debug"));
21
+ const auth_1 = require("../middleware/auth");
22
+ const safety_1 = require("../middleware/safety");
23
+ const common_params_1 = require("../middleware/common-params");
24
+ const formatter_1 = require("../output/formatter");
25
+ const errors_1 = require("../output/errors");
26
+ const stream_writer_1 = require("../output/stream-writer");
27
+ const json_arg_1 = require("../parsing/json-arg");
28
+ const extra_help_1 = require("../help/extra-help");
29
+ const log = (0, debug_1.default)('odoo-cli:timesheets');
30
+ function buildTimesheetsCommand() {
31
+ const ts = new commander_1.Command('timesheets')
32
+ .description('Time tracking — timer-based and manual logging')
33
+ .addHelpText('after', `
34
+ Requires: hr_timesheet Odoo module.
35
+
36
+ Safety:
37
+ READ running, list — no confirmation required
38
+ WRITE start, stop, log — requires --confirm
39
+
40
+ Timer workflow:
41
+ odoo timesheets start --task-id 42 --description "Feature work" --confirm
42
+ odoo timesheets stop --confirm
43
+
44
+ Manual:
45
+ odoo timesheets log --task-id 42 --hours 1.5 --description "Review" --confirm
46
+ `);
47
+ // --help-extra
48
+ ts.option('--help-extra', 'Show extended skill documentation for timesheets');
49
+ ts.hook('preAction', async (thisCommand) => {
50
+ const opts = thisCommand.opts();
51
+ if (opts.helpExtra) {
52
+ await (0, extra_help_1.showHelpExtra)('timesheets');
53
+ process.exit(0);
54
+ }
55
+ });
56
+ ts.addCommand(buildStartCommand());
57
+ ts.addCommand(buildStopCommand());
58
+ ts.addCommand(buildRunningCommand());
59
+ ts.addCommand(buildLogCommand());
60
+ ts.addCommand(buildListCommand());
61
+ return ts;
62
+ }
63
+ function buildStartCommand() {
64
+ const cmd = new commander_1.Command('start')
65
+ .description('Start a timesheet timer [WRITE — requires --confirm]')
66
+ .addHelpText('after', `
67
+ Examples:
68
+ odoo timesheets start --task-id 42 --description "Working on login bug" --confirm
69
+ odoo timesheets start --project-id 5 --description "Project work" --confirm
70
+ `);
71
+ (0, common_params_1.addAuthOptions)(cmd);
72
+ cmd.addOption((0, common_params_1.confirmOption)());
73
+ cmd.addOption((0, common_params_1.dryRunOption)());
74
+ cmd.option('--task-id <n>', 'Task ID to track time on');
75
+ cmd.option('--project-id <n>', 'Project ID (required if no task)');
76
+ cmd.option('--description <text>', 'Description of work');
77
+ cmd.option('--employee-id <n>', "Employee ID (default: current user's employee)");
78
+ cmd.action(async () => {
79
+ const opts = cmd.optsWithGlobals();
80
+ log('timesheets start task=%s project=%s', opts.taskId, opts.projectId);
81
+ try {
82
+ (0, safety_1.requireConfirm)('WRITE', opts, 'timesheets start');
83
+ }
84
+ catch (err) {
85
+ process.exit((0, errors_1.handleError)(err));
86
+ }
87
+ if (!opts.taskId && !opts.projectId) {
88
+ process.stderr.write('✗ Error: --task-id or --project-id is required\n');
89
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
90
+ }
91
+ if (!opts.description) {
92
+ process.stderr.write('✗ Error: --description is required\n');
93
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
94
+ }
95
+ const taskId = opts.taskId ? parseInt(opts.taskId, 10) : undefined;
96
+ const projectId = opts.projectId ? parseInt(opts.projectId, 10) : undefined;
97
+ const employeeId = opts.employeeId ? parseInt(opts.employeeId, 10) : undefined;
98
+ // Validate: if task but no project, projectId will be resolved by the service
99
+ if (taskId && !projectId) {
100
+ // The service needs projectId — we'll need to look it up
101
+ // For now, require explicit --project-id unless --task-id implies it
102
+ }
103
+ const effectiveProjectId = projectId ?? 0;
104
+ if (opts.dryRun) {
105
+ (0, safety_1.printDryRun)('account.analytic.line', 'create', [
106
+ {
107
+ name: opts.description,
108
+ task_id: taskId,
109
+ project_id: effectiveProjectId,
110
+ unit_amount: 0,
111
+ },
112
+ ]);
113
+ return;
114
+ }
115
+ let client;
116
+ try {
117
+ client = await (0, auth_1.createAuthClient)(opts);
118
+ }
119
+ catch (err) {
120
+ process.exit((0, errors_1.handleError)(err));
121
+ }
122
+ try {
123
+ // Check for already-running timer
124
+ const running = await client.timesheets.getRunningTimers(employeeId);
125
+ if (running.length > 0) {
126
+ const r = running[0];
127
+ const taskInfo = Array.isArray(r.task_id) ? `Task#${r.task_id[0]}` : 'project work';
128
+ process.stderr.write(`✗ Error: A timer is already running (${taskInfo}, started ${r.date})\n → odoo timesheets stop --confirm\n`);
129
+ process.exit(errors_1.EXIT_CODES.CONFLICT);
130
+ }
131
+ // Resolve project if only task given
132
+ let resolvedProjectId = effectiveProjectId;
133
+ if (taskId && !projectId) {
134
+ const tasks = await client.searchRead('project.task', [['id', '=', taskId]], {
135
+ fields: ['project_id'],
136
+ limit: 1,
137
+ });
138
+ if (tasks.length > 0 && Array.isArray(tasks[0].project_id)) {
139
+ resolvedProjectId = tasks[0].project_id[0];
140
+ }
141
+ else {
142
+ process.stderr.write(`✗ Error: Cannot determine project for task ${taskId}\n → Use --project-id explicitly\n`);
143
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
144
+ }
145
+ }
146
+ const entry = await client.timesheets.startTimer({
147
+ description: opts.description,
148
+ projectId: resolvedProjectId,
149
+ taskId,
150
+ employeeId,
151
+ });
152
+ const taskLabel = Array.isArray(entry.task_id)
153
+ ? `Task#${entry.task_id[0]} "${entry.task_id[1]}"`
154
+ : `Project#${resolvedProjectId}`;
155
+ (0, errors_1.printSuccess)(`Timer started: ${taskLabel} — ${entry.date}`);
156
+ }
157
+ catch (err) {
158
+ process.exit((0, errors_1.handleError)(err));
159
+ }
160
+ finally {
161
+ client?.logout();
162
+ }
163
+ });
164
+ return cmd;
165
+ }
166
+ function buildStopCommand() {
167
+ const cmd = new commander_1.Command('stop')
168
+ .description('Stop the running timer [WRITE — requires --confirm]')
169
+ .addHelpText('after', `
170
+ Examples:
171
+ odoo timesheets stop --confirm
172
+ `);
173
+ (0, common_params_1.addAuthOptions)(cmd);
174
+ cmd.addOption((0, common_params_1.confirmOption)());
175
+ cmd.addOption((0, common_params_1.dryRunOption)());
176
+ cmd.option('--employee-id <n>', "Employee ID (default: current user's employee)");
177
+ cmd.action(async () => {
178
+ const opts = cmd.optsWithGlobals();
179
+ log('timesheets stop');
180
+ try {
181
+ (0, safety_1.requireConfirm)('WRITE', opts, 'timesheets stop');
182
+ }
183
+ catch (err) {
184
+ process.exit((0, errors_1.handleError)(err));
185
+ }
186
+ const employeeId = opts.employeeId ? parseInt(opts.employeeId, 10) : undefined;
187
+ if (opts.dryRun) {
188
+ (0, safety_1.printDryRun)('account.analytic.line', 'write', [
189
+ ['<running timer id>'],
190
+ { unit_amount: '<elapsed>' },
191
+ ]);
192
+ return;
193
+ }
194
+ let client;
195
+ try {
196
+ client = await (0, auth_1.createAuthClient)(opts);
197
+ }
198
+ catch (err) {
199
+ process.exit((0, errors_1.handleError)(err));
200
+ }
201
+ try {
202
+ const running = await client.timesheets.getRunningTimers(employeeId);
203
+ if (running.length === 0) {
204
+ process.stderr.write('✗ Error: No timer is currently running\n → odoo timesheets start\n');
205
+ process.exit(errors_1.EXIT_CODES.NOT_FOUND);
206
+ }
207
+ const entry = await client.timesheets.stopTimer(running[0].id);
208
+ const taskLabel = Array.isArray(entry.task_id)
209
+ ? `Task#${entry.task_id[0]} "${entry.task_id[1]}"`
210
+ : 'project work';
211
+ const hours = formatHoursDecimal(entry.unit_amount);
212
+ (0, errors_1.printSuccess)(`Stopped: ${taskLabel} — ${hours} logged`);
213
+ }
214
+ catch (err) {
215
+ process.exit((0, errors_1.handleError)(err));
216
+ }
217
+ finally {
218
+ client?.logout();
219
+ }
220
+ });
221
+ return cmd;
222
+ }
223
+ function buildRunningCommand() {
224
+ const cmd = new commander_1.Command('running')
225
+ .description('Show currently running timer [READ] — exit 3 if none')
226
+ .addHelpText('after', `
227
+ Exit code 3 if no timer is running (useful in scripts).
228
+
229
+ Examples:
230
+ odoo timesheets running
231
+ odoo timesheets running --format json
232
+ `);
233
+ (0, common_params_1.addAuthOptions)(cmd);
234
+ (0, common_params_1.addOutputOptions)(cmd);
235
+ cmd.option('--employee-id <n>', "Employee ID (default: current user's employee)");
236
+ cmd.action(async () => {
237
+ const opts = cmd.optsWithGlobals();
238
+ log('timesheets running');
239
+ const employeeId = opts.employeeId ? parseInt(opts.employeeId, 10) : undefined;
240
+ let client;
241
+ try {
242
+ client = await (0, auth_1.createAuthClient)(opts);
243
+ }
244
+ catch (err) {
245
+ process.exit((0, errors_1.handleError)(err));
246
+ }
247
+ try {
248
+ const running = await client.timesheets.getRunningTimers(employeeId);
249
+ if (running.length === 0) {
250
+ process.stderr.write('No timer is currently running\n');
251
+ process.exit(errors_1.EXIT_CODES.NOT_FOUND);
252
+ }
253
+ const format = (0, formatter_1.resolveFormat)(opts.format);
254
+ const entry = running[0];
255
+ if (format === 'json' || format === 'ndjson') {
256
+ const elapsed = Math.round((Date.now() - new Date(entry.date).getTime()) / 60000);
257
+ const out = {
258
+ id: entry.id,
259
+ description: entry.name,
260
+ date: entry.date,
261
+ task_id: Array.isArray(entry.task_id) ? entry.task_id[0] : null,
262
+ task_name: Array.isArray(entry.task_id) ? entry.task_id[1] : null,
263
+ project_id: Array.isArray(entry.project_id) ? entry.project_id[0] : null,
264
+ elapsed_minutes: elapsed,
265
+ };
266
+ await (0, stream_writer_1.writeStdout)(JSON.stringify(out, null, format === 'json' ? 2 : 0) + '\n');
267
+ }
268
+ else {
269
+ const elapsed = Math.round((Date.now() - new Date(entry.date).getTime()) / 60000);
270
+ const taskLabel = Array.isArray(entry.task_id)
271
+ ? `Task#${entry.task_id[0]} "${entry.task_id[1]}"`
272
+ : Array.isArray(entry.project_id)
273
+ ? `Project#${entry.project_id[0]}`
274
+ : 'Unknown';
275
+ process.stdout.write(`● RUNNING: ${taskLabel} — started ${entry.date} (${formatElapsed(elapsed)} elapsed)\n`);
276
+ }
277
+ }
278
+ catch (err) {
279
+ process.exit((0, errors_1.handleError)(err));
280
+ }
281
+ finally {
282
+ client?.logout();
283
+ }
284
+ });
285
+ return cmd;
286
+ }
287
+ function buildLogCommand() {
288
+ const cmd = new commander_1.Command('log')
289
+ .description('Log time retroactively [WRITE — requires --confirm]')
290
+ .addHelpText('after', `
291
+ --hours accepts decimal (1.5) or colon-separated (1:30) format.
292
+
293
+ Examples:
294
+ odoo timesheets log --task-id 42 --hours 2.5 --description "Code review" --confirm
295
+ odoo timesheets log --task-id 42 --hours 1:45 --date 2024-03-14 --description "Pair programming" --confirm
296
+ odoo timesheets log --task-id $ODOO_TASK --hours 0.25 --description "Deploy $CI_COMMIT_SHA" --confirm
297
+ `);
298
+ (0, common_params_1.addAuthOptions)(cmd);
299
+ cmd.addOption((0, common_params_1.confirmOption)());
300
+ cmd.addOption((0, common_params_1.dryRunOption)());
301
+ cmd.option('--task-id <n>', 'Task ID');
302
+ cmd.option('--project-id <n>', 'Project ID (required if no task)');
303
+ cmd.option('--hours <h>', 'Hours: decimal (1.5) or H:MM (1:30)');
304
+ cmd.option('--date <date>', 'Date YYYY-MM-DD (default: today)');
305
+ cmd.option('--description <text>', 'Description');
306
+ cmd.option('--employee-id <n>', "Employee ID (default: current user's employee)");
307
+ cmd.action(async () => {
308
+ const opts = cmd.optsWithGlobals();
309
+ log('timesheets log task=%s hours=%s', opts.taskId, opts.hours);
310
+ try {
311
+ (0, safety_1.requireConfirm)('WRITE', opts, 'timesheets log');
312
+ }
313
+ catch (err) {
314
+ process.exit((0, errors_1.handleError)(err));
315
+ }
316
+ if (!opts.hours) {
317
+ process.stderr.write('✗ Error: --hours is required\n');
318
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
319
+ }
320
+ if (!opts.taskId && !opts.projectId) {
321
+ process.stderr.write('✗ Error: --task-id or --project-id is required\n');
322
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
323
+ }
324
+ let hours;
325
+ try {
326
+ hours = (0, json_arg_1.parseHours)(opts.hours);
327
+ }
328
+ catch (err) {
329
+ process.exit((0, errors_1.handleError)(err));
330
+ return;
331
+ }
332
+ const taskId = opts.taskId ? parseInt(opts.taskId, 10) : undefined;
333
+ const projectId = opts.projectId ? parseInt(opts.projectId, 10) : undefined;
334
+ const employeeId = opts.employeeId ? parseInt(opts.employeeId, 10) : undefined;
335
+ const date = opts.date ?? new Date().toISOString().split('T')[0];
336
+ if (opts.dryRun) {
337
+ (0, safety_1.printDryRun)('account.analytic.line', 'create', [
338
+ {
339
+ name: opts.description ?? '',
340
+ task_id: taskId,
341
+ project_id: projectId,
342
+ unit_amount: hours,
343
+ date,
344
+ },
345
+ ]);
346
+ return;
347
+ }
348
+ let client;
349
+ try {
350
+ client = await (0, auth_1.createAuthClient)(opts);
351
+ }
352
+ catch (err) {
353
+ process.exit((0, errors_1.handleError)(err));
354
+ }
355
+ try {
356
+ // Resolve projectId from task if needed
357
+ let resolvedProjectId = projectId ?? 0;
358
+ if (taskId && !projectId) {
359
+ const tasks = await client.searchRead('project.task', [['id', '=', taskId]], {
360
+ fields: ['project_id'],
361
+ limit: 1,
362
+ });
363
+ if (tasks.length > 0 && Array.isArray(tasks[0].project_id)) {
364
+ resolvedProjectId = tasks[0].project_id[0];
365
+ }
366
+ }
367
+ const entry = await client.timesheets.logTime({
368
+ description: opts.description ?? '',
369
+ projectId: resolvedProjectId,
370
+ hours,
371
+ taskId,
372
+ employeeId,
373
+ date,
374
+ });
375
+ (0, errors_1.printSuccess)(`Logged ${formatHoursDecimal(entry.unit_amount)} on ${date} (id=${entry.id})`);
376
+ }
377
+ catch (err) {
378
+ process.exit((0, errors_1.handleError)(err));
379
+ }
380
+ finally {
381
+ client?.logout();
382
+ }
383
+ });
384
+ return cmd;
385
+ }
386
+ function buildListCommand() {
387
+ const cmd = new commander_1.Command('list').description('List timesheet entries [READ]').addHelpText('after', `
388
+ Examples:
389
+ odoo timesheets list --from 2024-03-11 --to 2024-03-15
390
+ odoo timesheets list --project-id 5 --format csv > project-time.csv
391
+ `);
392
+ (0, common_params_1.addAuthOptions)(cmd);
393
+ (0, common_params_1.addOutputOptions)(cmd);
394
+ cmd.option('--from <date>', 'Start date YYYY-MM-DD');
395
+ cmd.option('--to <date>', 'End date YYYY-MM-DD');
396
+ cmd.option('--employee-id <n>', 'Filter by employee');
397
+ cmd.option('--project-id <n>', 'Filter by project');
398
+ cmd.option('--task-id <n>', 'Filter by task');
399
+ cmd.action(async () => {
400
+ const opts = cmd.optsWithGlobals();
401
+ log('timesheets list from=%s to=%s', opts.from, opts.to);
402
+ let client;
403
+ try {
404
+ client = await (0, auth_1.createAuthClient)(opts);
405
+ }
406
+ catch (err) {
407
+ process.exit((0, errors_1.handleError)(err));
408
+ }
409
+ try {
410
+ const entries = await client.timesheets.list({
411
+ dateFrom: opts.from,
412
+ dateTo: opts.to,
413
+ employeeId: opts.employeeId ? parseInt(opts.employeeId, 10) : undefined,
414
+ projectId: opts.projectId ? parseInt(opts.projectId, 10) : undefined,
415
+ taskId: opts.taskId ? parseInt(opts.taskId, 10) : undefined,
416
+ });
417
+ const format = (0, formatter_1.resolveFormat)(opts.format);
418
+ const rows = entries.map((e) => ({
419
+ id: e.id,
420
+ date: e.date,
421
+ description: e.name,
422
+ hours: e.unit_amount.toFixed(2),
423
+ project: Array.isArray(e.project_id) ? e.project_id[1] : '',
424
+ task: Array.isArray(e.task_id) ? e.task_id[1] : '',
425
+ employee: Array.isArray(e.employee_id) ? e.employee_id[1] : '',
426
+ }));
427
+ await (0, formatter_1.render)(rows, format);
428
+ if (format === 'table' && rows.length > 0) {
429
+ const total = entries.reduce((s, e) => s + e.unit_amount, 0);
430
+ process.stderr.write(`Total: ${total.toFixed(2)} hours\n`);
431
+ }
432
+ }
433
+ catch (err) {
434
+ process.exit((0, errors_1.handleError)(err));
435
+ }
436
+ finally {
437
+ client?.logout();
438
+ }
439
+ });
440
+ return cmd;
441
+ }
442
+ // ── Helpers ──────────────────────────────────────────────────────────
443
+ function formatHoursDecimal(hours) {
444
+ const h = Math.floor(hours);
445
+ const m = Math.round((hours - h) * 60);
446
+ return `${h}h ${m.toString().padStart(2, '0')}m`;
447
+ }
448
+ function formatElapsed(minutes) {
449
+ const h = Math.floor(minutes / 60);
450
+ const m = minutes % 60;
451
+ return h > 0 ? `${h}h ${m}m` : `${m}m`;
452
+ }
453
+ //# sourceMappingURL=timesheets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timesheets.js","sourceRoot":"","sources":["../../src/commands/timesheets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `odoo url` command group — generate record URLs.
3
+ *
4
+ * Commands:
5
+ * url record <model> <id> Generate backend URL [READ]
6
+ * url portal <model> <id> Generate portal URL [READ]
7
+ *
8
+ * Both commands are READ — no mutations, no --confirm required.
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare function buildUrlCommand(): Command;
12
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/commands/url.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,eAAe,IAAI,OAAO,CAgCzC"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * `odoo url` command group — generate record URLs.
4
+ *
5
+ * Commands:
6
+ * url record <model> <id> Generate backend URL [READ]
7
+ * url portal <model> <id> Generate portal URL [READ]
8
+ *
9
+ * Both commands are READ — no mutations, no --confirm required.
10
+ */
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.buildUrlCommand = buildUrlCommand;
16
+ const commander_1 = require("commander");
17
+ const debug_1 = __importDefault(require("debug"));
18
+ const auth_1 = require("../middleware/auth");
19
+ const common_params_1 = require("../middleware/common-params");
20
+ const formatter_1 = require("../output/formatter");
21
+ const errors_1 = require("../output/errors");
22
+ const stream_writer_1 = require("../output/stream-writer");
23
+ const extra_help_1 = require("../help/extra-help");
24
+ const log = (0, debug_1.default)('odoo-cli:url');
25
+ function buildUrlCommand() {
26
+ const url = new commander_1.Command('url')
27
+ .description('Generate Odoo record URLs for backend and portal')
28
+ .addHelpText('after', `
29
+ Safety: READ — no confirmation required.
30
+
31
+ Examples:
32
+ odoo url record crm.lead 42
33
+ odoo url portal sale.order 88
34
+
35
+ Compose with mail:
36
+ URL=$(odoo url record project.task 17)
37
+ odoo mail note project.task 17 "Deployed: $URL" --confirm
38
+ `);
39
+ // --help-extra
40
+ url.option('--help-extra', 'Show extended skill documentation for url');
41
+ url.hook('preAction', async (thisCommand) => {
42
+ const opts = thisCommand.opts();
43
+ if (opts.helpExtra) {
44
+ await (0, extra_help_1.showHelpExtra)('url');
45
+ process.exit(0);
46
+ }
47
+ });
48
+ url.addCommand(buildRecordUrlCommand());
49
+ url.addCommand(buildPortalUrlCommand());
50
+ return url;
51
+ }
52
+ function buildRecordUrlCommand() {
53
+ const cmd = new commander_1.Command('record')
54
+ .description('Generate backend URL for a record [READ]')
55
+ .argument('<model>', 'Odoo model name (e.g., crm.lead, sale.order)')
56
+ .argument('<id>', 'Record ID')
57
+ .addHelpText('after', `
58
+ Uses /mail/view redirect — works across all Odoo versions.
59
+
60
+ Examples:
61
+ odoo url record crm.lead 42
62
+ odoo url record res.partner 7 --format json
63
+ `);
64
+ (0, common_params_1.addAuthOptions)(cmd);
65
+ cmd.addOption((0, common_params_1.formatOption)());
66
+ cmd.action(async (model, idStr) => {
67
+ const opts = cmd.optsWithGlobals();
68
+ const id = parseInt(idStr, 10);
69
+ if (isNaN(id)) {
70
+ process.stderr.write(`✗ Error: Invalid ID '${idStr}'\n`);
71
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
72
+ }
73
+ log('url record %s %d', model, id);
74
+ let client;
75
+ try {
76
+ client = await (0, auth_1.createAuthClient)(opts);
77
+ }
78
+ catch (err) {
79
+ process.exit((0, errors_1.handleError)(err));
80
+ }
81
+ try {
82
+ const url = await client.urls.getRecordUrl(model, id);
83
+ const format = (0, formatter_1.resolveFormat)(opts.format);
84
+ if (format === 'json' || format === 'ndjson') {
85
+ await (0, stream_writer_1.writeStdout)(JSON.stringify({ url, model, id }) + '\n');
86
+ }
87
+ else {
88
+ await (0, stream_writer_1.writeStdout)(url + '\n');
89
+ }
90
+ }
91
+ catch (err) {
92
+ process.exit((0, errors_1.handleError)(err));
93
+ }
94
+ finally {
95
+ client?.logout();
96
+ }
97
+ });
98
+ return cmd;
99
+ }
100
+ function buildPortalUrlCommand() {
101
+ const cmd = new commander_1.Command('portal')
102
+ .description('Generate portal URL for a record [READ]')
103
+ .argument('<model>', 'Odoo model with portal.mixin (e.g., sale.order)')
104
+ .argument('<id>', 'Record ID')
105
+ .addHelpText('after', `
106
+ Generates customer-facing portal link with access token.
107
+ Common portal models: sale.order, account.move, project.task, purchase.order
108
+
109
+ Examples:
110
+ odoo url portal sale.order 88
111
+ odoo url portal account.move 42 --format json
112
+ `);
113
+ (0, common_params_1.addAuthOptions)(cmd);
114
+ cmd.addOption((0, common_params_1.formatOption)());
115
+ cmd.action(async (model, idStr) => {
116
+ const opts = cmd.optsWithGlobals();
117
+ const id = parseInt(idStr, 10);
118
+ if (isNaN(id)) {
119
+ process.stderr.write(`✗ Error: Invalid ID '${idStr}'\n`);
120
+ process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
121
+ }
122
+ log('url portal %s %d', model, id);
123
+ let client;
124
+ try {
125
+ client = await (0, auth_1.createAuthClient)(opts);
126
+ }
127
+ catch (err) {
128
+ process.exit((0, errors_1.handleError)(err));
129
+ }
130
+ try {
131
+ const result = await client.urls.getPortalUrl(model, id);
132
+ const format = (0, formatter_1.resolveFormat)(opts.format);
133
+ if (format === 'json' || format === 'ndjson') {
134
+ await (0, stream_writer_1.writeStdout)(JSON.stringify(result, null, format === 'json' ? 2 : 0) + '\n');
135
+ }
136
+ else {
137
+ await (0, stream_writer_1.writeStdout)(result.url + '\n');
138
+ }
139
+ }
140
+ catch (err) {
141
+ process.exit((0, errors_1.handleError)(err));
142
+ }
143
+ finally {
144
+ client?.logout();
145
+ }
146
+ });
147
+ return cmd;
148
+ }
149
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/commands/url.ts"],"names":[],"mappings":"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"}