@hasna/microservices 0.0.16 → 0.0.18
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/README.md +143 -23
- package/bin/index.js +784 -13987
- package/bin/mcp.js +298 -10973
- package/dist/index.js +251 -10056
- package/package.json +36 -26
- package/microservices/microservice-ads/package.json +0 -28
- package/microservices/microservice-ads/src/cli/index.ts +0 -605
- package/microservices/microservice-ads/src/db/campaigns.ts +0 -797
- package/microservices/microservice-ads/src/db/database.ts +0 -91
- package/microservices/microservice-ads/src/db/migrations.ts +0 -60
- package/microservices/microservice-ads/src/index.ts +0 -39
- package/microservices/microservice-ads/src/mcp/index.ts +0 -480
- package/microservices/microservice-analytics/package.json +0 -28
- package/microservices/microservice-analytics/src/cli/index.ts +0 -373
- package/microservices/microservice-analytics/src/db/analytics.ts +0 -564
- package/microservices/microservice-analytics/src/db/database.ts +0 -91
- package/microservices/microservice-analytics/src/db/migrations.ts +0 -50
- package/microservices/microservice-analytics/src/index.ts +0 -37
- package/microservices/microservice-analytics/src/mcp/index.ts +0 -334
- package/microservices/microservice-assets/package.json +0 -28
- package/microservices/microservice-assets/src/cli/index.ts +0 -375
- package/microservices/microservice-assets/src/db/assets.ts +0 -370
- package/microservices/microservice-assets/src/db/database.ts +0 -91
- package/microservices/microservice-assets/src/db/migrations.ts +0 -51
- package/microservices/microservice-assets/src/index.ts +0 -32
- package/microservices/microservice-assets/src/mcp/index.ts +0 -346
- package/microservices/microservice-bookkeeping/package.json +0 -28
- package/microservices/microservice-bookkeeping/src/cli/index.ts +0 -386
- package/microservices/microservice-bookkeeping/src/db/bookkeeping.ts +0 -591
- package/microservices/microservice-bookkeeping/src/db/database.ts +0 -91
- package/microservices/microservice-bookkeeping/src/db/migrations.ts +0 -52
- package/microservices/microservice-bookkeeping/src/index.ts +0 -32
- package/microservices/microservice-bookkeeping/src/mcp/index.ts +0 -284
- package/microservices/microservice-calendar/package.json +0 -28
- package/microservices/microservice-calendar/src/cli/index.ts +0 -287
- package/microservices/microservice-calendar/src/db/calendar.ts +0 -328
- package/microservices/microservice-calendar/src/db/database.ts +0 -91
- package/microservices/microservice-calendar/src/db/migrations.ts +0 -47
- package/microservices/microservice-calendar/src/index.ts +0 -24
- package/microservices/microservice-calendar/src/mcp/index.ts +0 -226
- package/microservices/microservice-company/package.json +0 -28
- package/microservices/microservice-company/src/cli/index.ts +0 -1126
- package/microservices/microservice-company/src/db/company.ts +0 -854
- package/microservices/microservice-company/src/db/database.ts +0 -91
- package/microservices/microservice-company/src/db/migrations.ts +0 -214
- package/microservices/microservice-company/src/db/workflow-migrations.ts +0 -44
- package/microservices/microservice-company/src/index.ts +0 -60
- package/microservices/microservice-company/src/lib/audit.ts +0 -168
- package/microservices/microservice-company/src/lib/finance.ts +0 -299
- package/microservices/microservice-company/src/lib/settings.ts +0 -85
- package/microservices/microservice-company/src/lib/workflows.ts +0 -698
- package/microservices/microservice-company/src/mcp/index.ts +0 -991
- package/microservices/microservice-compliance/package.json +0 -28
- package/microservices/microservice-compliance/src/cli/index.ts +0 -467
- package/microservices/microservice-compliance/src/db/compliance.ts +0 -633
- package/microservices/microservice-compliance/src/db/database.ts +0 -91
- package/microservices/microservice-compliance/src/db/migrations.ts +0 -63
- package/microservices/microservice-compliance/src/index.ts +0 -46
- package/microservices/microservice-compliance/src/mcp/index.ts +0 -438
- package/microservices/microservice-contacts/package.json +0 -28
- package/microservices/microservice-contacts/src/cli/index.ts +0 -393
- package/microservices/microservice-contacts/src/db/companies.ts +0 -167
- package/microservices/microservice-contacts/src/db/contacts.ts +0 -249
- package/microservices/microservice-contacts/src/db/database.ts +0 -91
- package/microservices/microservice-contacts/src/db/migrations.ts +0 -71
- package/microservices/microservice-contacts/src/db/relationships.ts +0 -53
- package/microservices/microservice-contacts/src/index.ts +0 -42
- package/microservices/microservice-contacts/src/mcp/index.ts +0 -303
- package/microservices/microservice-contracts/package.json +0 -28
- package/microservices/microservice-contracts/src/cli/index.ts +0 -770
- package/microservices/microservice-contracts/src/db/contracts.ts +0 -925
- package/microservices/microservice-contracts/src/db/database.ts +0 -91
- package/microservices/microservice-contracts/src/db/migrations.ts +0 -141
- package/microservices/microservice-contracts/src/index.ts +0 -43
- package/microservices/microservice-contracts/src/mcp/index.ts +0 -617
- package/microservices/microservice-crm/package.json +0 -28
- package/microservices/microservice-crm/src/cli/index.ts +0 -396
- package/microservices/microservice-crm/src/db/database.ts +0 -91
- package/microservices/microservice-crm/src/db/migrations.ts +0 -66
- package/microservices/microservice-crm/src/db/pipeline.ts +0 -397
- package/microservices/microservice-crm/src/index.ts +0 -34
- package/microservices/microservice-crm/src/mcp/index.ts +0 -294
- package/microservices/microservice-documents/package.json +0 -28
- package/microservices/microservice-documents/src/cli/index.ts +0 -246
- package/microservices/microservice-documents/src/db/database.ts +0 -91
- package/microservices/microservice-documents/src/db/documents.ts +0 -316
- package/microservices/microservice-documents/src/db/migrations.ts +0 -49
- package/microservices/microservice-documents/src/index.ts +0 -24
- package/microservices/microservice-documents/src/mcp/index.ts +0 -202
- package/microservices/microservice-domains/package.json +0 -28
- package/microservices/microservice-domains/src/cli/index.ts +0 -1111
- package/microservices/microservice-domains/src/db/database.ts +0 -91
- package/microservices/microservice-domains/src/db/domains.ts +0 -1164
- package/microservices/microservice-domains/src/db/migrations.ts +0 -60
- package/microservices/microservice-domains/src/index.ts +0 -65
- package/microservices/microservice-domains/src/lib/brandsight.ts +0 -350
- package/microservices/microservice-domains/src/lib/godaddy.ts +0 -338
- package/microservices/microservice-domains/src/lib/namecheap.ts +0 -262
- package/microservices/microservice-domains/src/lib/registrar.ts +0 -355
- package/microservices/microservice-domains/src/mcp/index.ts +0 -781
- package/microservices/microservice-expenses/package.json +0 -28
- package/microservices/microservice-expenses/src/cli/index.ts +0 -267
- package/microservices/microservice-expenses/src/db/database.ts +0 -91
- package/microservices/microservice-expenses/src/db/expenses.ts +0 -345
- package/microservices/microservice-expenses/src/db/migrations.ts +0 -45
- package/microservices/microservice-expenses/src/index.ts +0 -25
- package/microservices/microservice-expenses/src/mcp/index.ts +0 -196
- package/microservices/microservice-habits/package.json +0 -28
- package/microservices/microservice-habits/src/cli/index.ts +0 -315
- package/microservices/microservice-habits/src/db/database.ts +0 -91
- package/microservices/microservice-habits/src/db/habits.ts +0 -451
- package/microservices/microservice-habits/src/db/migrations.ts +0 -46
- package/microservices/microservice-habits/src/index.ts +0 -31
- package/microservices/microservice-habits/src/mcp/index.ts +0 -313
- package/microservices/microservice-health/package.json +0 -28
- package/microservices/microservice-health/src/cli/index.ts +0 -484
- package/microservices/microservice-health/src/db/database.ts +0 -91
- package/microservices/microservice-health/src/db/health.ts +0 -708
- package/microservices/microservice-health/src/db/migrations.ts +0 -70
- package/microservices/microservice-health/src/index.ts +0 -63
- package/microservices/microservice-health/src/mcp/index.ts +0 -437
- package/microservices/microservice-hiring/package.json +0 -28
- package/microservices/microservice-hiring/src/cli/index.ts +0 -741
- package/microservices/microservice-hiring/src/db/database.ts +0 -91
- package/microservices/microservice-hiring/src/db/hiring.ts +0 -1085
- package/microservices/microservice-hiring/src/db/migrations.ts +0 -89
- package/microservices/microservice-hiring/src/index.ts +0 -80
- package/microservices/microservice-hiring/src/lib/scoring.ts +0 -206
- package/microservices/microservice-hiring/src/mcp/index.ts +0 -709
- package/microservices/microservice-inventory/package.json +0 -28
- package/microservices/microservice-inventory/src/cli/index.ts +0 -365
- package/microservices/microservice-inventory/src/db/database.ts +0 -91
- package/microservices/microservice-inventory/src/db/inventory.ts +0 -393
- package/microservices/microservice-inventory/src/db/migrations.ts +0 -54
- package/microservices/microservice-inventory/src/index.ts +0 -28
- package/microservices/microservice-inventory/src/mcp/index.ts +0 -250
- package/microservices/microservice-invoices/dashboard/index.html +0 -12
- package/microservices/microservice-invoices/dashboard/package.json +0 -29
- package/microservices/microservice-invoices/dashboard/tsconfig.json +0 -14
- package/microservices/microservice-invoices/dashboard/vite.config.ts +0 -15
- package/microservices/microservice-invoices/package.json +0 -31
- package/microservices/microservice-invoices/src/cli/index.ts +0 -308
- package/microservices/microservice-invoices/src/db/business.ts +0 -241
- package/microservices/microservice-invoices/src/db/clients.ts +0 -127
- package/microservices/microservice-invoices/src/db/database.ts +0 -91
- package/microservices/microservice-invoices/src/db/invoices.ts +0 -345
- package/microservices/microservice-invoices/src/db/migrations.ts +0 -184
- package/microservices/microservice-invoices/src/index.ts +0 -56
- package/microservices/microservice-invoices/src/mcp/index.ts +0 -242
- package/microservices/microservice-invoices/src/server/index.ts +0 -162
- package/microservices/microservice-leads/package.json +0 -28
- package/microservices/microservice-leads/src/cli/index.ts +0 -596
- package/microservices/microservice-leads/src/db/database.ts +0 -91
- package/microservices/microservice-leads/src/db/leads.ts +0 -520
- package/microservices/microservice-leads/src/db/lists.ts +0 -151
- package/microservices/microservice-leads/src/db/migrations.ts +0 -93
- package/microservices/microservice-leads/src/index.ts +0 -65
- package/microservices/microservice-leads/src/lib/enrichment.ts +0 -202
- package/microservices/microservice-leads/src/lib/scoring.ts +0 -134
- package/microservices/microservice-leads/src/mcp/index.ts +0 -533
- package/microservices/microservice-notes/package.json +0 -28
- package/microservices/microservice-notes/src/cli/index.ts +0 -63
- package/microservices/microservice-notes/src/db/database.ts +0 -91
- package/microservices/microservice-notes/src/db/migrations.ts +0 -40
- package/microservices/microservice-notes/src/db/notes.ts +0 -114
- package/microservices/microservice-notes/src/index.ts +0 -2
- package/microservices/microservice-notes/src/mcp/index.ts +0 -37
- package/microservices/microservice-notifications/package.json +0 -28
- package/microservices/microservice-notifications/src/cli/index.ts +0 -349
- package/microservices/microservice-notifications/src/db/database.ts +0 -91
- package/microservices/microservice-notifications/src/db/migrations.ts +0 -62
- package/microservices/microservice-notifications/src/db/notifications.ts +0 -509
- package/microservices/microservice-notifications/src/index.ts +0 -41
- package/microservices/microservice-notifications/src/mcp/index.ts +0 -422
- package/microservices/microservice-payments/package.json +0 -28
- package/microservices/microservice-payments/src/cli/index.ts +0 -609
- package/microservices/microservice-payments/src/db/database.ts +0 -91
- package/microservices/microservice-payments/src/db/migrations.ts +0 -81
- package/microservices/microservice-payments/src/db/payments.ts +0 -1204
- package/microservices/microservice-payments/src/index.ts +0 -51
- package/microservices/microservice-payments/src/mcp/index.ts +0 -683
- package/microservices/microservice-payroll/package.json +0 -28
- package/microservices/microservice-payroll/src/cli/index.ts +0 -643
- package/microservices/microservice-payroll/src/db/database.ts +0 -91
- package/microservices/microservice-payroll/src/db/migrations.ts +0 -95
- package/microservices/microservice-payroll/src/db/payroll.ts +0 -1377
- package/microservices/microservice-payroll/src/index.ts +0 -48
- package/microservices/microservice-payroll/src/mcp/index.ts +0 -666
- package/microservices/microservice-products/package.json +0 -28
- package/microservices/microservice-products/src/cli/index.ts +0 -416
- package/microservices/microservice-products/src/db/categories.ts +0 -154
- package/microservices/microservice-products/src/db/database.ts +0 -91
- package/microservices/microservice-products/src/db/migrations.ts +0 -58
- package/microservices/microservice-products/src/db/pricing-tiers.ts +0 -66
- package/microservices/microservice-products/src/db/products.ts +0 -452
- package/microservices/microservice-products/src/index.ts +0 -53
- package/microservices/microservice-products/src/mcp/index.ts +0 -453
- package/microservices/microservice-projects/package.json +0 -28
- package/microservices/microservice-projects/src/cli/index.ts +0 -480
- package/microservices/microservice-projects/src/db/database.ts +0 -91
- package/microservices/microservice-projects/src/db/migrations.ts +0 -65
- package/microservices/microservice-projects/src/db/projects.ts +0 -715
- package/microservices/microservice-projects/src/index.ts +0 -57
- package/microservices/microservice-projects/src/mcp/index.ts +0 -501
- package/microservices/microservice-proposals/package.json +0 -28
- package/microservices/microservice-proposals/src/cli/index.ts +0 -400
- package/microservices/microservice-proposals/src/db/database.ts +0 -91
- package/microservices/microservice-proposals/src/db/migrations.ts +0 -52
- package/microservices/microservice-proposals/src/db/proposals.ts +0 -532
- package/microservices/microservice-proposals/src/index.ts +0 -37
- package/microservices/microservice-proposals/src/mcp/index.ts +0 -375
- package/microservices/microservice-reading/package.json +0 -28
- package/microservices/microservice-reading/src/cli/index.ts +0 -464
- package/microservices/microservice-reading/src/db/database.ts +0 -91
- package/microservices/microservice-reading/src/db/migrations.ts +0 -59
- package/microservices/microservice-reading/src/db/reading.ts +0 -524
- package/microservices/microservice-reading/src/index.ts +0 -51
- package/microservices/microservice-reading/src/mcp/index.ts +0 -368
- package/microservices/microservice-shipping/package.json +0 -28
- package/microservices/microservice-shipping/src/cli/index.ts +0 -606
- package/microservices/microservice-shipping/src/db/database.ts +0 -91
- package/microservices/microservice-shipping/src/db/migrations.ts +0 -69
- package/microservices/microservice-shipping/src/db/shipping.ts +0 -1093
- package/microservices/microservice-shipping/src/index.ts +0 -53
- package/microservices/microservice-shipping/src/mcp/index.ts +0 -533
- package/microservices/microservice-social/package.json +0 -29
- package/microservices/microservice-social/src/cli/index.ts +0 -1583
- package/microservices/microservice-social/src/db/database.ts +0 -91
- package/microservices/microservice-social/src/db/migrations.ts +0 -160
- package/microservices/microservice-social/src/db/social.ts +0 -1076
- package/microservices/microservice-social/src/index.ts +0 -46
- package/microservices/microservice-social/src/lib/audience.ts +0 -353
- package/microservices/microservice-social/src/lib/content-ai.ts +0 -278
- package/microservices/microservice-social/src/lib/media.ts +0 -311
- package/microservices/microservice-social/src/lib/mentions.ts +0 -434
- package/microservices/microservice-social/src/lib/metrics-sync.ts +0 -264
- package/microservices/microservice-social/src/lib/publisher.ts +0 -377
- package/microservices/microservice-social/src/lib/scheduler.ts +0 -229
- package/microservices/microservice-social/src/lib/sentiment.ts +0 -256
- package/microservices/microservice-social/src/lib/threads.ts +0 -291
- package/microservices/microservice-social/src/mcp/index.ts +0 -1425
- package/microservices/microservice-social/src/server/index.ts +0 -441
- package/microservices/microservice-subscriptions/package.json +0 -28
- package/microservices/microservice-subscriptions/src/cli/index.ts +0 -715
- package/microservices/microservice-subscriptions/src/db/database.ts +0 -91
- package/microservices/microservice-subscriptions/src/db/migrations.ts +0 -125
- package/microservices/microservice-subscriptions/src/db/subscriptions.ts +0 -1256
- package/microservices/microservice-subscriptions/src/index.ts +0 -41
- package/microservices/microservice-subscriptions/src/mcp/index.ts +0 -631
- package/microservices/microservice-timesheets/package.json +0 -28
- package/microservices/microservice-timesheets/src/cli/index.ts +0 -373
- package/microservices/microservice-timesheets/src/db/database.ts +0 -91
- package/microservices/microservice-timesheets/src/db/locale.ts +0 -217
- package/microservices/microservice-timesheets/src/db/migrations.ts +0 -74
- package/microservices/microservice-timesheets/src/db/timesheets.ts +0 -447
- package/microservices/microservice-timesheets/src/index.ts +0 -44
- package/microservices/microservice-timesheets/src/mcp/index.ts +0 -269
- package/microservices/microservice-transcriber/package.json +0 -29
- package/microservices/microservice-transcriber/src/cli/index.ts +0 -1593
- package/microservices/microservice-transcriber/src/db/annotations.ts +0 -37
- package/microservices/microservice-transcriber/src/db/comments.ts +0 -166
- package/microservices/microservice-transcriber/src/db/database.ts +0 -91
- package/microservices/microservice-transcriber/src/db/migrations.ts +0 -118
- package/microservices/microservice-transcriber/src/db/proofread.ts +0 -119
- package/microservices/microservice-transcriber/src/db/transcripts.ts +0 -395
- package/microservices/microservice-transcriber/src/index.ts +0 -43
- package/microservices/microservice-transcriber/src/lib/config.ts +0 -77
- package/microservices/microservice-transcriber/src/lib/diff.ts +0 -91
- package/microservices/microservice-transcriber/src/lib/downloader.ts +0 -638
- package/microservices/microservice-transcriber/src/lib/feeds.ts +0 -62
- package/microservices/microservice-transcriber/src/lib/live.ts +0 -94
- package/microservices/microservice-transcriber/src/lib/notion.ts +0 -129
- package/microservices/microservice-transcriber/src/lib/proofread.ts +0 -296
- package/microservices/microservice-transcriber/src/lib/providers.ts +0 -713
- package/microservices/microservice-transcriber/src/lib/summarizer.ts +0 -147
- package/microservices/microservice-transcriber/src/lib/translator.ts +0 -75
- package/microservices/microservice-transcriber/src/lib/webhook.ts +0 -37
- package/microservices/microservice-transcriber/src/mcp/index.ts +0 -1330
- package/microservices/microservice-transcriber/src/server/index.ts +0 -199
- package/microservices/microservice-travel/package.json +0 -28
- package/microservices/microservice-travel/src/cli/index.ts +0 -505
- package/microservices/microservice-travel/src/db/database.ts +0 -91
- package/microservices/microservice-travel/src/db/migrations.ts +0 -77
- package/microservices/microservice-travel/src/db/travel.ts +0 -802
- package/microservices/microservice-travel/src/index.ts +0 -60
- package/microservices/microservice-travel/src/mcp/index.ts +0 -495
- package/microservices/microservice-wiki/package.json +0 -28
- package/microservices/microservice-wiki/src/cli/index.ts +0 -345
- package/microservices/microservice-wiki/src/db/database.ts +0 -91
- package/microservices/microservice-wiki/src/db/migrations.ts +0 -55
- package/microservices/microservice-wiki/src/db/wiki.ts +0 -395
- package/microservices/microservice-wiki/src/index.ts +0 -32
- package/microservices/microservice-wiki/src/mcp/index.ts +0 -344
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
export interface MigrationEntry {
|
|
2
|
-
id: number;
|
|
3
|
-
name: string;
|
|
4
|
-
sql: string;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export const MIGRATIONS: MigrationEntry[] = [
|
|
8
|
-
{
|
|
9
|
-
id: 1,
|
|
10
|
-
name: "initial_schema",
|
|
11
|
-
sql: `
|
|
12
|
-
CREATE TABLE IF NOT EXISTS clients (
|
|
13
|
-
id TEXT PRIMARY KEY,
|
|
14
|
-
name TEXT NOT NULL,
|
|
15
|
-
email TEXT,
|
|
16
|
-
phone TEXT,
|
|
17
|
-
address TEXT,
|
|
18
|
-
tax_id TEXT,
|
|
19
|
-
notes TEXT,
|
|
20
|
-
metadata TEXT NOT NULL DEFAULT '{}',
|
|
21
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
22
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
CREATE TABLE IF NOT EXISTS invoices (
|
|
26
|
-
id TEXT PRIMARY KEY,
|
|
27
|
-
invoice_number TEXT NOT NULL UNIQUE,
|
|
28
|
-
client_id TEXT REFERENCES clients(id) ON DELETE SET NULL,
|
|
29
|
-
status TEXT NOT NULL DEFAULT 'draft' CHECK(status IN ('draft', 'sent', 'paid', 'overdue', 'cancelled', 'refunded')),
|
|
30
|
-
issue_date TEXT NOT NULL DEFAULT (date('now')),
|
|
31
|
-
due_date TEXT,
|
|
32
|
-
currency TEXT NOT NULL DEFAULT 'USD',
|
|
33
|
-
subtotal REAL NOT NULL DEFAULT 0,
|
|
34
|
-
tax_rate REAL NOT NULL DEFAULT 0,
|
|
35
|
-
tax_amount REAL NOT NULL DEFAULT 0,
|
|
36
|
-
discount REAL NOT NULL DEFAULT 0,
|
|
37
|
-
total REAL NOT NULL DEFAULT 0,
|
|
38
|
-
notes TEXT,
|
|
39
|
-
metadata TEXT NOT NULL DEFAULT '{}',
|
|
40
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
41
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
42
|
-
paid_at TEXT
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
CREATE TABLE IF NOT EXISTS line_items (
|
|
46
|
-
id TEXT PRIMARY KEY,
|
|
47
|
-
invoice_id TEXT NOT NULL REFERENCES invoices(id) ON DELETE CASCADE,
|
|
48
|
-
description TEXT NOT NULL,
|
|
49
|
-
quantity REAL NOT NULL DEFAULT 1,
|
|
50
|
-
unit_price REAL NOT NULL DEFAULT 0,
|
|
51
|
-
amount REAL NOT NULL DEFAULT 0,
|
|
52
|
-
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
53
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
CREATE TABLE IF NOT EXISTS payments (
|
|
57
|
-
id TEXT PRIMARY KEY,
|
|
58
|
-
invoice_id TEXT NOT NULL REFERENCES invoices(id) ON DELETE CASCADE,
|
|
59
|
-
amount REAL NOT NULL,
|
|
60
|
-
method TEXT,
|
|
61
|
-
reference TEXT,
|
|
62
|
-
notes TEXT,
|
|
63
|
-
paid_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
64
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
CREATE TABLE IF NOT EXISTS invoice_counter (
|
|
68
|
-
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
69
|
-
prefix TEXT NOT NULL DEFAULT 'INV',
|
|
70
|
-
next_number INTEGER NOT NULL DEFAULT 1
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
INSERT OR IGNORE INTO invoice_counter (id, prefix, next_number) VALUES (1, 'INV', 1);
|
|
74
|
-
|
|
75
|
-
CREATE INDEX IF NOT EXISTS idx_invoices_client ON invoices(client_id);
|
|
76
|
-
CREATE INDEX IF NOT EXISTS idx_invoices_status ON invoices(status);
|
|
77
|
-
CREATE INDEX IF NOT EXISTS idx_invoices_number ON invoices(invoice_number);
|
|
78
|
-
CREATE INDEX IF NOT EXISTS idx_invoices_due ON invoices(due_date);
|
|
79
|
-
CREATE INDEX IF NOT EXISTS idx_line_items_invoice ON line_items(invoice_id);
|
|
80
|
-
CREATE INDEX IF NOT EXISTS idx_payments_invoice ON payments(invoice_id);
|
|
81
|
-
CREATE INDEX IF NOT EXISTS idx_clients_name ON clients(name);
|
|
82
|
-
CREATE INDEX IF NOT EXISTS idx_clients_email ON clients(email);
|
|
83
|
-
`,
|
|
84
|
-
},
|
|
85
|
-
{
|
|
86
|
-
id: 2,
|
|
87
|
-
name: "multi_country_support",
|
|
88
|
-
sql: `
|
|
89
|
-
CREATE TABLE IF NOT EXISTS business_profiles (
|
|
90
|
-
id TEXT PRIMARY KEY,
|
|
91
|
-
name TEXT NOT NULL,
|
|
92
|
-
address_line1 TEXT,
|
|
93
|
-
address_line2 TEXT,
|
|
94
|
-
city TEXT,
|
|
95
|
-
state TEXT,
|
|
96
|
-
postal_code TEXT,
|
|
97
|
-
country TEXT NOT NULL DEFAULT 'US',
|
|
98
|
-
tax_id TEXT,
|
|
99
|
-
vat_number TEXT,
|
|
100
|
-
registration_number TEXT,
|
|
101
|
-
email TEXT,
|
|
102
|
-
phone TEXT,
|
|
103
|
-
website TEXT,
|
|
104
|
-
bank_name TEXT,
|
|
105
|
-
bank_iban TEXT,
|
|
106
|
-
bank_swift TEXT,
|
|
107
|
-
bank_account TEXT,
|
|
108
|
-
logo_url TEXT,
|
|
109
|
-
is_default INTEGER NOT NULL DEFAULT 0,
|
|
110
|
-
metadata TEXT NOT NULL DEFAULT '{}',
|
|
111
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
112
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
CREATE TABLE IF NOT EXISTS tax_rules (
|
|
116
|
-
id TEXT PRIMARY KEY,
|
|
117
|
-
country TEXT NOT NULL,
|
|
118
|
-
region TEXT,
|
|
119
|
-
tax_name TEXT NOT NULL,
|
|
120
|
-
rate REAL NOT NULL,
|
|
121
|
-
type TEXT NOT NULL DEFAULT 'vat' CHECK(type IN ('vat', 'sales_tax', 'gst', 'other')),
|
|
122
|
-
is_default INTEGER NOT NULL DEFAULT 0,
|
|
123
|
-
reverse_charge INTEGER NOT NULL DEFAULT 0,
|
|
124
|
-
description TEXT,
|
|
125
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
126
|
-
);
|
|
127
|
-
|
|
128
|
-
-- Add new columns to invoices
|
|
129
|
-
ALTER TABLE invoices ADD COLUMN business_profile_id TEXT REFERENCES business_profiles(id) ON DELETE SET NULL;
|
|
130
|
-
ALTER TABLE invoices ADD COLUMN tax_name TEXT DEFAULT 'Tax';
|
|
131
|
-
ALTER TABLE invoices ADD COLUMN reverse_charge INTEGER NOT NULL DEFAULT 0;
|
|
132
|
-
ALTER TABLE invoices ADD COLUMN language TEXT NOT NULL DEFAULT 'en';
|
|
133
|
-
ALTER TABLE invoices ADD COLUMN footer_text TEXT;
|
|
134
|
-
|
|
135
|
-
-- Add new columns to clients
|
|
136
|
-
ALTER TABLE clients ADD COLUMN address_line1 TEXT;
|
|
137
|
-
ALTER TABLE clients ADD COLUMN address_line2 TEXT;
|
|
138
|
-
ALTER TABLE clients ADD COLUMN city TEXT;
|
|
139
|
-
ALTER TABLE clients ADD COLUMN state TEXT;
|
|
140
|
-
ALTER TABLE clients ADD COLUMN postal_code TEXT;
|
|
141
|
-
ALTER TABLE clients ADD COLUMN country TEXT DEFAULT 'US';
|
|
142
|
-
ALTER TABLE clients ADD COLUMN vat_number TEXT;
|
|
143
|
-
ALTER TABLE clients ADD COLUMN language TEXT DEFAULT 'en';
|
|
144
|
-
|
|
145
|
-
-- Add per-line-item tax support
|
|
146
|
-
ALTER TABLE line_items ADD COLUMN tax_rate REAL;
|
|
147
|
-
ALTER TABLE line_items ADD COLUMN tax_amount REAL DEFAULT 0;
|
|
148
|
-
|
|
149
|
-
-- Seed default tax rules
|
|
150
|
-
INSERT INTO tax_rules (id, country, tax_name, rate, type, is_default, description) VALUES
|
|
151
|
-
('tax-ro-vat-19', 'RO', 'TVA', 19, 'vat', 1, 'Romania standard VAT 19%'),
|
|
152
|
-
('tax-ro-vat-9', 'RO', 'TVA', 9, 'vat', 0, 'Romania reduced VAT 9% (food, hotels)'),
|
|
153
|
-
('tax-ro-vat-5', 'RO', 'TVA', 5, 'vat', 0, 'Romania reduced VAT 5% (housing)'),
|
|
154
|
-
('tax-us-none', 'US', 'Sales Tax', 0, 'sales_tax', 1, 'US federal (no federal sales tax)'),
|
|
155
|
-
('tax-us-ca', 'US', 'Sales Tax', 7.25, 'sales_tax', 0, 'California base sales tax'),
|
|
156
|
-
('tax-us-ny', 'US', 'Sales Tax', 8, 'sales_tax', 0, 'New York sales tax'),
|
|
157
|
-
('tax-us-tx', 'US', 'Sales Tax', 6.25, 'sales_tax', 0, 'Texas sales tax'),
|
|
158
|
-
('tax-uk-vat-20', 'GB', 'VAT', 20, 'vat', 1, 'UK standard VAT 20%'),
|
|
159
|
-
('tax-uk-vat-5', 'GB', 'VAT', 5, 'vat', 0, 'UK reduced VAT 5%'),
|
|
160
|
-
('tax-uk-vat-0', 'GB', 'VAT', 0, 'vat', 0, 'UK zero-rated VAT'),
|
|
161
|
-
('tax-de-vat-19', 'DE', 'MwSt', 19, 'vat', 1, 'Germany standard VAT 19%'),
|
|
162
|
-
('tax-de-vat-7', 'DE', 'MwSt', 7, 'vat', 0, 'Germany reduced VAT 7%'),
|
|
163
|
-
('tax-fr-vat-20', 'FR', 'TVA', 20, 'vat', 1, 'France standard VAT 20%'),
|
|
164
|
-
('tax-fr-vat-10', 'FR', 'TVA', 10, 'vat', 0, 'France reduced VAT 10%'),
|
|
165
|
-
('tax-fr-vat-55', 'FR', 'TVA', 5.5, 'vat', 0, 'France reduced VAT 5.5%'),
|
|
166
|
-
('tax-nl-vat-21', 'NL', 'BTW', 21, 'vat', 1, 'Netherlands standard VAT 21%'),
|
|
167
|
-
('tax-it-vat-22', 'IT', 'IVA', 22, 'vat', 1, 'Italy standard VAT 22%'),
|
|
168
|
-
('tax-es-vat-21', 'ES', 'IVA', 21, 'vat', 1, 'Spain standard VAT 21%'),
|
|
169
|
-
('tax-at-vat-20', 'AT', 'USt', 20, 'vat', 1, 'Austria standard VAT 20%'),
|
|
170
|
-
('tax-be-vat-21', 'BE', 'BTW', 21, 'vat', 1, 'Belgium standard VAT 21%'),
|
|
171
|
-
('tax-pl-vat-23', 'PL', 'VAT', 23, 'vat', 1, 'Poland standard VAT 23%'),
|
|
172
|
-
('tax-ie-vat-23', 'IE', 'VAT', 23, 'vat', 1, 'Ireland standard VAT 23%'),
|
|
173
|
-
('tax-se-vat-25', 'SE', 'Moms', 25, 'vat', 1, 'Sweden standard VAT 25%'),
|
|
174
|
-
('tax-dk-vat-25', 'DK', 'Moms', 25, 'vat', 1, 'Denmark standard VAT 25%'),
|
|
175
|
-
('tax-hu-vat-27', 'HU', 'AFA', 27, 'vat', 1, 'Hungary standard VAT 27%'),
|
|
176
|
-
('tax-bg-vat-20', 'BG', 'DDC', 20, 'vat', 1, 'Bulgaria standard VAT 20%'),
|
|
177
|
-
('tax-eu-rc', 'EU', 'Reverse Charge', 0, 'vat', 0, 'EU B2B reverse charge mechanism');
|
|
178
|
-
|
|
179
|
-
CREATE INDEX IF NOT EXISTS idx_business_profiles_default ON business_profiles(is_default);
|
|
180
|
-
CREATE INDEX IF NOT EXISTS idx_tax_rules_country ON tax_rules(country);
|
|
181
|
-
CREATE INDEX IF NOT EXISTS idx_invoices_business ON invoices(business_profile_id);
|
|
182
|
-
`,
|
|
183
|
-
},
|
|
184
|
-
];
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* microservice-invoices — Invoice management microservice
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
createInvoice,
|
|
7
|
-
getInvoice,
|
|
8
|
-
getInvoiceWithItems,
|
|
9
|
-
listInvoices,
|
|
10
|
-
updateInvoiceStatus,
|
|
11
|
-
deleteInvoice,
|
|
12
|
-
addLineItem,
|
|
13
|
-
removeLineItem,
|
|
14
|
-
recordPayment,
|
|
15
|
-
getInvoiceSummary,
|
|
16
|
-
type Invoice,
|
|
17
|
-
type InvoiceWithItems,
|
|
18
|
-
type LineItem,
|
|
19
|
-
type Payment,
|
|
20
|
-
type CreateInvoiceInput,
|
|
21
|
-
type AddLineItemInput,
|
|
22
|
-
type RecordPaymentInput,
|
|
23
|
-
type ListInvoicesOptions,
|
|
24
|
-
} from "./db/invoices.js";
|
|
25
|
-
|
|
26
|
-
export {
|
|
27
|
-
createClient,
|
|
28
|
-
getClient,
|
|
29
|
-
listClients,
|
|
30
|
-
updateClient,
|
|
31
|
-
deleteClient,
|
|
32
|
-
type Client,
|
|
33
|
-
type CreateClientInput,
|
|
34
|
-
} from "./db/clients.js";
|
|
35
|
-
|
|
36
|
-
export {
|
|
37
|
-
createBusinessProfile,
|
|
38
|
-
getBusinessProfile,
|
|
39
|
-
getDefaultBusinessProfile,
|
|
40
|
-
listBusinessProfiles,
|
|
41
|
-
updateBusinessProfile,
|
|
42
|
-
deleteBusinessProfile,
|
|
43
|
-
getTaxRulesForCountry,
|
|
44
|
-
getDefaultTaxRule,
|
|
45
|
-
getTaxRule,
|
|
46
|
-
listAllTaxRules,
|
|
47
|
-
createTaxRule,
|
|
48
|
-
deleteTaxRule,
|
|
49
|
-
determineTax,
|
|
50
|
-
type BusinessProfile,
|
|
51
|
-
type CreateBusinessInput,
|
|
52
|
-
type TaxRule,
|
|
53
|
-
type CreateTaxRuleInput,
|
|
54
|
-
} from "./db/business.js";
|
|
55
|
-
|
|
56
|
-
export { getDatabase, closeDatabase } from "./db/database.js";
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
|
-
import { z } from "zod";
|
|
6
|
-
import {
|
|
7
|
-
createInvoice,
|
|
8
|
-
getInvoiceWithItems,
|
|
9
|
-
listInvoices,
|
|
10
|
-
updateInvoiceStatus,
|
|
11
|
-
deleteInvoice,
|
|
12
|
-
addLineItem,
|
|
13
|
-
removeLineItem,
|
|
14
|
-
recordPayment,
|
|
15
|
-
getInvoiceSummary,
|
|
16
|
-
} from "../db/invoices.js";
|
|
17
|
-
import {
|
|
18
|
-
createClient,
|
|
19
|
-
listClients,
|
|
20
|
-
updateClient,
|
|
21
|
-
deleteClient,
|
|
22
|
-
} from "../db/clients.js";
|
|
23
|
-
|
|
24
|
-
const server = new McpServer({
|
|
25
|
-
name: "microservice-invoices",
|
|
26
|
-
version: "0.0.1",
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
// --- Invoices ---
|
|
30
|
-
|
|
31
|
-
server.registerTool(
|
|
32
|
-
"create_invoice",
|
|
33
|
-
{
|
|
34
|
-
title: "Create Invoice",
|
|
35
|
-
description: "Create a new invoice.",
|
|
36
|
-
inputSchema: {
|
|
37
|
-
client_id: z.string().optional(),
|
|
38
|
-
due_date: z.string().optional(),
|
|
39
|
-
currency: z.string().optional(),
|
|
40
|
-
tax_rate: z.number().optional(),
|
|
41
|
-
discount: z.number().optional(),
|
|
42
|
-
notes: z.string().optional(),
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
async (params) => {
|
|
46
|
-
const invoice = createInvoice(params);
|
|
47
|
-
return { content: [{ type: "text", text: JSON.stringify(invoice, null, 2) }] };
|
|
48
|
-
}
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
server.registerTool(
|
|
52
|
-
"get_invoice",
|
|
53
|
-
{
|
|
54
|
-
title: "Get Invoice",
|
|
55
|
-
description: "Get an invoice with line items and payments.",
|
|
56
|
-
inputSchema: { id: z.string() },
|
|
57
|
-
},
|
|
58
|
-
async ({ id }) => {
|
|
59
|
-
const invoice = getInvoiceWithItems(id);
|
|
60
|
-
if (!invoice) {
|
|
61
|
-
return { content: [{ type: "text", text: `Invoice '${id}' not found.` }], isError: true };
|
|
62
|
-
}
|
|
63
|
-
return { content: [{ type: "text", text: JSON.stringify(invoice, null, 2) }] };
|
|
64
|
-
}
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
server.registerTool(
|
|
68
|
-
"list_invoices",
|
|
69
|
-
{
|
|
70
|
-
title: "List Invoices",
|
|
71
|
-
description: "List invoices with optional filters.",
|
|
72
|
-
inputSchema: {
|
|
73
|
-
status: z.string().optional(),
|
|
74
|
-
client_id: z.string().optional(),
|
|
75
|
-
from_date: z.string().optional(),
|
|
76
|
-
to_date: z.string().optional(),
|
|
77
|
-
limit: z.number().optional(),
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
async (params) => {
|
|
81
|
-
const invoices = listInvoices(params);
|
|
82
|
-
return {
|
|
83
|
-
content: [{ type: "text", text: JSON.stringify({ invoices, count: invoices.length }, null, 2) }],
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
);
|
|
87
|
-
|
|
88
|
-
server.registerTool(
|
|
89
|
-
"update_invoice_status",
|
|
90
|
-
{
|
|
91
|
-
title: "Update Invoice Status",
|
|
92
|
-
description: "Change invoice status (draft, sent, paid, overdue, cancelled, refunded).",
|
|
93
|
-
inputSchema: {
|
|
94
|
-
id: z.string(),
|
|
95
|
-
status: z.enum(["draft", "sent", "paid", "overdue", "cancelled", "refunded"]),
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
async ({ id, status }) => {
|
|
99
|
-
const invoice = updateInvoiceStatus(id, status);
|
|
100
|
-
if (!invoice) {
|
|
101
|
-
return { content: [{ type: "text", text: `Invoice '${id}' not found.` }], isError: true };
|
|
102
|
-
}
|
|
103
|
-
return { content: [{ type: "text", text: JSON.stringify(invoice, null, 2) }] };
|
|
104
|
-
}
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
server.registerTool(
|
|
108
|
-
"delete_invoice",
|
|
109
|
-
{
|
|
110
|
-
title: "Delete Invoice",
|
|
111
|
-
description: "Delete an invoice.",
|
|
112
|
-
inputSchema: { id: z.string() },
|
|
113
|
-
},
|
|
114
|
-
async ({ id }) => {
|
|
115
|
-
const deleted = deleteInvoice(id);
|
|
116
|
-
return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
|
|
117
|
-
}
|
|
118
|
-
);
|
|
119
|
-
|
|
120
|
-
server.registerTool(
|
|
121
|
-
"add_line_item",
|
|
122
|
-
{
|
|
123
|
-
title: "Add Line Item",
|
|
124
|
-
description: "Add a line item to an invoice. Recalculates totals automatically.",
|
|
125
|
-
inputSchema: {
|
|
126
|
-
invoice_id: z.string(),
|
|
127
|
-
description: z.string(),
|
|
128
|
-
unit_price: z.number(),
|
|
129
|
-
quantity: z.number().optional(),
|
|
130
|
-
},
|
|
131
|
-
},
|
|
132
|
-
async (params) => {
|
|
133
|
-
const item = addLineItem(params);
|
|
134
|
-
return { content: [{ type: "text", text: JSON.stringify(item, null, 2) }] };
|
|
135
|
-
}
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
server.registerTool(
|
|
139
|
-
"remove_line_item",
|
|
140
|
-
{
|
|
141
|
-
title: "Remove Line Item",
|
|
142
|
-
description: "Remove a line item. Recalculates totals.",
|
|
143
|
-
inputSchema: { id: z.string() },
|
|
144
|
-
},
|
|
145
|
-
async ({ id }) => {
|
|
146
|
-
const removed = removeLineItem(id);
|
|
147
|
-
return { content: [{ type: "text", text: JSON.stringify({ id, removed }) }] };
|
|
148
|
-
}
|
|
149
|
-
);
|
|
150
|
-
|
|
151
|
-
server.registerTool(
|
|
152
|
-
"record_payment",
|
|
153
|
-
{
|
|
154
|
-
title: "Record Payment",
|
|
155
|
-
description: "Record a payment against an invoice. Auto-marks as paid when fully paid.",
|
|
156
|
-
inputSchema: {
|
|
157
|
-
invoice_id: z.string(),
|
|
158
|
-
amount: z.number(),
|
|
159
|
-
method: z.string().optional(),
|
|
160
|
-
reference: z.string().optional(),
|
|
161
|
-
notes: z.string().optional(),
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
async (params) => {
|
|
165
|
-
const payment = recordPayment(params);
|
|
166
|
-
return { content: [{ type: "text", text: JSON.stringify(payment, null, 2) }] };
|
|
167
|
-
}
|
|
168
|
-
);
|
|
169
|
-
|
|
170
|
-
server.registerTool(
|
|
171
|
-
"invoice_summary",
|
|
172
|
-
{
|
|
173
|
-
title: "Invoice Summary",
|
|
174
|
-
description: "Get summary statistics for all invoices.",
|
|
175
|
-
inputSchema: {},
|
|
176
|
-
},
|
|
177
|
-
async () => {
|
|
178
|
-
const summary = getInvoiceSummary();
|
|
179
|
-
return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
|
|
180
|
-
}
|
|
181
|
-
);
|
|
182
|
-
|
|
183
|
-
// --- Clients ---
|
|
184
|
-
|
|
185
|
-
server.registerTool(
|
|
186
|
-
"create_client",
|
|
187
|
-
{
|
|
188
|
-
title: "Create Client",
|
|
189
|
-
description: "Create a new client for invoicing.",
|
|
190
|
-
inputSchema: {
|
|
191
|
-
name: z.string(),
|
|
192
|
-
email: z.string().optional(),
|
|
193
|
-
phone: z.string().optional(),
|
|
194
|
-
address: z.string().optional(),
|
|
195
|
-
tax_id: z.string().optional(),
|
|
196
|
-
},
|
|
197
|
-
},
|
|
198
|
-
async (params) => {
|
|
199
|
-
const client = createClient(params);
|
|
200
|
-
return { content: [{ type: "text", text: JSON.stringify(client, null, 2) }] };
|
|
201
|
-
}
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
server.registerTool(
|
|
205
|
-
"list_clients",
|
|
206
|
-
{
|
|
207
|
-
title: "List Clients",
|
|
208
|
-
description: "List all clients.",
|
|
209
|
-
inputSchema: { search: z.string().optional() },
|
|
210
|
-
},
|
|
211
|
-
async ({ search }) => {
|
|
212
|
-
const clients = listClients(search);
|
|
213
|
-
return {
|
|
214
|
-
content: [{ type: "text", text: JSON.stringify({ clients, count: clients.length }, null, 2) }],
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
server.registerTool(
|
|
220
|
-
"delete_client",
|
|
221
|
-
{
|
|
222
|
-
title: "Delete Client",
|
|
223
|
-
description: "Delete a client.",
|
|
224
|
-
inputSchema: { id: z.string() },
|
|
225
|
-
},
|
|
226
|
-
async ({ id }) => {
|
|
227
|
-
const deleted = deleteClient(id);
|
|
228
|
-
return { content: [{ type: "text", text: JSON.stringify({ id, deleted }) }] };
|
|
229
|
-
}
|
|
230
|
-
);
|
|
231
|
-
|
|
232
|
-
// --- Start ---
|
|
233
|
-
async function main() {
|
|
234
|
-
const transport = new StdioServerTransport();
|
|
235
|
-
await server.connect(transport);
|
|
236
|
-
console.error("microservice-invoices MCP server running on stdio");
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
main().catch((error) => {
|
|
240
|
-
console.error("Fatal error:", error);
|
|
241
|
-
process.exit(1);
|
|
242
|
-
});
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bun
|
|
2
|
-
/**
|
|
3
|
-
* HTTP server for microservice-invoices
|
|
4
|
-
* Serves REST API + dashboard
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { existsSync } from "node:fs";
|
|
8
|
-
import { join, dirname } from "node:path";
|
|
9
|
-
import { fileURLToPath } from "node:url";
|
|
10
|
-
import {
|
|
11
|
-
createInvoice,
|
|
12
|
-
getInvoice,
|
|
13
|
-
getInvoiceWithItems,
|
|
14
|
-
listInvoices,
|
|
15
|
-
updateInvoiceStatus,
|
|
16
|
-
deleteInvoice,
|
|
17
|
-
addLineItem,
|
|
18
|
-
removeLineItem,
|
|
19
|
-
recordPayment,
|
|
20
|
-
getInvoiceSummary,
|
|
21
|
-
} from "../db/invoices.js";
|
|
22
|
-
import { createClient, getClient, listClients, updateClient, deleteClient } from "../db/clients.js";
|
|
23
|
-
import {
|
|
24
|
-
createBusinessProfile,
|
|
25
|
-
listBusinessProfiles,
|
|
26
|
-
getTaxRulesForCountry,
|
|
27
|
-
listAllTaxRules,
|
|
28
|
-
determineTax,
|
|
29
|
-
} from "../db/business.js";
|
|
30
|
-
|
|
31
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
32
|
-
const PORT = parseInt(process.env["PORT"] || "19500");
|
|
33
|
-
|
|
34
|
-
// Resolve dashboard dist
|
|
35
|
-
const dashboardDir = join(__dirname, "..", "..", "dashboard", "dist");
|
|
36
|
-
const hasDashboard = existsSync(dashboardDir);
|
|
37
|
-
|
|
38
|
-
function json(data: unknown, status = 200) {
|
|
39
|
-
return new Response(JSON.stringify(data), {
|
|
40
|
-
status,
|
|
41
|
-
headers: { "Content-Type": "application/json" },
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async function parseBody(req: Request) {
|
|
46
|
-
try {
|
|
47
|
-
return await req.json();
|
|
48
|
-
} catch {
|
|
49
|
-
return {};
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const server = Bun.serve({
|
|
54
|
-
port: PORT,
|
|
55
|
-
async fetch(req) {
|
|
56
|
-
const url = new URL(req.url);
|
|
57
|
-
const path = url.pathname;
|
|
58
|
-
const method = req.method;
|
|
59
|
-
|
|
60
|
-
// --- API Routes ---
|
|
61
|
-
|
|
62
|
-
// Invoices
|
|
63
|
-
if (path === "/api/invoices" && method === "GET") {
|
|
64
|
-
const status = url.searchParams.get("status") || undefined;
|
|
65
|
-
const client_id = url.searchParams.get("client_id") || undefined;
|
|
66
|
-
return json(listInvoices({ status, client_id }));
|
|
67
|
-
}
|
|
68
|
-
if (path === "/api/invoices" && method === "POST") {
|
|
69
|
-
const body = await parseBody(req);
|
|
70
|
-
return json(createInvoice(body), 201);
|
|
71
|
-
}
|
|
72
|
-
if (path === "/api/invoices/summary" && method === "GET") {
|
|
73
|
-
return json(getInvoiceSummary());
|
|
74
|
-
}
|
|
75
|
-
if (path.match(/^\/api\/invoices\/([^/]+)$/) && method === "GET") {
|
|
76
|
-
const id = path.split("/")[3];
|
|
77
|
-
const inv = getInvoiceWithItems(id);
|
|
78
|
-
return inv ? json(inv) : json({ error: "Not found" }, 404);
|
|
79
|
-
}
|
|
80
|
-
if (path.match(/^\/api\/invoices\/([^/]+)$/) && method === "DELETE") {
|
|
81
|
-
const id = path.split("/")[3];
|
|
82
|
-
return json({ deleted: deleteInvoice(id) });
|
|
83
|
-
}
|
|
84
|
-
if (path.match(/^\/api\/invoices\/([^/]+)\/status$/) && method === "PATCH") {
|
|
85
|
-
const id = path.split("/")[3];
|
|
86
|
-
const { status } = await parseBody(req);
|
|
87
|
-
const inv = updateInvoiceStatus(id, status);
|
|
88
|
-
return inv ? json(inv) : json({ error: "Not found" }, 404);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Line items
|
|
92
|
-
if (path === "/api/line-items" && method === "POST") {
|
|
93
|
-
const body = await parseBody(req);
|
|
94
|
-
return json(addLineItem(body), 201);
|
|
95
|
-
}
|
|
96
|
-
if (path.match(/^\/api\/line-items\/([^/]+)$/) && method === "DELETE") {
|
|
97
|
-
const id = path.split("/")[3];
|
|
98
|
-
return json({ deleted: removeLineItem(id) });
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// Payments
|
|
102
|
-
if (path === "/api/payments" && method === "POST") {
|
|
103
|
-
const body = await parseBody(req);
|
|
104
|
-
return json(recordPayment(body), 201);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Clients
|
|
108
|
-
if (path === "/api/clients" && method === "GET") {
|
|
109
|
-
return json(listClients(url.searchParams.get("search") || undefined));
|
|
110
|
-
}
|
|
111
|
-
if (path === "/api/clients" && method === "POST") {
|
|
112
|
-
const body = await parseBody(req);
|
|
113
|
-
return json(createClient(body), 201);
|
|
114
|
-
}
|
|
115
|
-
if (path.match(/^\/api\/clients\/([^/]+)$/) && method === "GET") {
|
|
116
|
-
const id = path.split("/")[3];
|
|
117
|
-
const cl = getClient(id);
|
|
118
|
-
return cl ? json(cl) : json({ error: "Not found" }, 404);
|
|
119
|
-
}
|
|
120
|
-
if (path.match(/^\/api\/clients\/([^/]+)$/) && method === "DELETE") {
|
|
121
|
-
const id = path.split("/")[3];
|
|
122
|
-
return json({ deleted: deleteClient(id) });
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Business profiles
|
|
126
|
-
if (path === "/api/business-profiles" && method === "GET") {
|
|
127
|
-
return json(listBusinessProfiles());
|
|
128
|
-
}
|
|
129
|
-
if (path === "/api/business-profiles" && method === "POST") {
|
|
130
|
-
const body = await parseBody(req);
|
|
131
|
-
return json(createBusinessProfile(body), 201);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Tax rules
|
|
135
|
-
if (path === "/api/tax-rules" && method === "GET") {
|
|
136
|
-
const country = url.searchParams.get("country");
|
|
137
|
-
return json(country ? getTaxRulesForCountry(country) : listAllTaxRules());
|
|
138
|
-
}
|
|
139
|
-
if (path === "/api/tax/determine" && method === "POST") {
|
|
140
|
-
const { issuer_country, client_country, client_vat_number } = await parseBody(req);
|
|
141
|
-
return json(determineTax(issuer_country, client_country, client_vat_number));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
// Health
|
|
145
|
-
if (path === "/health") {
|
|
146
|
-
return json({ status: "ok", service: "microservice-invoices" });
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// --- Dashboard (static files) ---
|
|
150
|
-
if (hasDashboard) {
|
|
151
|
-
let filePath = join(dashboardDir, path === "/" ? "index.html" : path);
|
|
152
|
-
if (!existsSync(filePath)) {
|
|
153
|
-
filePath = join(dashboardDir, "index.html"); // SPA fallback
|
|
154
|
-
}
|
|
155
|
-
return new Response(Bun.file(filePath));
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return json({ error: "Not found" }, 404);
|
|
159
|
-
},
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
console.log(`microservice-invoices server running on http://localhost:${PORT}`);
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@hasna/microservice-leads",
|
|
3
|
-
"version": "0.0.1",
|
|
4
|
-
"description": "Lead generation, storage, scoring, and data enrichment microservice for AI agents",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
"microservice-leads": "./src/cli/index.ts",
|
|
8
|
-
"microservice-leads-mcp": "./src/mcp/index.ts"
|
|
9
|
-
},
|
|
10
|
-
"exports": {
|
|
11
|
-
".": "./src/index.ts"
|
|
12
|
-
},
|
|
13
|
-
"scripts": {
|
|
14
|
-
"dev": "bun run ./src/cli/index.ts",
|
|
15
|
-
"test": "bun test"
|
|
16
|
-
},
|
|
17
|
-
"dependencies": {
|
|
18
|
-
"@hasna/cloud": "^0.1.24",
|
|
19
|
-
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
20
|
-
"commander": "^12.1.0",
|
|
21
|
-
"zod": "^3.24.0"
|
|
22
|
-
},
|
|
23
|
-
"license": "Apache-2.0",
|
|
24
|
-
"publishConfig": {
|
|
25
|
-
"registry": "https://registry.npmjs.org",
|
|
26
|
-
"access": "public"
|
|
27
|
-
}
|
|
28
|
-
}
|