@badgie/crm-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 (63) hide show
  1. package/AGENTS.md +91 -0
  2. package/README.md +136 -0
  3. package/dist/bin.js +149 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/admin.js +90 -0
  6. package/dist/commands/admin.js.map +1 -0
  7. package/dist/commands/clients.js +135 -0
  8. package/dist/commands/clients.js.map +1 -0
  9. package/dist/commands/directory.js +175 -0
  10. package/dist/commands/directory.js.map +1 -0
  11. package/dist/commands/docs.js +98 -0
  12. package/dist/commands/docs.js.map +1 -0
  13. package/dist/commands/finance.js +311 -0
  14. package/dist/commands/finance.js.map +1 -0
  15. package/dist/commands/intelligence.js +147 -0
  16. package/dist/commands/intelligence.js.map +1 -0
  17. package/dist/commands/leads-list.js +25 -0
  18. package/dist/commands/leads-list.js.map +1 -0
  19. package/dist/commands/leads.js +224 -0
  20. package/dist/commands/leads.js.map +1 -0
  21. package/dist/commands/login.js +11 -0
  22. package/dist/commands/login.js.map +1 -0
  23. package/dist/commands/logout.js +6 -0
  24. package/dist/commands/logout.js.map +1 -0
  25. package/dist/commands/marketing.js +135 -0
  26. package/dist/commands/marketing.js.map +1 -0
  27. package/dist/commands/operations.js +232 -0
  28. package/dist/commands/operations.js.map +1 -0
  29. package/dist/commands/outbound.js +172 -0
  30. package/dist/commands/outbound.js.map +1 -0
  31. package/dist/commands/query.js +189 -0
  32. package/dist/commands/query.js.map +1 -0
  33. package/dist/commands/search.js +71 -0
  34. package/dist/commands/search.js.map +1 -0
  35. package/dist/commands/tasks.js +239 -0
  36. package/dist/commands/tasks.js.map +1 -0
  37. package/dist/commands/top-clients.js +82 -0
  38. package/dist/commands/top-clients.js.map +1 -0
  39. package/dist/commands/webhooks.js +82 -0
  40. package/dist/commands/webhooks.js.map +1 -0
  41. package/dist/commands/welcome.js +81 -0
  42. package/dist/commands/welcome.js.map +1 -0
  43. package/dist/commands/whoami.js +16 -0
  44. package/dist/commands/whoami.js.map +1 -0
  45. package/dist/core/auth.js +107 -0
  46. package/dist/core/auth.js.map +1 -0
  47. package/dist/core/config.js +53 -0
  48. package/dist/core/config.js.map +1 -0
  49. package/dist/core/env.js +46 -0
  50. package/dist/core/env.js.map +1 -0
  51. package/dist/core/format.js +88 -0
  52. package/dist/core/format.js.map +1 -0
  53. package/dist/core/http.js +42 -0
  54. package/dist/core/http.js.map +1 -0
  55. package/dist/core/list-query.js +35 -0
  56. package/dist/core/list-query.js.map +1 -0
  57. package/dist/core/services/leads.js +41 -0
  58. package/dist/core/services/leads.js.map +1 -0
  59. package/dist/core/supabase.js +53 -0
  60. package/dist/core/supabase.js.map +1 -0
  61. package/dist/registry.js +2 -0
  62. package/dist/registry.js.map +1 -0
  63. package/package.json +57 -0
@@ -0,0 +1,175 @@
1
+ import { getAuthedClient } from '../core/supabase.js';
2
+ import { commonListOptions, output, parseColumns, parseLimit } from '../core/format.js';
3
+ async function listSchoolClaims(_a, opts) {
4
+ const { client } = await getAuthedClient();
5
+ let q = client
6
+ .from('directory_school_claims')
7
+ .select(`id, contact_name, email, phone, message, source, created_at, lead_status_id,
8
+ status:lead_statuses(id, name, color),
9
+ directory_school:directory_schools(id, name, locality, province, sport)`)
10
+ .order('created_at', { ascending: false })
11
+ .limit(parseLimit(opts));
12
+ if (typeof opts.statusId === 'string')
13
+ q = q.eq('lead_status_id', opts.statusId);
14
+ if (typeof opts.source === 'string')
15
+ q = q.eq('source', opts.source);
16
+ if (typeof opts.since === 'string')
17
+ q = q.gte('created_at', opts.since);
18
+ if (typeof opts.until === 'string')
19
+ q = q.lte('created_at', opts.until);
20
+ if (typeof opts.search === 'string')
21
+ q = q.or(`contact_name.ilike.%${opts.search}%,email.ilike.%${opts.search}%,phone.ilike.%${opts.search}%`);
22
+ const { data, error } = await q;
23
+ if (error)
24
+ throw error;
25
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
26
+ }
27
+ async function listStudentInquiries(_a, opts) {
28
+ const { client } = await getAuthedClient();
29
+ let q = client
30
+ .from('directory_student_inquiries')
31
+ .select(`id, message, created_at, school_snapshot, lead_status_id,
32
+ status:lead_statuses(id, name, color),
33
+ directory_student:directory_students(id, email, full_name, phone),
34
+ directory_school:directory_schools(id, name, locality, province, sport)`)
35
+ .order('created_at', { ascending: false })
36
+ .limit(parseLimit(opts));
37
+ if (typeof opts.statusId === 'string')
38
+ q = q.eq('lead_status_id', opts.statusId);
39
+ if (typeof opts.since === 'string')
40
+ q = q.gte('created_at', opts.since);
41
+ if (typeof opts.until === 'string')
42
+ q = q.lte('created_at', opts.until);
43
+ if (typeof opts.schoolId === 'string')
44
+ q = q.eq('directory_school_id', opts.schoolId);
45
+ const { data, error } = await q;
46
+ if (error)
47
+ throw error;
48
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
49
+ }
50
+ async function listSchools(_a, opts) {
51
+ const { client } = await getAuthedClient();
52
+ let q = client
53
+ .from('directory_schools')
54
+ .select('id, name, external_slug, address, locality, province, region, website, email, phone, rating, reviews_count, sport')
55
+ .order('name', { ascending: true })
56
+ .limit(parseLimit(opts));
57
+ if (typeof opts.province === 'string')
58
+ q = q.ilike('province', `%${opts.province}%`);
59
+ if (typeof opts.region === 'string')
60
+ q = q.ilike('region', `%${opts.region}%`);
61
+ if (typeof opts.locality === 'string')
62
+ q = q.ilike('locality', `%${opts.locality}%`);
63
+ if (typeof opts.sport === 'string')
64
+ q = q.ilike('sport', `%${opts.sport}%`);
65
+ if (typeof opts.minRating === 'string')
66
+ q = q.gte('rating', Number(opts.minRating));
67
+ if (typeof opts.minReviews === 'string')
68
+ q = q.gte('reviews_count', Number(opts.minReviews));
69
+ if (typeof opts.search === 'string')
70
+ q = q.ilike('name', `%${opts.search}%`);
71
+ const { data, error } = await q;
72
+ if (error)
73
+ throw error;
74
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
75
+ }
76
+ async function listStudents(_a, opts) {
77
+ const { client } = await getAuthedClient();
78
+ let q = client
79
+ .from('directory_students')
80
+ .select('id, full_name, email, phone, created_at')
81
+ .order('created_at', { ascending: false })
82
+ .limit(parseLimit(opts));
83
+ if (typeof opts.search === 'string')
84
+ q = q.or(`full_name.ilike.%${opts.search}%,email.ilike.%${opts.search}%,phone.ilike.%${opts.search}%`);
85
+ const { data, error } = await q;
86
+ if (error)
87
+ throw error;
88
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
89
+ }
90
+ async function claimSchool(args, opts) {
91
+ const { client } = await getAuthedClient();
92
+ const { data, error } = await client
93
+ .from('directory_school_claims')
94
+ .update({ lead_status_id: args.statusId })
95
+ .eq('id', args.id)
96
+ .select('id, lead_status_id')
97
+ .single();
98
+ if (error)
99
+ throw error;
100
+ output(data, { pretty: !!opts.pretty });
101
+ }
102
+ export const directoryModule = {
103
+ name: 'directory',
104
+ summary: 'Directory — schools, students, claims and inquiries (outbound leads)',
105
+ specs: [
106
+ {
107
+ path: ['directory', 'school-claims', 'list'],
108
+ summary: 'List directory_school_claims (outbound school leads)',
109
+ tags: ['read'],
110
+ options: [
111
+ { flag: '--status-id <uuid>', description: 'filter by lead_status_id' },
112
+ { flag: '--source <s>', description: 'filter by source' },
113
+ { flag: '--since <date>', description: 'created_at >= YYYY-MM-DD' },
114
+ { flag: '--until <date>', description: 'created_at <= YYYY-MM-DD' },
115
+ { flag: '--search <text>', description: 'ilike on contact_name/email/phone' },
116
+ ...commonListOptions(),
117
+ ],
118
+ handler: listSchoolClaims,
119
+ },
120
+ {
121
+ path: ['directory', 'school-claims', 'set-status'],
122
+ summary: 'Assign a lead_status to a school_claim',
123
+ tags: ['write'],
124
+ args: [
125
+ { name: 'id', required: true, description: 'directory_school_claims.id' },
126
+ { name: 'statusId', required: true, description: 'lead_statuses.id' },
127
+ ],
128
+ options: [{ flag: '--pretty', description: 'human output' }],
129
+ handler: claimSchool,
130
+ },
131
+ {
132
+ path: ['directory', 'student-inquiries', 'list'],
133
+ summary: 'List directory_student_inquiries (outbound student leads)',
134
+ tags: ['read'],
135
+ options: [
136
+ { flag: '--status-id <uuid>', description: 'filter by lead_status_id' },
137
+ { flag: '--school-id <uuid>', description: 'filter by directory_school_id' },
138
+ { flag: '--since <date>', description: 'created_at >= YYYY-MM-DD' },
139
+ { flag: '--until <date>', description: 'created_at <= YYYY-MM-DD' },
140
+ ...commonListOptions(),
141
+ ],
142
+ handler: listStudentInquiries,
143
+ },
144
+ {
145
+ path: ['directory', 'schools', 'list'],
146
+ summary: 'List directory_schools (34k+ sports schools directory)',
147
+ tags: ['read'],
148
+ options: [
149
+ { flag: '--sport <s>', description: 'ilike on sport' },
150
+ { flag: '--province <p>', description: 'ilike on province' },
151
+ { flag: '--region <r>', description: 'ilike on region' },
152
+ { flag: '--locality <l>', description: 'ilike on locality' },
153
+ { flag: '--min-rating <n>', description: 'rating >= n' },
154
+ { flag: '--min-reviews <n>', description: 'reviews_count >= n' },
155
+ { flag: '--search <text>', description: 'ilike on name' },
156
+ ...commonListOptions(),
157
+ ],
158
+ examples: [
159
+ 'badgie-crm directory schools list --sport golf --province Madrid --min-rating 4.5 --pretty',
160
+ ],
161
+ handler: listSchools,
162
+ },
163
+ {
164
+ path: ['directory', 'students', 'list'],
165
+ summary: 'List directory_students',
166
+ tags: ['read'],
167
+ options: [
168
+ { flag: '--search <text>', description: 'ilike on name/email/phone' },
169
+ ...commonListOptions(),
170
+ ],
171
+ handler: listStudents,
172
+ },
173
+ ],
174
+ };
175
+ //# sourceMappingURL=directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory.js","sourceRoot":"","sources":["../../src/commands/directory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { C } from '../core/format.js';
2
+ export function createDocsModule(getAll) {
3
+ async function docsHandler(args, opts) {
4
+ const modules = getAll();
5
+ const filter = args.topic?.toLowerCase();
6
+ if (opts.json) {
7
+ const entries = modules
8
+ .filter((m) => !filter || m.name.toLowerCase().includes(filter))
9
+ .flatMap((m) => m.specs
10
+ .filter((s) => !filter || s.path.join(' ').toLowerCase().includes(filter))
11
+ .map((s) => ({
12
+ module: m.name,
13
+ command: `badgie-crm ${s.path.join(' ')}`,
14
+ path: s.path,
15
+ summary: s.summary,
16
+ description: s.description ?? null,
17
+ args: s.args ?? [],
18
+ options: s.options ?? [],
19
+ tags: s.tags ?? [],
20
+ examples: s.examples ?? [],
21
+ })));
22
+ console.log(JSON.stringify({ version: '0.1.0', commands: entries }, null, 2));
23
+ return;
24
+ }
25
+ console.log();
26
+ console.log(`${C.bold('Badgie CRM CLI')} ${C.grey('— command reference')}`);
27
+ console.log();
28
+ const filtered = modules.filter((m) => !filter || m.name.toLowerCase().includes(filter));
29
+ for (const m of filtered) {
30
+ const specs = m.specs.filter((s) => !filter || s.path.join(' ').toLowerCase().includes(filter));
31
+ if (specs.length === 0)
32
+ continue;
33
+ console.log(`${C.yellow(C.bold(m.name.toUpperCase()))} ${C.grey(m.summary)}`);
34
+ for (const s of specs)
35
+ printSpec(s);
36
+ console.log();
37
+ }
38
+ if (opts.agentHints) {
39
+ console.log(C.grey('\n── Agent hints ───────────────────────────────────'));
40
+ console.log(C.grey('• Default output is JSON for programmatic use.'));
41
+ console.log(C.grey('• `badgie-crm docs --json` returns the full tool manifest.'));
42
+ console.log(C.grey('• Tags: read (safe), write (mutates DB), destructive (irreversible), http (needs app running).'));
43
+ console.log(C.grey('• Tests live in a single Supabase project — no dry-run; use read-only commands to verify state first.'));
44
+ }
45
+ }
46
+ function printSpec(s) {
47
+ const cmd = `badgie-crm ${s.path.join(' ')}`;
48
+ const tags = s.tags && s.tags.length > 0 ? ` ${s.tags.map(tagBadge).join(' ')}` : '';
49
+ console.log(` ${C.yellow(cmd)}${tags}`);
50
+ console.log(` ${C.grey(s.summary)}`);
51
+ for (const a of s.args ?? []) {
52
+ const req = a.required ? '<' + a.name + '>' : '[' + a.name + ']';
53
+ console.log(` ${C.dim('·')} ${C.bold(req)} ${C.grey(a.description)}`);
54
+ }
55
+ for (const o of s.options ?? []) {
56
+ console.log(` ${C.dim('·')} ${o.flag} ${C.grey(o.description)}`);
57
+ }
58
+ for (const e of s.examples ?? []) {
59
+ console.log(` ${C.dim('›')} ${C.grey(e)}`);
60
+ }
61
+ }
62
+ function tagBadge(t) {
63
+ const map = {
64
+ read: C.grey('[read]'),
65
+ write: C.blue('[write]'),
66
+ destructive: C.red('[destructive]'),
67
+ http: C.grey('[http]'),
68
+ };
69
+ return map[t] ?? C.grey(`[${t}]`);
70
+ }
71
+ return {
72
+ name: 'docs',
73
+ summary: 'Documentation for humans and agents (includes JSON manifest)',
74
+ specs: [
75
+ {
76
+ path: ['docs'],
77
+ summary: 'Print command reference (human or JSON)',
78
+ description: 'Without arguments shows every command grouped by module. With a topic filters by module name or command path. `--json` emits a machine-readable tool manifest suitable for AI agents (openclaw, Claude, Cursor, etc.).',
79
+ tags: ['read'],
80
+ args: [
81
+ { name: 'topic', required: false, description: 'filter by module name or command path fragment' },
82
+ ],
83
+ options: [
84
+ { flag: '--json', description: 'machine-readable output (full tool manifest)' },
85
+ { flag: '--agent-hints', description: 'include guidance for AI agents' },
86
+ ],
87
+ examples: [
88
+ 'badgie-crm docs',
89
+ 'badgie-crm docs finance',
90
+ 'badgie-crm docs --json > badgie-manifest.json',
91
+ 'badgie-crm docs --agent-hints',
92
+ ],
93
+ handler: docsHandler,
94
+ },
95
+ ],
96
+ };
97
+ }
98
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/commands/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,311 @@
1
+ import { getAuthedClient } from '../core/supabase.js';
2
+ import { commonListOptions, output, parseColumns, parseLimit } from '../core/format.js';
3
+ import { callAppApi } from '../core/http.js';
4
+ // Invoices
5
+ async function listInvoices(_a, opts) {
6
+ const { client } = await getAuthedClient();
7
+ let q = client
8
+ .from('invoices')
9
+ .select('id, invoice_number, type, status, invoice_date, due_date, total_amount, currency, category, client_id, supplier_id, created_at')
10
+ .order('invoice_date', { ascending: false })
11
+ .limit(parseLimit(opts));
12
+ if (typeof opts.type === 'string')
13
+ q = q.eq('type', opts.type);
14
+ if (typeof opts.status === 'string')
15
+ q = q.eq('status', opts.status);
16
+ if (typeof opts.category === 'string')
17
+ q = q.ilike('category', `%${opts.category}%`);
18
+ if (typeof opts.clientId === 'string')
19
+ q = q.eq('client_id', opts.clientId);
20
+ if (typeof opts.supplierId === 'string')
21
+ q = q.eq('supplier_id', opts.supplierId);
22
+ if (typeof opts.since === 'string')
23
+ q = q.gte('invoice_date', opts.since);
24
+ if (typeof opts.until === 'string')
25
+ q = q.lte('invoice_date', opts.until);
26
+ if (typeof opts.minAmount === 'string')
27
+ q = q.gte('total_amount', Number(opts.minAmount));
28
+ if (typeof opts.maxAmount === 'string')
29
+ q = q.lte('total_amount', Number(opts.maxAmount));
30
+ const { data, error } = await q;
31
+ if (error)
32
+ throw error;
33
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
34
+ }
35
+ async function getInvoice(args, opts) {
36
+ const { client } = await getAuthedClient();
37
+ const { data, error } = await client
38
+ .from('invoices')
39
+ .select('*, client:clients(*), supplier:suppliers(*)')
40
+ .eq('id', args.id)
41
+ .single();
42
+ if (error)
43
+ throw error;
44
+ output(data, { pretty: !!opts.pretty });
45
+ }
46
+ async function extractInvoice(args, opts) {
47
+ // Calls the Next.js app. Requires the app running and the endpoint to accept
48
+ // bearer tokens (the CLI forwards the users access token).
49
+ const res = await callAppApi('/api/finance/extract-invoice-ai', {
50
+ method: 'POST',
51
+ body: JSON.stringify({ url: args.url }),
52
+ });
53
+ output(res, { pretty: !!opts.pretty });
54
+ }
55
+ // Bank movements
56
+ async function listBankMovements(_a, opts) {
57
+ const { client } = await getAuthedClient();
58
+ let q = client
59
+ .from('bank_movements')
60
+ .select('id, description, amount, movement_date, category, is_reconciled, bank_account_id, client_id, supplier_id, invoice_id, created_at')
61
+ .order('movement_date', { ascending: false })
62
+ .limit(parseLimit(opts));
63
+ if (typeof opts.category === 'string')
64
+ q = q.eq('category', opts.category);
65
+ if (typeof opts.accountId === 'string')
66
+ q = q.eq('bank_account_id', opts.accountId);
67
+ if (typeof opts.reconciled === 'string')
68
+ q = q.eq('is_reconciled', opts.reconciled === 'true');
69
+ if (typeof opts.since === 'string')
70
+ q = q.gte('movement_date', opts.since);
71
+ if (typeof opts.until === 'string')
72
+ q = q.lte('movement_date', opts.until);
73
+ if (typeof opts.search === 'string')
74
+ q = q.ilike('description', `%${opts.search}%`);
75
+ if (typeof opts.minAmount === 'string')
76
+ q = q.gte('amount', Number(opts.minAmount));
77
+ if (typeof opts.maxAmount === 'string')
78
+ q = q.lte('amount', Number(opts.maxAmount));
79
+ if (opts.incomeOnly !== undefined)
80
+ q = q.gt('amount', 0);
81
+ if (opts.expenseOnly !== undefined)
82
+ q = q.lt('amount', 0);
83
+ if (typeof opts.supplierId === 'string')
84
+ q = q.eq('supplier_id', opts.supplierId);
85
+ if (typeof opts.clientId === 'string')
86
+ q = q.eq('client_id', opts.clientId);
87
+ if (typeof opts.invoiceId === 'string')
88
+ q = q.eq('invoice_id', opts.invoiceId);
89
+ const { data, error } = await q;
90
+ if (error)
91
+ throw error;
92
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
93
+ }
94
+ async function classifyBankMovement(args, opts) {
95
+ const { client } = await getAuthedClient();
96
+ const patch = { category: args.category };
97
+ if (opts.supplierId)
98
+ patch.supplier_id = opts.supplierId;
99
+ if (opts.clientId)
100
+ patch.client_id = opts.clientId;
101
+ if (opts.invoiceId)
102
+ patch.invoice_id = opts.invoiceId;
103
+ const { data, error } = await client
104
+ .from('bank_movements')
105
+ .update(patch)
106
+ .eq('id', args.id)
107
+ .select('*')
108
+ .single();
109
+ if (error)
110
+ throw error;
111
+ output(data, { pretty: !!opts.pretty });
112
+ }
113
+ async function autoMatchMovements(_a, opts) {
114
+ const res = await callAppApi('/api/finance/auto-match-movements', { method: 'POST' });
115
+ output(res, { pretty: !!opts.pretty });
116
+ }
117
+ // Suppliers
118
+ async function listSuppliers(_a, opts) {
119
+ const { client } = await getAuthedClient();
120
+ let q = client
121
+ .from('suppliers')
122
+ .select('id, name, email, phone, tax_id, city, is_active, created_at')
123
+ .order('name', { ascending: true })
124
+ .limit(parseLimit(opts));
125
+ if (typeof opts.search === 'string')
126
+ q = q.ilike('name', `%${opts.search}%`);
127
+ if (opts.activeOnly !== undefined)
128
+ q = q.eq('is_active', true);
129
+ const { data, error } = await q;
130
+ if (error)
131
+ throw error;
132
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
133
+ }
134
+ async function getSupplier(args, opts) {
135
+ const { client } = await getAuthedClient();
136
+ const { data, error } = await client.from('suppliers').select('*').eq('id', args.id).single();
137
+ if (error)
138
+ throw error;
139
+ output(data, { pretty: !!opts.pretty });
140
+ }
141
+ async function autoPopulateSuppliers(_a, opts) {
142
+ const res = await callAppApi('/api/finance/auto-populate-suppliers', { method: 'POST' });
143
+ output(res, { pretty: !!opts.pretty });
144
+ }
145
+ // Counterparty finance defaults
146
+ async function listCounterparties(_a, opts) {
147
+ const { client } = await getAuthedClient();
148
+ const { data, error } = await client
149
+ .from('counterparty_finance_defaults')
150
+ .select('id, display_name, normalized_key, counterparty_tax_id, created_at')
151
+ .order('display_name', { ascending: true })
152
+ .limit(parseLimit(opts));
153
+ if (error)
154
+ throw error;
155
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
156
+ }
157
+ // Payments
158
+ async function listPayments(_a, opts) {
159
+ const { client } = await getAuthedClient();
160
+ let q = client
161
+ .from('payments')
162
+ .select('id, client_id, amount, status, due_date, paid_date, payment_method, created_at')
163
+ .order('due_date', { ascending: false })
164
+ .limit(parseLimit(opts));
165
+ if (typeof opts.status === 'string')
166
+ q = q.eq('status', opts.status);
167
+ if (typeof opts.clientId === 'string')
168
+ q = q.eq('client_id', opts.clientId);
169
+ const { data, error } = await q;
170
+ if (error)
171
+ throw error;
172
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
173
+ }
174
+ export const financeModule = {
175
+ name: 'finance',
176
+ summary: 'Invoices, bank movements, suppliers, payments, counterparties',
177
+ specs: [
178
+ {
179
+ path: ['finance', 'invoices', 'list'],
180
+ summary: 'List invoices (issued and received)',
181
+ tags: ['read'],
182
+ options: [
183
+ { flag: '--type <t>', description: 'issued|received' },
184
+ { flag: '--status <s>', description: 'invoice status' },
185
+ { flag: '--category <c>', description: 'filter by category (ilike)' },
186
+ { flag: '--client-id <uuid>', description: 'filter by client' },
187
+ { flag: '--supplier-id <uuid>', description: 'filter by supplier' },
188
+ { flag: '--since <date>', description: 'invoice_date >= YYYY-MM-DD' },
189
+ { flag: '--until <date>', description: 'invoice_date <= YYYY-MM-DD' },
190
+ { flag: '--min-amount <n>', description: 'total_amount >= n' },
191
+ { flag: '--max-amount <n>', description: 'total_amount <= n' },
192
+ ...commonListOptions(),
193
+ ],
194
+ examples: [
195
+ 'badgie-crm finance invoices list --category salarios --since 2026-03-01 --until 2026-03-31 --pretty',
196
+ 'badgie-crm finance invoices list --type received --min-amount 1000 --pretty',
197
+ ],
198
+ handler: listInvoices,
199
+ },
200
+ {
201
+ path: ['finance', 'invoices', 'get'],
202
+ summary: 'Show one invoice with client/supplier joined',
203
+ tags: ['read'],
204
+ args: [{ name: 'id', required: true, description: 'invoice uuid' }],
205
+ options: [{ flag: '--pretty', description: 'human output' }],
206
+ handler: getInvoice,
207
+ },
208
+ {
209
+ path: ['finance', 'invoices', 'extract'],
210
+ summary: 'AI-extract an invoice from a PDF URL (calls the Next app)',
211
+ tags: ['write', 'http'],
212
+ args: [{ name: 'url', required: true, description: 'public URL of the PDF' }],
213
+ options: [{ flag: '--pretty', description: 'human output' }],
214
+ handler: extractInvoice,
215
+ },
216
+ {
217
+ path: ['finance', 'bank', 'list'],
218
+ summary: 'List bank movements',
219
+ tags: ['read'],
220
+ options: [
221
+ { flag: '--account-id <uuid>', description: 'filter by bank account' },
222
+ { flag: '--category <c>', description: 'filter by category' },
223
+ { flag: '--reconciled <bool>', description: 'true|false' },
224
+ { flag: '--search <text>', description: 'ilike on description' },
225
+ { flag: '--since <date>', description: 'YYYY-MM-DD' },
226
+ { flag: '--until <date>', description: 'YYYY-MM-DD' },
227
+ { flag: '--min-amount <n>', description: 'amount >= n' },
228
+ { flag: '--max-amount <n>', description: 'amount <= n' },
229
+ { flag: '--income-only', description: 'only amount > 0' },
230
+ { flag: '--expense-only', description: 'only amount < 0' },
231
+ { flag: '--supplier-id <uuid>', description: 'filter by supplier' },
232
+ { flag: '--client-id <uuid>', description: 'filter by client' },
233
+ { flag: '--invoice-id <uuid>', description: 'filter by invoice' },
234
+ ...commonListOptions(),
235
+ ],
236
+ examples: [
237
+ 'badgie-crm finance bank list --category salarios --since 2026-03-01 --until 2026-03-31 --pretty',
238
+ 'badgie-crm finance bank list --expense-only --min-amount -5000 --pretty',
239
+ ],
240
+ handler: listBankMovements,
241
+ },
242
+ {
243
+ path: ['finance', 'bank', 'classify'],
244
+ summary: 'Classify a bank movement (set category + optional links)',
245
+ tags: ['write'],
246
+ args: [
247
+ { name: 'id', required: true, description: 'bank_movements.id' },
248
+ { name: 'category', required: true, description: 'category name' },
249
+ ],
250
+ options: [
251
+ { flag: '--supplier-id <uuid>', description: 'link supplier' },
252
+ { flag: '--client-id <uuid>', description: 'link client' },
253
+ { flag: '--invoice-id <uuid>', description: 'link invoice' },
254
+ { flag: '--pretty', description: 'human output' },
255
+ ],
256
+ handler: classifyBankMovement,
257
+ },
258
+ {
259
+ path: ['finance', 'bank', 'auto-match'],
260
+ summary: 'Run auto-match algorithm (calls the Next app)',
261
+ tags: ['write', 'http'],
262
+ options: [{ flag: '--pretty', description: 'human output' }],
263
+ handler: autoMatchMovements,
264
+ },
265
+ {
266
+ path: ['finance', 'suppliers', 'list'],
267
+ summary: 'List suppliers',
268
+ tags: ['read'],
269
+ options: [
270
+ { flag: '--search <text>', description: 'ilike on name' },
271
+ { flag: '--active-only', description: 'only is_active=true' },
272
+ ...commonListOptions(),
273
+ ],
274
+ handler: listSuppliers,
275
+ },
276
+ {
277
+ path: ['finance', 'suppliers', 'get'],
278
+ summary: 'Show one supplier',
279
+ tags: ['read'],
280
+ args: [{ name: 'id', required: true, description: 'supplier uuid' }],
281
+ options: [{ flag: '--pretty', description: 'human output' }],
282
+ handler: getSupplier,
283
+ },
284
+ {
285
+ path: ['finance', 'suppliers', 'auto-populate'],
286
+ summary: 'Auto-populate supplier metadata (calls the Next app)',
287
+ tags: ['write', 'http'],
288
+ options: [{ flag: '--pretty', description: 'human output' }],
289
+ handler: autoPopulateSuppliers,
290
+ },
291
+ {
292
+ path: ['finance', 'counterparties', 'list'],
293
+ summary: 'List counterparty finance defaults',
294
+ tags: ['read'],
295
+ options: commonListOptions(),
296
+ handler: listCounterparties,
297
+ },
298
+ {
299
+ path: ['finance', 'payments', 'list'],
300
+ summary: 'List payments',
301
+ tags: ['read'],
302
+ options: [
303
+ { flag: '--status <s>', description: 'payment status' },
304
+ { flag: '--client-id <uuid>', description: 'filter by client' },
305
+ ...commonListOptions(),
306
+ ],
307
+ handler: listPayments,
308
+ },
309
+ ],
310
+ };
311
+ //# sourceMappingURL=finance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finance.js","sourceRoot":"","sources":["../../src/commands/finance.ts"],"names":[],"mappings":"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"}