@badgie/crm-cli 0.5.0 → 0.7.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.
@@ -0,0 +1,365 @@
1
+ import { getAuthedClient } from '../core/supabase.js';
2
+ import { commonListOptions, output, parseColumns, parseLimit } from '../core/format.js';
3
+ import { maybeResolve } from '../core/resolve.js';
4
+ const FEDERATION_STATUSES = [
5
+ 'not_contacted',
6
+ 'researching',
7
+ 'contacted',
8
+ 'in_conversation',
9
+ 'meeting_scheduled',
10
+ 'qualified',
11
+ 'closed_won',
12
+ 'not_fit',
13
+ ];
14
+ const FEDERATION_QUALIFICATIONS = ['hot', 'warm', 'cold', 'unqualified', 'dnc'];
15
+ const FEDERATION_ACTIVITY_TYPES = ['call', 'email', 'meeting', 'note', 'task'];
16
+ const FEDERATION_ACTIVITY_OUTCOMES = ['positive', 'neutral', 'negative', 'no_answer', 'follow_up'];
17
+ function ensureEnum(allowed, value, label) {
18
+ if (!allowed.includes(value)) {
19
+ throw new Error(`Invalid ${label} "${value}". Allowed: ${allowed.join(', ')}`);
20
+ }
21
+ return value;
22
+ }
23
+ // Federation CRM rows ───────────────────────────────────────────────────────
24
+ async function listFederations(_a, opts) {
25
+ const { client } = await getAuthedClient();
26
+ const ownerId = await maybeResolve(client, 'team_member', opts.owner);
27
+ let q = client
28
+ .from('federation_crm')
29
+ .select('federacion_numero, priority, status, owner_id, next_action, next_action_date, last_contact_at, notes, updated_at')
30
+ .order('priority', { ascending: false })
31
+ .order('last_contact_at', { ascending: false, nullsFirst: false })
32
+ .limit(parseLimit(opts));
33
+ if (typeof opts.status === 'string')
34
+ q = q.eq('status', opts.status);
35
+ if (typeof opts.priority === 'string')
36
+ q = q.eq('priority', Number(opts.priority));
37
+ if (ownerId)
38
+ q = q.eq('owner_id', ownerId);
39
+ if (typeof opts.dueBefore === 'string')
40
+ q = q.lte('next_action_date', opts.dueBefore);
41
+ if (typeof opts.dueAfter === 'string')
42
+ q = q.gte('next_action_date', opts.dueAfter);
43
+ const { data, error } = await q;
44
+ if (error)
45
+ throw error;
46
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
47
+ }
48
+ async function getFederation(args, opts) {
49
+ const numero = args.numero;
50
+ if (!numero)
51
+ throw new Error('Falta <numero> de federación');
52
+ const { client } = await getAuthedClient();
53
+ const [crmRes, contactsRes, activitiesRes] = await Promise.all([
54
+ client
55
+ .from('federation_crm')
56
+ .select('*, owner:team_members!federation_crm_owner_id_fkey(id, full_name, email)')
57
+ .eq('federacion_numero', numero)
58
+ .maybeSingle(),
59
+ client
60
+ .from('federation_contacts')
61
+ .select('id, full_name, role, email, phone, linkedin, is_primary, qualification, notes, updated_at')
62
+ .eq('federacion_numero', numero)
63
+ .order('is_primary', { ascending: false })
64
+ .order('updated_at', { ascending: false }),
65
+ client
66
+ .from('federation_contact_activities')
67
+ .select('id, contact_id, type, outcome, title, description, occurred_at')
68
+ .eq('federacion_numero', numero)
69
+ .order('occurred_at', { ascending: false })
70
+ .limit(10),
71
+ ]);
72
+ if (crmRes.error)
73
+ throw crmRes.error;
74
+ if (contactsRes.error)
75
+ throw contactsRes.error;
76
+ if (activitiesRes.error)
77
+ throw activitiesRes.error;
78
+ output({
79
+ federacion_numero: numero,
80
+ crm: crmRes.data,
81
+ contacts: contactsRes.data ?? [],
82
+ recent_activities: activitiesRes.data ?? [],
83
+ }, { pretty: !!opts.pretty });
84
+ }
85
+ async function setFederation(args, opts) {
86
+ const numero = args.numero;
87
+ if (!numero)
88
+ throw new Error('Falta <numero> de federación');
89
+ const { client } = await getAuthedClient();
90
+ const ownerId = await maybeResolve(client, 'team_member', opts.owner);
91
+ const patch = { federacion_numero: numero };
92
+ if (typeof opts.status === 'string') {
93
+ patch.status = ensureEnum(FEDERATION_STATUSES, opts.status, 'status');
94
+ }
95
+ if (typeof opts.priority === 'string') {
96
+ const n = Number(opts.priority);
97
+ if (!Number.isInteger(n) || n < 1 || n > 5)
98
+ throw new Error('--priority debe ser un entero 1..5');
99
+ patch.priority = n;
100
+ }
101
+ if (ownerId !== null)
102
+ patch.owner_id = ownerId;
103
+ else if (opts.clearOwner)
104
+ patch.owner_id = null;
105
+ if (typeof opts.nextAction === 'string')
106
+ patch.next_action = opts.nextAction;
107
+ if (typeof opts.nextActionDate === 'string')
108
+ patch.next_action_date = opts.nextActionDate;
109
+ if (opts.clearNextAction) {
110
+ patch.next_action = null;
111
+ patch.next_action_date = null;
112
+ }
113
+ if (typeof opts.notes === 'string')
114
+ patch.notes = opts.notes;
115
+ if (Object.keys(patch).length === 1) {
116
+ throw new Error('Pasa al menos un campo a actualizar (--status, --priority, --owner, --next-action, --next-action-date, --notes)');
117
+ }
118
+ const { data, error } = await client
119
+ .from('federation_crm')
120
+ .upsert(patch, { onConflict: 'federacion_numero' })
121
+ .select('*')
122
+ .single();
123
+ if (error)
124
+ throw error;
125
+ output(data, { pretty: !!opts.pretty });
126
+ }
127
+ // Federation contacts ───────────────────────────────────────────────────────
128
+ async function listFederationContacts(_a, opts) {
129
+ const { client } = await getAuthedClient();
130
+ let q = client
131
+ .from('federation_contacts')
132
+ .select('id, federacion_numero, full_name, role, email, phone, linkedin, is_primary, qualification, updated_at')
133
+ .order('updated_at', { ascending: false })
134
+ .limit(parseLimit(opts));
135
+ if (typeof opts.federation === 'string')
136
+ q = q.eq('federacion_numero', opts.federation);
137
+ if (typeof opts.qualification === 'string')
138
+ q = q.eq('qualification', opts.qualification);
139
+ if (opts.primaryOnly !== undefined)
140
+ q = q.eq('is_primary', true);
141
+ if (typeof opts.search === 'string')
142
+ q = q.or(`full_name.ilike.%${opts.search}%,email.ilike.%${opts.search}%`);
143
+ const { data, error } = await q;
144
+ if (error)
145
+ throw error;
146
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
147
+ }
148
+ async function addFederationContact(_a, opts) {
149
+ if (typeof opts.federation !== 'string' || !opts.federation.trim()) {
150
+ throw new Error('--federation <numero> is required');
151
+ }
152
+ if (typeof opts.fullName !== 'string' || !opts.fullName.trim()) {
153
+ throw new Error('--full-name is required');
154
+ }
155
+ const qualification = typeof opts.qualification === 'string'
156
+ ? ensureEnum(FEDERATION_QUALIFICATIONS, opts.qualification, 'qualification')
157
+ : 'cold';
158
+ const { client } = await getAuthedClient();
159
+ const { data, error } = await client
160
+ .from('federation_contacts')
161
+ .insert({
162
+ federacion_numero: opts.federation,
163
+ full_name: opts.fullName,
164
+ role: opts.role ?? null,
165
+ email: opts.email ?? null,
166
+ phone: opts.phone ?? null,
167
+ linkedin: opts.linkedin ?? null,
168
+ is_primary: !!opts.primary,
169
+ qualification,
170
+ notes: opts.notes ?? null,
171
+ })
172
+ .select('*')
173
+ .single();
174
+ if (error)
175
+ throw error;
176
+ output(data, { pretty: !!opts.pretty });
177
+ }
178
+ // Federation contact activities ────────────────────────────────────────────
179
+ async function listFederationActivities(_a, opts) {
180
+ const { client } = await getAuthedClient();
181
+ let q = client
182
+ .from('federation_contact_activities')
183
+ .select('id, federacion_numero, contact_id, type, outcome, title, description, occurred_at')
184
+ .order('occurred_at', { ascending: false })
185
+ .limit(parseLimit(opts));
186
+ if (typeof opts.federation === 'string')
187
+ q = q.eq('federacion_numero', opts.federation);
188
+ if (typeof opts.contactId === 'string')
189
+ q = q.eq('contact_id', opts.contactId);
190
+ if (typeof opts.type === 'string')
191
+ q = q.eq('type', opts.type);
192
+ if (typeof opts.outcome === 'string')
193
+ q = q.eq('outcome', opts.outcome);
194
+ if (typeof opts.since === 'string')
195
+ q = q.gte('occurred_at', opts.since);
196
+ if (typeof opts.until === 'string')
197
+ q = q.lte('occurred_at', opts.until);
198
+ const { data, error } = await q;
199
+ if (error)
200
+ throw error;
201
+ output(data ?? [], { pretty: !!opts.pretty, columns: parseColumns(opts) });
202
+ }
203
+ async function logFederationActivity(_a, opts) {
204
+ if (typeof opts.contactId !== 'string' || !opts.contactId.trim()) {
205
+ throw new Error('--contact-id is required');
206
+ }
207
+ if (typeof opts.type !== 'string') {
208
+ throw new Error('--type is required (call|email|meeting|note|task)');
209
+ }
210
+ const type = ensureEnum(FEDERATION_ACTIVITY_TYPES, opts.type, 'type');
211
+ const outcome = typeof opts.outcome === 'string'
212
+ ? ensureEnum(FEDERATION_ACTIVITY_OUTCOMES, opts.outcome, 'outcome')
213
+ : null;
214
+ const { client } = await getAuthedClient();
215
+ const contactRes = await client
216
+ .from('federation_contacts')
217
+ .select('id, federacion_numero')
218
+ .eq('id', opts.contactId)
219
+ .single();
220
+ if (contactRes.error)
221
+ throw contactRes.error;
222
+ const insert = {
223
+ contact_id: opts.contactId,
224
+ federacion_numero: contactRes.data.federacion_numero,
225
+ type,
226
+ outcome,
227
+ title: opts.title ?? null,
228
+ description: opts.description ?? null,
229
+ };
230
+ if (typeof opts.occurredAt === 'string')
231
+ insert.occurred_at = opts.occurredAt;
232
+ const { data, error } = await client
233
+ .from('federation_contact_activities')
234
+ .insert(insert)
235
+ .select('*')
236
+ .single();
237
+ if (error)
238
+ throw error;
239
+ output(data, { pretty: !!opts.pretty });
240
+ }
241
+ export const federationsModule = {
242
+ name: 'federations',
243
+ summary: 'Spanish sport federations CRM — pipeline, contacts, activity timeline',
244
+ specs: [
245
+ {
246
+ path: ['federations', 'list'],
247
+ summary: 'List federations being tracked (federation_crm rows)',
248
+ description: 'Sólo devuelve federaciones con fila en federation_crm. El catálogo estático de las 66 federaciones vive en data/federaciones-deportivas-esp.json del CRM.',
249
+ tags: ['read'],
250
+ options: [
251
+ { flag: '--status <s>', description: `pipeline status (${FEDERATION_STATUSES.join('|')})` },
252
+ { flag: '--priority <n>', description: '1..5' },
253
+ { flag: '--owner <uuid|name|email>', description: 'filter by owner_id (team member)' },
254
+ { flag: '--due-before <date>', description: 'next_action_date <= YYYY-MM-DD' },
255
+ { flag: '--due-after <date>', description: 'next_action_date >= YYYY-MM-DD' },
256
+ ...commonListOptions(),
257
+ ],
258
+ examples: [
259
+ 'badgie-crm federations list --status meeting_scheduled --pretty',
260
+ 'badgie-crm federations list --owner "Greg" --due-before 2026-05-01 --pretty',
261
+ ],
262
+ handler: listFederations,
263
+ },
264
+ {
265
+ path: ['federations', 'get'],
266
+ summary: 'Show CRM row + contacts + last 10 activities for a federation',
267
+ tags: ['read'],
268
+ args: [{ name: 'numero', required: true, description: 'federacion_numero (PK del catálogo JSON)' }],
269
+ options: [{ flag: '--pretty', description: 'human output' }],
270
+ handler: getFederation,
271
+ },
272
+ {
273
+ path: ['federations', 'set'],
274
+ summary: 'Upsert CRM fields for a federation (priority, status, owner, next action, notes)',
275
+ description: 'Crea la fila en federation_crm si no existe y actualiza los campos pasados. Usa --clear-owner / --clear-next-action para anular.',
276
+ tags: ['write'],
277
+ args: [{ name: 'numero', required: true, description: 'federacion_numero' }],
278
+ options: [
279
+ { flag: '--status <s>', description: FEDERATION_STATUSES.join('|') },
280
+ { flag: '--priority <n>', description: '1..5' },
281
+ { flag: '--owner <uuid|name|email>', description: 'team member assignee' },
282
+ { flag: '--clear-owner', description: 'set owner_id to NULL' },
283
+ { flag: '--next-action <text>', description: 'next action description' },
284
+ { flag: '--next-action-date <yyyy-mm-dd>', description: 'next action date' },
285
+ { flag: '--clear-next-action', description: 'clear next_action and next_action_date' },
286
+ { flag: '--notes <text>', description: 'CRM notes (replaces existing)' },
287
+ { flag: '--pretty', description: 'human output' },
288
+ ],
289
+ examples: [
290
+ 'badgie-crm federations set 12 --status contacted --priority 2 --owner "Greg" --pretty',
291
+ 'badgie-crm federations set 7 --next-action "Llamar a Marta" --next-action-date 2026-04-30',
292
+ ],
293
+ handler: setFederation,
294
+ },
295
+ {
296
+ path: ['federations', 'contacts', 'list'],
297
+ summary: 'List federation contacts',
298
+ tags: ['read'],
299
+ options: [
300
+ { flag: '--federation <numero>', description: 'filter by federacion_numero' },
301
+ { flag: '--qualification <q>', description: FEDERATION_QUALIFICATIONS.join('|') },
302
+ { flag: '--primary-only', description: 'only is_primary=true' },
303
+ { flag: '--search <text>', description: 'ilike on full_name or email' },
304
+ ...commonListOptions(),
305
+ ],
306
+ handler: listFederationContacts,
307
+ },
308
+ {
309
+ path: ['federations', 'contacts', 'add'],
310
+ summary: 'Add a contact to a federation',
311
+ tags: ['write'],
312
+ options: [
313
+ { flag: '--federation <numero>', description: 'federacion_numero (required)' },
314
+ { flag: '--full-name <text>', description: 'full name (required)' },
315
+ { flag: '--role <text>', description: 'role / title' },
316
+ { flag: '--email <email>', description: 'email' },
317
+ { flag: '--phone <phone>', description: 'phone' },
318
+ { flag: '--linkedin <url>', description: 'linkedin url' },
319
+ { flag: '--primary', description: 'mark as primary contact' },
320
+ { flag: '--qualification <q>', description: `${FEDERATION_QUALIFICATIONS.join('|')} (default: cold)` },
321
+ { flag: '--notes <text>', description: 'free-form notes' },
322
+ { flag: '--pretty', description: 'human output' },
323
+ ],
324
+ examples: [
325
+ 'badgie-crm federations contacts add --federation 12 --full-name "Marta Ruiz" --role Presidenta --email marta@fedex.es --primary --qualification warm',
326
+ ],
327
+ handler: addFederationContact,
328
+ },
329
+ {
330
+ path: ['federations', 'activities', 'list'],
331
+ summary: 'List federation contact activity timeline',
332
+ tags: ['read'],
333
+ options: [
334
+ { flag: '--federation <numero>', description: 'filter by federacion_numero' },
335
+ { flag: '--contact-id <uuid>', description: 'filter by contact' },
336
+ { flag: '--type <t>', description: FEDERATION_ACTIVITY_TYPES.join('|') },
337
+ { flag: '--outcome <o>', description: FEDERATION_ACTIVITY_OUTCOMES.join('|') },
338
+ { flag: '--since <date>', description: 'occurred_at >= YYYY-MM-DD' },
339
+ { flag: '--until <date>', description: 'occurred_at <= YYYY-MM-DD' },
340
+ ...commonListOptions(),
341
+ ],
342
+ handler: listFederationActivities,
343
+ },
344
+ {
345
+ path: ['federations', 'activities', 'log'],
346
+ summary: 'Log an activity against a federation contact (auto-syncs last_contact_at)',
347
+ description: 'Inserta en federation_contact_activities. El trigger sincroniza federation_crm.last_contact_at con el max(occurred_at).',
348
+ tags: ['write'],
349
+ options: [
350
+ { flag: '--contact-id <uuid>', description: 'federation_contacts.id (required)' },
351
+ { flag: '--type <t>', description: `${FEDERATION_ACTIVITY_TYPES.join('|')} (required)` },
352
+ { flag: '--outcome <o>', description: FEDERATION_ACTIVITY_OUTCOMES.join('|') },
353
+ { flag: '--title <text>', description: 'short title' },
354
+ { flag: '--description <text>', description: 'detailed description' },
355
+ { flag: '--occurred-at <iso>', description: 'ISO timestamp (default now)' },
356
+ { flag: '--pretty', description: 'human output' },
357
+ ],
358
+ examples: [
359
+ 'badgie-crm federations activities log --contact-id <uuid> --type call --outcome follow_up --title "Primer contacto"',
360
+ ],
361
+ handler: logFederationActivity,
362
+ },
363
+ ],
364
+ };
365
+ //# sourceMappingURL=federations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"federations.js","sourceRoot":"","sources":["../../src/commands/federations.ts"],"names":[],"mappings":"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"}