@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.
- package/dist/cli.d.ts +27 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +152 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/accounting.d.ts +16 -0
- package/dist/commands/accounting.d.ts.map +1 -0
- package/dist/commands/accounting.js +363 -0
- package/dist/commands/accounting.js.map +1 -0
- package/dist/commands/attendance.d.ts +14 -0
- package/dist/commands/attendance.d.ts.map +1 -0
- package/dist/commands/attendance.js +339 -0
- package/dist/commands/attendance.js.map +1 -0
- package/dist/commands/config.d.ts +12 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +159 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/mail.d.ts +12 -0
- package/dist/commands/mail.d.ts.map +1 -0
- package/dist/commands/mail.js +236 -0
- package/dist/commands/mail.js.map +1 -0
- package/dist/commands/modules.d.ts +14 -0
- package/dist/commands/modules.d.ts.map +1 -0
- package/dist/commands/modules.js +351 -0
- package/dist/commands/modules.js.map +1 -0
- package/dist/commands/records.d.ts +15 -0
- package/dist/commands/records.d.ts.map +1 -0
- package/dist/commands/records.js +591 -0
- package/dist/commands/records.js.map +1 -0
- package/dist/commands/schema.d.ts +16 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +381 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/state.d.ts +14 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +373 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/timesheets.d.ts +15 -0
- package/dist/commands/timesheets.d.ts.map +1 -0
- package/dist/commands/timesheets.js +453 -0
- package/dist/commands/timesheets.js.map +1 -0
- package/dist/commands/url.d.ts +12 -0
- package/dist/commands/url.d.ts.map +1 -0
- package/dist/commands/url.js +149 -0
- package/dist/commands/url.js.map +1 -0
- package/dist/help/extra-help.d.ts +18 -0
- package/dist/help/extra-help.d.ts.map +1 -0
- package/dist/help/extra-help.js +207 -0
- package/dist/help/extra-help.js.map +1 -0
- package/dist/middleware/auth.d.ts +29 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +68 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/common-params.d.ts +90 -0
- package/dist/middleware/common-params.d.ts.map +1 -0
- package/dist/middleware/common-params.js +169 -0
- package/dist/middleware/common-params.js.map +1 -0
- package/dist/middleware/safety.d.ts +30 -0
- package/dist/middleware/safety.d.ts.map +1 -0
- package/dist/middleware/safety.js +64 -0
- package/dist/middleware/safety.js.map +1 -0
- package/dist/output/errors.d.ts +69 -0
- package/dist/output/errors.d.ts.map +1 -0
- package/dist/output/errors.js +193 -0
- package/dist/output/errors.js.map +1 -0
- package/dist/output/formatter.d.ts +80 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +285 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/stream-writer.d.ts +33 -0
- package/dist/output/stream-writer.d.ts.map +1 -0
- package/dist/output/stream-writer.js +74 -0
- package/dist/output/stream-writer.js.map +1 -0
- package/dist/parsing/domain-parser.d.ts +61 -0
- package/dist/parsing/domain-parser.d.ts.map +1 -0
- package/dist/parsing/domain-parser.js +427 -0
- package/dist/parsing/domain-parser.js.map +1 -0
- package/dist/parsing/json-arg.d.ts +48 -0
- package/dist/parsing/json-arg.d.ts.map +1 -0
- package/dist/parsing/json-arg.js +165 -0
- package/dist/parsing/json-arg.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `odoo attendance` command group.
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* attendance clock-in Record clock-in [WRITE]
|
|
7
|
+
* attendance clock-out Record clock-out [WRITE]
|
|
8
|
+
* attendance status Show current status [READ]
|
|
9
|
+
* attendance list List records by date range [READ]
|
|
10
|
+
*
|
|
11
|
+
* Requires hr_attendance module to be installed.
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.buildAttendanceCommand = buildAttendanceCommand;
|
|
18
|
+
const commander_1 = require("commander");
|
|
19
|
+
const debug_1 = __importDefault(require("debug"));
|
|
20
|
+
const auth_1 = require("../middleware/auth");
|
|
21
|
+
const safety_1 = require("../middleware/safety");
|
|
22
|
+
const common_params_1 = require("../middleware/common-params");
|
|
23
|
+
const formatter_1 = require("../output/formatter");
|
|
24
|
+
const errors_1 = require("../output/errors");
|
|
25
|
+
const stream_writer_1 = require("../output/stream-writer");
|
|
26
|
+
const extra_help_1 = require("../help/extra-help");
|
|
27
|
+
const log = (0, debug_1.default)('odoo-cli:attendance');
|
|
28
|
+
// ── Helper: resolve employee ID from name or numeric option ───────────
|
|
29
|
+
/**
|
|
30
|
+
* Resolve employee ID from --employee-id (number) or --employee (name).
|
|
31
|
+
* Returns undefined if neither is specified (Odoo service falls back to current user).
|
|
32
|
+
* Exits with error if name lookup fails or is ambiguous.
|
|
33
|
+
*/
|
|
34
|
+
async function resolveEmployeeId(client, opts) {
|
|
35
|
+
if (opts.employee) {
|
|
36
|
+
const name = opts.employee;
|
|
37
|
+
const matches = await client.searchRead('hr.employee', [['name', '=', name]], {
|
|
38
|
+
fields: ['id', 'name'],
|
|
39
|
+
limit: 5,
|
|
40
|
+
});
|
|
41
|
+
if (matches.length === 0) {
|
|
42
|
+
process.stderr.write(`✗ Error: No employee found with name "${name}"\n`);
|
|
43
|
+
process.exit(errors_1.EXIT_CODES.NOT_FOUND);
|
|
44
|
+
}
|
|
45
|
+
if (matches.length > 1) {
|
|
46
|
+
process.stderr.write(`✗ Error: Multiple employees match "${name}":\n`);
|
|
47
|
+
for (const m of matches) {
|
|
48
|
+
process.stderr.write(` - ${m.name} (id=${m.id})\n`);
|
|
49
|
+
}
|
|
50
|
+
process.exit(errors_1.EXIT_CODES.USAGE_ERROR);
|
|
51
|
+
}
|
|
52
|
+
return matches[0].id;
|
|
53
|
+
}
|
|
54
|
+
if (opts.employeeId) {
|
|
55
|
+
const id = parseInt(opts.employeeId, 10);
|
|
56
|
+
if (isNaN(id) || id <= 0) {
|
|
57
|
+
throw new errors_1.CliUsageError(`--employee-id must be a positive integer, got: ${opts.employeeId}`);
|
|
58
|
+
}
|
|
59
|
+
return id;
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
function buildAttendanceCommand() {
|
|
64
|
+
const att = new commander_1.Command('attendance')
|
|
65
|
+
.description('Employee attendance — clock in/out and presence tracking')
|
|
66
|
+
.addHelpText('after', `
|
|
67
|
+
Requires: hr_attendance Odoo module.
|
|
68
|
+
Group flag: --employee-id N (default: current user's employee)
|
|
69
|
+
|
|
70
|
+
Safety:
|
|
71
|
+
READ status, list — no confirmation required
|
|
72
|
+
WRITE clock-in, clock-out — requires --confirm
|
|
73
|
+
|
|
74
|
+
Examples:
|
|
75
|
+
odoo attendance clock-in --confirm
|
|
76
|
+
odoo attendance clock-out --confirm
|
|
77
|
+
odoo attendance status
|
|
78
|
+
odoo attendance list --from 2024-03-11 --to 2024-03-15
|
|
79
|
+
`);
|
|
80
|
+
// --help-extra
|
|
81
|
+
att.option('--help-extra', 'Show extended skill documentation for attendance');
|
|
82
|
+
att.hook('preAction', async (thisCommand) => {
|
|
83
|
+
const opts = thisCommand.opts();
|
|
84
|
+
if (opts.helpExtra) {
|
|
85
|
+
await (0, extra_help_1.showHelpExtra)('attendance');
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
// Group-level employee flag
|
|
90
|
+
att.option('--employee-id <n>', "Employee ID (default: current user's employee)");
|
|
91
|
+
att.option('--employee <name>', 'Employee name (lookup by name)');
|
|
92
|
+
att.addCommand(buildClockInCommand());
|
|
93
|
+
att.addCommand(buildClockOutCommand());
|
|
94
|
+
att.addCommand(buildStatusCommand());
|
|
95
|
+
att.addCommand(buildListCommand());
|
|
96
|
+
return att;
|
|
97
|
+
}
|
|
98
|
+
function buildClockInCommand() {
|
|
99
|
+
const cmd = new commander_1.Command('clock-in')
|
|
100
|
+
.description('Record employee clock-in [WRITE — requires --confirm]')
|
|
101
|
+
.addHelpText('after', `
|
|
102
|
+
Examples:
|
|
103
|
+
odoo attendance clock-in --confirm
|
|
104
|
+
odoo attendance clock-in --employee-id 42 --confirm
|
|
105
|
+
`);
|
|
106
|
+
(0, common_params_1.addAuthOptions)(cmd);
|
|
107
|
+
cmd.addOption((0, common_params_1.confirmOption)());
|
|
108
|
+
cmd.addOption((0, common_params_1.dryRunOption)());
|
|
109
|
+
cmd.action(async () => {
|
|
110
|
+
const opts = cmd.optsWithGlobals();
|
|
111
|
+
log('attendance clock-in');
|
|
112
|
+
try {
|
|
113
|
+
(0, safety_1.requireConfirm)('WRITE', opts, 'attendance clock-in');
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
process.exit((0, errors_1.handleError)(err));
|
|
117
|
+
}
|
|
118
|
+
if (opts.dryRun) {
|
|
119
|
+
const empRef = opts.employee ?? opts.employeeId ?? '<current user employee>';
|
|
120
|
+
(0, safety_1.printDryRun)('hr.attendance', 'create', [{ employee_id: empRef, check_in: '<now>' }]);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
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 employeeId = await resolveEmployeeId(client, opts);
|
|
132
|
+
const record = await client.attendance.clockIn(employeeId);
|
|
133
|
+
const employeeName = Array.isArray(record.employee_id) ? record.employee_id[1] : 'Employee';
|
|
134
|
+
const checkIn = formatDateTime(record.check_in);
|
|
135
|
+
(0, errors_1.printSuccess)(`Clocked in: ${employeeName} at ${checkIn}`);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
// Conflict: already clocked in
|
|
139
|
+
if (err instanceof Error && err.message.toLowerCase().includes('already')) {
|
|
140
|
+
process.stderr.write(`✗ Error: Already clocked in\n → Run: odoo attendance clock-out --confirm\n`);
|
|
141
|
+
process.exit(errors_1.EXIT_CODES.CONFLICT);
|
|
142
|
+
}
|
|
143
|
+
process.exit((0, errors_1.handleError)(err));
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
client?.logout();
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
return cmd;
|
|
150
|
+
}
|
|
151
|
+
function buildClockOutCommand() {
|
|
152
|
+
const cmd = new commander_1.Command('clock-out')
|
|
153
|
+
.description('Record employee clock-out [WRITE — requires --confirm]')
|
|
154
|
+
.addHelpText('after', `
|
|
155
|
+
Examples:
|
|
156
|
+
odoo attendance clock-out --confirm
|
|
157
|
+
`);
|
|
158
|
+
(0, common_params_1.addAuthOptions)(cmd);
|
|
159
|
+
cmd.addOption((0, common_params_1.confirmOption)());
|
|
160
|
+
cmd.addOption((0, common_params_1.dryRunOption)());
|
|
161
|
+
cmd.action(async () => {
|
|
162
|
+
const opts = cmd.optsWithGlobals();
|
|
163
|
+
log('attendance clock-out');
|
|
164
|
+
try {
|
|
165
|
+
(0, safety_1.requireConfirm)('WRITE', opts, 'attendance clock-out');
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
process.exit((0, errors_1.handleError)(err));
|
|
169
|
+
}
|
|
170
|
+
if (opts.dryRun) {
|
|
171
|
+
(0, safety_1.printDryRun)('hr.attendance', 'write', [['<open attendance id>'], { check_out: '<now>' }]);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
let client;
|
|
175
|
+
try {
|
|
176
|
+
client = await (0, auth_1.createAuthClient)(opts);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
process.exit((0, errors_1.handleError)(err));
|
|
180
|
+
}
|
|
181
|
+
try {
|
|
182
|
+
const employeeId = await resolveEmployeeId(client, opts);
|
|
183
|
+
const record = await client.attendance.clockOut(employeeId);
|
|
184
|
+
const employeeName = Array.isArray(record.employee_id) ? record.employee_id[1] : 'Employee';
|
|
185
|
+
const hoursWorked = formatHours(record.worked_hours);
|
|
186
|
+
(0, errors_1.printSuccess)(`Clocked out: ${employeeName} — worked ${hoursWorked} today`);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
if (err instanceof Error && err.message.toLowerCase().includes('not clocked in')) {
|
|
190
|
+
process.stderr.write(`✗ Error: Not currently clocked in\n → Run: odoo attendance clock-in --confirm\n`);
|
|
191
|
+
process.exit(errors_1.EXIT_CODES.CONFLICT);
|
|
192
|
+
}
|
|
193
|
+
process.exit((0, errors_1.handleError)(err));
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
client?.logout();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
return cmd;
|
|
200
|
+
}
|
|
201
|
+
function buildStatusCommand() {
|
|
202
|
+
const cmd = new commander_1.Command('status')
|
|
203
|
+
.description('Show current attendance status [READ]')
|
|
204
|
+
.addHelpText('after', `
|
|
205
|
+
Examples:
|
|
206
|
+
odoo attendance status
|
|
207
|
+
odoo attendance status --format json
|
|
208
|
+
`);
|
|
209
|
+
(0, common_params_1.addAuthOptions)(cmd);
|
|
210
|
+
(0, common_params_1.addOutputOptions)(cmd);
|
|
211
|
+
cmd.action(async () => {
|
|
212
|
+
const opts = cmd.optsWithGlobals();
|
|
213
|
+
log('attendance status');
|
|
214
|
+
let client;
|
|
215
|
+
try {
|
|
216
|
+
client = await (0, auth_1.createAuthClient)(opts);
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
process.exit((0, errors_1.handleError)(err));
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const employeeId = await resolveEmployeeId(client, opts);
|
|
223
|
+
const status = await client.attendance.getStatus(employeeId);
|
|
224
|
+
const format = (0, formatter_1.resolveFormat)(opts.format);
|
|
225
|
+
if (format === 'json' || format === 'ndjson') {
|
|
226
|
+
const out = {
|
|
227
|
+
status: status.checkedIn ? 'in' : 'out',
|
|
228
|
+
employee_id: status.employee[0],
|
|
229
|
+
employee_name: status.employee[1],
|
|
230
|
+
since: status.currentAttendance?.check_in ?? null,
|
|
231
|
+
elapsed_minutes: status.currentAttendance
|
|
232
|
+
? Math.round((Date.now() - new Date(status.currentAttendance.check_in).getTime()) / 60000)
|
|
233
|
+
: null,
|
|
234
|
+
};
|
|
235
|
+
await (0, stream_writer_1.writeStdout)(JSON.stringify(out, null, format === 'json' ? 2 : 0) + '\n');
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
// Table/text
|
|
239
|
+
if (status.checkedIn && status.currentAttendance) {
|
|
240
|
+
const since = formatDateTime(status.currentAttendance.check_in);
|
|
241
|
+
const elapsed = Math.round((Date.now() - new Date(status.currentAttendance.check_in).getTime()) / 60000);
|
|
242
|
+
const elapsedStr = formatElapsed(elapsed);
|
|
243
|
+
process.stdout.write(`● IN since ${since} (${elapsedStr} elapsed)\n`);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
process.stdout.write(`○ OUT — ${status.employee[1]} is not clocked in\n`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
process.exit((0, errors_1.handleError)(err));
|
|
252
|
+
}
|
|
253
|
+
finally {
|
|
254
|
+
client?.logout();
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
return cmd;
|
|
258
|
+
}
|
|
259
|
+
function buildListCommand() {
|
|
260
|
+
const cmd = new commander_1.Command('list')
|
|
261
|
+
.description('List attendance records by date range [READ]')
|
|
262
|
+
.addHelpText('after', `
|
|
263
|
+
Dates default to the current week (Monday to today).
|
|
264
|
+
|
|
265
|
+
Examples:
|
|
266
|
+
odoo attendance list
|
|
267
|
+
odoo attendance list --from 2024-03-11 --to 2024-03-15
|
|
268
|
+
odoo attendance list --format csv > attendance.csv
|
|
269
|
+
`);
|
|
270
|
+
(0, common_params_1.addAuthOptions)(cmd);
|
|
271
|
+
(0, common_params_1.addOutputOptions)(cmd);
|
|
272
|
+
cmd.option('--from <date>', 'Start date YYYY-MM-DD (default: current week Monday)');
|
|
273
|
+
cmd.option('--to <date>', 'End date YYYY-MM-DD (default: today)');
|
|
274
|
+
cmd.action(async () => {
|
|
275
|
+
const opts = cmd.optsWithGlobals();
|
|
276
|
+
log('attendance list from=%s to=%s', opts.from, opts.to);
|
|
277
|
+
const today = new Date();
|
|
278
|
+
const dateFrom = opts.from ?? getWeekMonday(today);
|
|
279
|
+
const dateTo = opts.to ?? today.toISOString().split('T')[0];
|
|
280
|
+
let client;
|
|
281
|
+
try {
|
|
282
|
+
client = await (0, auth_1.createAuthClient)(opts);
|
|
283
|
+
}
|
|
284
|
+
catch (err) {
|
|
285
|
+
process.exit((0, errors_1.handleError)(err));
|
|
286
|
+
}
|
|
287
|
+
try {
|
|
288
|
+
const employeeId = await resolveEmployeeId(client, opts);
|
|
289
|
+
const records = await client.attendance.list({ dateFrom, dateTo, employeeId });
|
|
290
|
+
const format = (0, formatter_1.resolveFormat)(opts.format);
|
|
291
|
+
const rows = records.map((r) => ({
|
|
292
|
+
date: r.check_in ? r.check_in.split('T')[0] : '',
|
|
293
|
+
check_in: r.check_in ? formatDateTime(r.check_in) : '',
|
|
294
|
+
check_out: r.check_out ? formatDateTime(r.check_out) : '—',
|
|
295
|
+
duration: formatHours(r.worked_hours),
|
|
296
|
+
employee: Array.isArray(r.employee_id) ? r.employee_id[1] : '',
|
|
297
|
+
}));
|
|
298
|
+
await (0, formatter_1.render)(rows, format);
|
|
299
|
+
if (format === 'table' && rows.length > 0) {
|
|
300
|
+
const total = records.reduce((s, r) => s + (r.worked_hours ?? 0), 0);
|
|
301
|
+
process.stderr.write(`Total: ${formatHours(total)}\n`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
process.exit((0, errors_1.handleError)(err));
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
client?.logout();
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
return cmd;
|
|
312
|
+
}
|
|
313
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
314
|
+
function formatDateTime(utcStr) {
|
|
315
|
+
try {
|
|
316
|
+
return new Date(utcStr).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
|
317
|
+
}
|
|
318
|
+
catch {
|
|
319
|
+
return utcStr;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function formatHours(hours) {
|
|
323
|
+
const h = Math.floor(hours);
|
|
324
|
+
const m = Math.round((hours - h) * 60);
|
|
325
|
+
return `${h}h ${m.toString().padStart(2, '0')}m`;
|
|
326
|
+
}
|
|
327
|
+
function formatElapsed(minutes) {
|
|
328
|
+
const h = Math.floor(minutes / 60);
|
|
329
|
+
const m = minutes % 60;
|
|
330
|
+
return h > 0 ? `${h}h ${m}m` : `${m}m`;
|
|
331
|
+
}
|
|
332
|
+
function getWeekMonday(date) {
|
|
333
|
+
const d = new Date(date);
|
|
334
|
+
const day = d.getDay(); // 0=Sun, 1=Mon, ...
|
|
335
|
+
const diff = day === 0 ? -6 : 1 - day;
|
|
336
|
+
d.setDate(d.getDate() + diff);
|
|
337
|
+
return d.toISOString().split('T')[0];
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=attendance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attendance.js","sourceRoot":"","sources":["../../src/commands/attendance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `odoo config` command group.
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* config check — verify connection and show current user
|
|
6
|
+
* config show — show resolved config (password always redacted)
|
|
7
|
+
*
|
|
8
|
+
* Safety level: READ (no mutations)
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare function buildConfigCommand(): Command;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,kBAAkB,IAAI,OAAO,CA6B5C"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `odoo config` command group.
|
|
4
|
+
*
|
|
5
|
+
* Commands:
|
|
6
|
+
* config check — verify connection and show current user
|
|
7
|
+
* config show — show resolved config (password always redacted)
|
|
8
|
+
*
|
|
9
|
+
* Safety level: READ (no mutations)
|
|
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.buildConfigCommand = buildConfigCommand;
|
|
16
|
+
const commander_1 = require("commander");
|
|
17
|
+
const debug_1 = __importDefault(require("debug"));
|
|
18
|
+
const auth_1 = require("../middleware/auth");
|
|
19
|
+
const auth_2 = require("../middleware/auth");
|
|
20
|
+
const common_params_1 = require("../middleware/common-params");
|
|
21
|
+
const formatter_1 = require("../output/formatter");
|
|
22
|
+
const errors_1 = require("../output/errors");
|
|
23
|
+
const extra_help_1 = require("../help/extra-help");
|
|
24
|
+
const log = (0, debug_1.default)('odoo-cli:config');
|
|
25
|
+
function buildConfigCommand() {
|
|
26
|
+
const config = new commander_1.Command('config')
|
|
27
|
+
.description('Manage Odoo connection configuration')
|
|
28
|
+
.addHelpText('after', `
|
|
29
|
+
Safety: READ — no confirmation required.
|
|
30
|
+
|
|
31
|
+
Examples:
|
|
32
|
+
odoo config check
|
|
33
|
+
odoo config show
|
|
34
|
+
odoo config show --format json
|
|
35
|
+
`);
|
|
36
|
+
// --help-extra
|
|
37
|
+
config.option('--help-extra', 'Show extended skill documentation for config');
|
|
38
|
+
config.hook('preAction', async (thisCommand) => {
|
|
39
|
+
const opts = thisCommand.opts();
|
|
40
|
+
if (opts.helpExtra) {
|
|
41
|
+
await (0, extra_help_1.showHelpExtra)('config');
|
|
42
|
+
process.exit(0);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
config.addCommand(buildCheckCommand());
|
|
46
|
+
config.addCommand(buildShowCommand());
|
|
47
|
+
return config;
|
|
48
|
+
}
|
|
49
|
+
function buildCheckCommand() {
|
|
50
|
+
const check = new commander_1.Command('check')
|
|
51
|
+
.description('Verify connection and show current user [READ]')
|
|
52
|
+
.addHelpText('after', `
|
|
53
|
+
Examples:
|
|
54
|
+
odoo config check
|
|
55
|
+
odoo config check --url https://mycompany.odoo.com --db mycompany
|
|
56
|
+
`);
|
|
57
|
+
(0, common_params_1.addAuthOptions)(check);
|
|
58
|
+
check.action(async () => {
|
|
59
|
+
const flags = check.optsWithGlobals();
|
|
60
|
+
log('Running config check with flags: %O', { url: flags.url, db: flags.db, user: flags.user });
|
|
61
|
+
let client;
|
|
62
|
+
try {
|
|
63
|
+
client = await (0, auth_1.createAuthClient)(flags);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
process.exit((0, errors_1.handleError)(err));
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
// Get session info
|
|
70
|
+
const session = client.getSession();
|
|
71
|
+
if (!session) {
|
|
72
|
+
process.stderr.write('✗ Error: Authentication succeeded but session is missing\n');
|
|
73
|
+
process.exit(errors_1.EXIT_CODES.AUTH_NETWORK_ERROR);
|
|
74
|
+
}
|
|
75
|
+
// Fetch user display name
|
|
76
|
+
const users = await client
|
|
77
|
+
.read('res.users', [session.uid], ['name', 'login'])
|
|
78
|
+
.catch(() => []);
|
|
79
|
+
const userName = users.length > 0 ? `${users[0].name} (${users[0].login})` : `uid=${session.uid}`;
|
|
80
|
+
// Count installed modules
|
|
81
|
+
const installedCount = await client.searchCount('ir.module.module', [
|
|
82
|
+
['state', '=', 'installed'],
|
|
83
|
+
]);
|
|
84
|
+
const cfg = (0, auth_2.buildConfig)(flags);
|
|
85
|
+
(0, errors_1.printSuccess)(`Connected to ${cfg.url} (db: ${cfg.database})`);
|
|
86
|
+
(0, errors_1.printInfo)(`User: ${userName} [id: ${session.uid}]`);
|
|
87
|
+
(0, errors_1.printInfo)(`Installed modules: ${installedCount}`);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
process.exit((0, errors_1.handleError)(err));
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
client?.logout();
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return check;
|
|
97
|
+
}
|
|
98
|
+
function buildShowCommand() {
|
|
99
|
+
const show = new commander_1.Command('show')
|
|
100
|
+
.description('Show resolved configuration (password always redacted) [READ]')
|
|
101
|
+
.addHelpText('after', `
|
|
102
|
+
Examples:
|
|
103
|
+
odoo config show
|
|
104
|
+
odoo config show --format json
|
|
105
|
+
`);
|
|
106
|
+
(0, common_params_1.addAuthOptions)(show);
|
|
107
|
+
show.addOption((0, common_params_1.formatOption)());
|
|
108
|
+
show.action(async () => {
|
|
109
|
+
const flags = show.optsWithGlobals();
|
|
110
|
+
const format = (0, formatter_1.resolveFormat)(flags.format);
|
|
111
|
+
// Build config WITHOUT authenticating (just resolve env + flags)
|
|
112
|
+
const urlVal = flags.url || process.env['ODOO_URL'] || '(not set)';
|
|
113
|
+
const dbVal = flags.db || process.env['ODOO_DB'] || process.env['ODOO_DATABASE'] || '(not set)';
|
|
114
|
+
const userVal = flags.user || process.env['ODOO_USERNAME'] || process.env['ODOO_USER'] || '(not set)';
|
|
115
|
+
const passwordSet = !!(flags.password || process.env['ODOO_PASSWORD']);
|
|
116
|
+
const urlSource = flags.url ? '--url flag' : process.env['ODOO_URL'] ? 'ODOO_URL' : 'not set';
|
|
117
|
+
const dbSource = flags.db
|
|
118
|
+
? '--db flag'
|
|
119
|
+
: process.env['ODOO_DB']
|
|
120
|
+
? 'ODOO_DB'
|
|
121
|
+
: process.env['ODOO_DATABASE']
|
|
122
|
+
? 'ODOO_DATABASE'
|
|
123
|
+
: 'not set';
|
|
124
|
+
const userSource = flags.user
|
|
125
|
+
? '--user flag'
|
|
126
|
+
: process.env['ODOO_USERNAME']
|
|
127
|
+
? 'ODOO_USERNAME'
|
|
128
|
+
: process.env['ODOO_USER']
|
|
129
|
+
? 'ODOO_USER'
|
|
130
|
+
: 'not set';
|
|
131
|
+
const passwordSource = flags.password
|
|
132
|
+
? '--password flag ⚠'
|
|
133
|
+
: process.env['ODOO_PASSWORD']
|
|
134
|
+
? 'ODOO_PASSWORD'
|
|
135
|
+
: 'not set';
|
|
136
|
+
if (format === 'json' || format === 'ndjson') {
|
|
137
|
+
// Clean JSON without source info
|
|
138
|
+
await (0, formatter_1.renderKeyValue)({
|
|
139
|
+
url: urlVal,
|
|
140
|
+
db: dbVal,
|
|
141
|
+
username: userVal,
|
|
142
|
+
password: passwordSet ? 'REDACTED' : '(not set)',
|
|
143
|
+
}, format);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Table/CSV with source annotations
|
|
147
|
+
const data = {
|
|
148
|
+
URL: `${urlVal} (from ${urlSource})`,
|
|
149
|
+
Database: `${dbVal} (from ${dbSource})`,
|
|
150
|
+
Username: `${userVal} (from ${userSource})`,
|
|
151
|
+
Password: `${passwordSet ? '****' : '(not set)'} (from ${passwordSource})`,
|
|
152
|
+
Format: `${format} (${process.stdout.isTTY ? 'TTY default' : 'pipe default'})`,
|
|
153
|
+
};
|
|
154
|
+
await (0, formatter_1.renderKeyValue)(data, format);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
return show;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `odoo mail` command group — chatter messages and internal notes.
|
|
3
|
+
*
|
|
4
|
+
* Commands:
|
|
5
|
+
* mail note <model> <id> [message] Post internal note [WRITE]
|
|
6
|
+
* mail post <model> <id> [message] Post public message [WRITE]
|
|
7
|
+
*
|
|
8
|
+
* Both commands require --confirm.
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare function buildMailCommand(): Command;
|
|
12
|
+
//# sourceMappingURL=mail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../../src/commands/mail.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,gBAAgB,IAAI,OAAO,CA+B1C"}
|