@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.
- package/AGENTS.md +91 -0
- package/README.md +136 -0
- package/dist/bin.js +149 -0
- package/dist/bin.js.map +1 -0
- package/dist/commands/admin.js +90 -0
- package/dist/commands/admin.js.map +1 -0
- package/dist/commands/clients.js +135 -0
- package/dist/commands/clients.js.map +1 -0
- package/dist/commands/directory.js +175 -0
- package/dist/commands/directory.js.map +1 -0
- package/dist/commands/docs.js +98 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/finance.js +311 -0
- package/dist/commands/finance.js.map +1 -0
- package/dist/commands/intelligence.js +147 -0
- package/dist/commands/intelligence.js.map +1 -0
- package/dist/commands/leads-list.js +25 -0
- package/dist/commands/leads-list.js.map +1 -0
- package/dist/commands/leads.js +224 -0
- package/dist/commands/leads.js.map +1 -0
- package/dist/commands/login.js +11 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +6 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/marketing.js +135 -0
- package/dist/commands/marketing.js.map +1 -0
- package/dist/commands/operations.js +232 -0
- package/dist/commands/operations.js.map +1 -0
- package/dist/commands/outbound.js +172 -0
- package/dist/commands/outbound.js.map +1 -0
- package/dist/commands/query.js +189 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/search.js +71 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/tasks.js +239 -0
- package/dist/commands/tasks.js.map +1 -0
- package/dist/commands/top-clients.js +82 -0
- package/dist/commands/top-clients.js.map +1 -0
- package/dist/commands/webhooks.js +82 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/commands/welcome.js +81 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/commands/whoami.js +16 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/core/auth.js +107 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/config.js +53 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/env.js +46 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/format.js +88 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/http.js +42 -0
- package/dist/core/http.js.map +1 -0
- package/dist/core/list-query.js +35 -0
- package/dist/core/list-query.js.map +1 -0
- package/dist/core/services/leads.js +41 -0
- package/dist/core/services/leads.js.map +1 -0
- package/dist/core/supabase.js +53 -0
- package/dist/core/supabase.js.map +1 -0
- package/dist/registry.js +2 -0
- package/dist/registry.js.map +1 -0
- 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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"}
|