@hasna/microservices 0.0.16 → 0.0.17
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 +711 -13998
- package/bin/mcp.js +228 -10987
- package/dist/index.js +166 -10056
- package/package.json +25 -25
- 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,74 +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 projects (
|
|
13
|
-
id TEXT PRIMARY KEY,
|
|
14
|
-
name TEXT NOT NULL,
|
|
15
|
-
client TEXT,
|
|
16
|
-
hourly_rate REAL NOT NULL DEFAULT 0,
|
|
17
|
-
budget_hours REAL NOT NULL DEFAULT 0,
|
|
18
|
-
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'completed', 'archived')),
|
|
19
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
20
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
CREATE TABLE IF NOT EXISTS time_entries (
|
|
24
|
-
id TEXT PRIMARY KEY,
|
|
25
|
-
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
|
26
|
-
description TEXT NOT NULL,
|
|
27
|
-
date TEXT NOT NULL DEFAULT (date('now')),
|
|
28
|
-
hours REAL NOT NULL DEFAULT 0,
|
|
29
|
-
billable INTEGER NOT NULL DEFAULT 1,
|
|
30
|
-
tags TEXT NOT NULL DEFAULT '[]',
|
|
31
|
-
metadata TEXT NOT NULL DEFAULT '{}',
|
|
32
|
-
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
33
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
CREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);
|
|
37
|
-
CREATE INDEX IF NOT EXISTS idx_projects_client ON projects(client);
|
|
38
|
-
CREATE INDEX IF NOT EXISTS idx_projects_name ON projects(name);
|
|
39
|
-
CREATE INDEX IF NOT EXISTS idx_time_entries_project ON time_entries(project_id);
|
|
40
|
-
CREATE INDEX IF NOT EXISTS idx_time_entries_date ON time_entries(date);
|
|
41
|
-
CREATE INDEX IF NOT EXISTS idx_time_entries_billable ON time_entries(billable);
|
|
42
|
-
`,
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
id: 2,
|
|
46
|
-
name: "locale_and_overtime",
|
|
47
|
-
sql: `
|
|
48
|
-
-- Add locale/currency support to projects
|
|
49
|
-
ALTER TABLE projects ADD COLUMN currency TEXT NOT NULL DEFAULT 'USD';
|
|
50
|
-
ALTER TABLE projects ADD COLUMN country TEXT NOT NULL DEFAULT 'US';
|
|
51
|
-
ALTER TABLE projects ADD COLUMN overtime_rate_multiplier REAL NOT NULL DEFAULT 1.5;
|
|
52
|
-
ALTER TABLE projects ADD COLUMN max_daily_hours REAL NOT NULL DEFAULT 8;
|
|
53
|
-
ALTER TABLE projects ADD COLUMN max_weekly_hours REAL NOT NULL DEFAULT 40;
|
|
54
|
-
|
|
55
|
-
-- Add overtime tracking to time entries
|
|
56
|
-
ALTER TABLE time_entries ADD COLUMN overtime INTEGER NOT NULL DEFAULT 0;
|
|
57
|
-
|
|
58
|
-
-- Settings table for global locale preferences
|
|
59
|
-
CREATE TABLE IF NOT EXISTS settings (
|
|
60
|
-
key TEXT PRIMARY KEY,
|
|
61
|
-
value TEXT NOT NULL,
|
|
62
|
-
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
63
|
-
);
|
|
64
|
-
|
|
65
|
-
-- Seed default settings
|
|
66
|
-
INSERT OR IGNORE INTO settings (key, value) VALUES
|
|
67
|
-
('locale', 'en-US'),
|
|
68
|
-
('default_currency', 'USD'),
|
|
69
|
-
('default_country', 'US'),
|
|
70
|
-
('date_format', 'YYYY-MM-DD'),
|
|
71
|
-
('week_start', 'monday');
|
|
72
|
-
`,
|
|
73
|
-
},
|
|
74
|
-
];
|
|
@@ -1,447 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Timesheet CRUD operations — projects and time entries
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { getDatabase } from "./database.js";
|
|
6
|
-
|
|
7
|
-
// --- Project Types ---
|
|
8
|
-
|
|
9
|
-
export interface Project {
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
client: string | null;
|
|
13
|
-
hourly_rate: number;
|
|
14
|
-
budget_hours: number;
|
|
15
|
-
status: "active" | "completed" | "archived";
|
|
16
|
-
created_at: string;
|
|
17
|
-
updated_at: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export interface CreateProjectInput {
|
|
21
|
-
name: string;
|
|
22
|
-
client?: string;
|
|
23
|
-
hourly_rate?: number;
|
|
24
|
-
budget_hours?: number;
|
|
25
|
-
status?: "active" | "completed" | "archived";
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface UpdateProjectInput {
|
|
29
|
-
name?: string;
|
|
30
|
-
client?: string | null;
|
|
31
|
-
hourly_rate?: number;
|
|
32
|
-
budget_hours?: number;
|
|
33
|
-
status?: "active" | "completed" | "archived";
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface ListProjectsOptions {
|
|
37
|
-
status?: string;
|
|
38
|
-
client?: string;
|
|
39
|
-
limit?: number;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// --- Time Entry Types ---
|
|
43
|
-
|
|
44
|
-
export interface TimeEntry {
|
|
45
|
-
id: string;
|
|
46
|
-
project_id: string;
|
|
47
|
-
description: string;
|
|
48
|
-
date: string;
|
|
49
|
-
hours: number;
|
|
50
|
-
billable: boolean;
|
|
51
|
-
tags: string[];
|
|
52
|
-
metadata: Record<string, unknown>;
|
|
53
|
-
created_at: string;
|
|
54
|
-
updated_at: string;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
interface TimeEntryRow {
|
|
58
|
-
id: string;
|
|
59
|
-
project_id: string;
|
|
60
|
-
description: string;
|
|
61
|
-
date: string;
|
|
62
|
-
hours: number;
|
|
63
|
-
billable: number;
|
|
64
|
-
tags: string;
|
|
65
|
-
metadata: string;
|
|
66
|
-
created_at: string;
|
|
67
|
-
updated_at: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function rowToEntry(row: TimeEntryRow): TimeEntry {
|
|
71
|
-
return {
|
|
72
|
-
...row,
|
|
73
|
-
billable: row.billable === 1,
|
|
74
|
-
tags: JSON.parse(row.tags || "[]"),
|
|
75
|
-
metadata: JSON.parse(row.metadata || "{}"),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export interface LogTimeInput {
|
|
80
|
-
project_id: string;
|
|
81
|
-
description: string;
|
|
82
|
-
date?: string;
|
|
83
|
-
hours: number;
|
|
84
|
-
billable?: boolean;
|
|
85
|
-
tags?: string[];
|
|
86
|
-
metadata?: Record<string, unknown>;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export interface UpdateEntryInput {
|
|
90
|
-
project_id?: string;
|
|
91
|
-
description?: string;
|
|
92
|
-
date?: string;
|
|
93
|
-
hours?: number;
|
|
94
|
-
billable?: boolean;
|
|
95
|
-
tags?: string[];
|
|
96
|
-
metadata?: Record<string, unknown>;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export interface ListEntriesOptions {
|
|
100
|
-
project_id?: string;
|
|
101
|
-
from_date?: string;
|
|
102
|
-
to_date?: string;
|
|
103
|
-
billable?: boolean;
|
|
104
|
-
limit?: number;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// --- Project Summary Types ---
|
|
108
|
-
|
|
109
|
-
export interface ProjectSummary {
|
|
110
|
-
project_id: string;
|
|
111
|
-
project_name: string;
|
|
112
|
-
client: string | null;
|
|
113
|
-
hourly_rate: number;
|
|
114
|
-
budget_hours: number;
|
|
115
|
-
total_hours: number;
|
|
116
|
-
billable_hours: number;
|
|
117
|
-
non_billable_hours: number;
|
|
118
|
-
total_value: number;
|
|
119
|
-
budget_remaining: number;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export interface WeeklySummary {
|
|
123
|
-
week_start: string;
|
|
124
|
-
days: { date: string; hours: number; entries: number }[];
|
|
125
|
-
total_hours: number;
|
|
126
|
-
total_entries: number;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export interface ClientSummary {
|
|
130
|
-
client: string;
|
|
131
|
-
projects: number;
|
|
132
|
-
total_hours: number;
|
|
133
|
-
billable_hours: number;
|
|
134
|
-
total_value: number;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
// --- Project CRUD ---
|
|
138
|
-
|
|
139
|
-
export function createProject(input: CreateProjectInput): Project {
|
|
140
|
-
const db = getDatabase();
|
|
141
|
-
const id = crypto.randomUUID();
|
|
142
|
-
|
|
143
|
-
db.prepare(
|
|
144
|
-
`INSERT INTO projects (id, name, client, hourly_rate, budget_hours, status)
|
|
145
|
-
VALUES (?, ?, ?, ?, ?, ?)`
|
|
146
|
-
).run(
|
|
147
|
-
id,
|
|
148
|
-
input.name,
|
|
149
|
-
input.client || null,
|
|
150
|
-
input.hourly_rate || 0,
|
|
151
|
-
input.budget_hours || 0,
|
|
152
|
-
input.status || "active"
|
|
153
|
-
);
|
|
154
|
-
|
|
155
|
-
return getProject(id)!;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export function getProject(id: string): Project | null {
|
|
159
|
-
const db = getDatabase();
|
|
160
|
-
const row = db.prepare("SELECT * FROM projects WHERE id = ?").get(id) as Project | null;
|
|
161
|
-
return row || null;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
export function listProjects(options: ListProjectsOptions = {}): Project[] {
|
|
165
|
-
const db = getDatabase();
|
|
166
|
-
const conditions: string[] = [];
|
|
167
|
-
const params: unknown[] = [];
|
|
168
|
-
|
|
169
|
-
if (options.status) {
|
|
170
|
-
conditions.push("status = ?");
|
|
171
|
-
params.push(options.status);
|
|
172
|
-
}
|
|
173
|
-
if (options.client) {
|
|
174
|
-
conditions.push("client = ?");
|
|
175
|
-
params.push(options.client);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
let sql = "SELECT * FROM projects";
|
|
179
|
-
if (conditions.length > 0) {
|
|
180
|
-
sql += " WHERE " + conditions.join(" AND ");
|
|
181
|
-
}
|
|
182
|
-
sql += " ORDER BY name";
|
|
183
|
-
|
|
184
|
-
if (options.limit) {
|
|
185
|
-
sql += " LIMIT ?";
|
|
186
|
-
params.push(options.limit);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return db.prepare(sql).all(...params) as Project[];
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export function updateProject(id: string, input: UpdateProjectInput): Project | null {
|
|
193
|
-
const db = getDatabase();
|
|
194
|
-
const existing = getProject(id);
|
|
195
|
-
if (!existing) return null;
|
|
196
|
-
|
|
197
|
-
const sets: string[] = [];
|
|
198
|
-
const params: unknown[] = [];
|
|
199
|
-
|
|
200
|
-
if (input.name !== undefined) {
|
|
201
|
-
sets.push("name = ?");
|
|
202
|
-
params.push(input.name);
|
|
203
|
-
}
|
|
204
|
-
if (input.client !== undefined) {
|
|
205
|
-
sets.push("client = ?");
|
|
206
|
-
params.push(input.client);
|
|
207
|
-
}
|
|
208
|
-
if (input.hourly_rate !== undefined) {
|
|
209
|
-
sets.push("hourly_rate = ?");
|
|
210
|
-
params.push(input.hourly_rate);
|
|
211
|
-
}
|
|
212
|
-
if (input.budget_hours !== undefined) {
|
|
213
|
-
sets.push("budget_hours = ?");
|
|
214
|
-
params.push(input.budget_hours);
|
|
215
|
-
}
|
|
216
|
-
if (input.status !== undefined) {
|
|
217
|
-
sets.push("status = ?");
|
|
218
|
-
params.push(input.status);
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
if (sets.length === 0) return existing;
|
|
222
|
-
|
|
223
|
-
sets.push("updated_at = datetime('now')");
|
|
224
|
-
params.push(id);
|
|
225
|
-
|
|
226
|
-
db.prepare(
|
|
227
|
-
`UPDATE projects SET ${sets.join(", ")} WHERE id = ?`
|
|
228
|
-
).run(...params);
|
|
229
|
-
|
|
230
|
-
return getProject(id);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export function deleteProject(id: string): boolean {
|
|
234
|
-
const db = getDatabase();
|
|
235
|
-
return db.prepare("DELETE FROM projects WHERE id = ?").run(id).changes > 0;
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
// --- Time Entry CRUD ---
|
|
239
|
-
|
|
240
|
-
export function logTime(input: LogTimeInput): TimeEntry {
|
|
241
|
-
const db = getDatabase();
|
|
242
|
-
const id = crypto.randomUUID();
|
|
243
|
-
const tags = JSON.stringify(input.tags || []);
|
|
244
|
-
const metadata = JSON.stringify(input.metadata || {});
|
|
245
|
-
|
|
246
|
-
db.prepare(
|
|
247
|
-
`INSERT INTO time_entries (id, project_id, description, date, hours, billable, tags, metadata)
|
|
248
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`
|
|
249
|
-
).run(
|
|
250
|
-
id,
|
|
251
|
-
input.project_id,
|
|
252
|
-
input.description,
|
|
253
|
-
input.date || new Date().toISOString().split("T")[0],
|
|
254
|
-
input.hours,
|
|
255
|
-
input.billable !== false ? 1 : 0,
|
|
256
|
-
tags,
|
|
257
|
-
metadata
|
|
258
|
-
);
|
|
259
|
-
|
|
260
|
-
return getEntry(id)!;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
export function getEntry(id: string): TimeEntry | null {
|
|
264
|
-
const db = getDatabase();
|
|
265
|
-
const row = db.prepare("SELECT * FROM time_entries WHERE id = ?").get(id) as TimeEntryRow | null;
|
|
266
|
-
return row ? rowToEntry(row) : null;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
export function listEntries(options: ListEntriesOptions = {}): TimeEntry[] {
|
|
270
|
-
const db = getDatabase();
|
|
271
|
-
const conditions: string[] = [];
|
|
272
|
-
const params: unknown[] = [];
|
|
273
|
-
|
|
274
|
-
if (options.project_id) {
|
|
275
|
-
conditions.push("project_id = ?");
|
|
276
|
-
params.push(options.project_id);
|
|
277
|
-
}
|
|
278
|
-
if (options.from_date) {
|
|
279
|
-
conditions.push("date >= ?");
|
|
280
|
-
params.push(options.from_date);
|
|
281
|
-
}
|
|
282
|
-
if (options.to_date) {
|
|
283
|
-
conditions.push("date <= ?");
|
|
284
|
-
params.push(options.to_date);
|
|
285
|
-
}
|
|
286
|
-
if (options.billable !== undefined) {
|
|
287
|
-
conditions.push("billable = ?");
|
|
288
|
-
params.push(options.billable ? 1 : 0);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
let sql = "SELECT * FROM time_entries";
|
|
292
|
-
if (conditions.length > 0) {
|
|
293
|
-
sql += " WHERE " + conditions.join(" AND ");
|
|
294
|
-
}
|
|
295
|
-
sql += " ORDER BY date DESC, created_at DESC";
|
|
296
|
-
|
|
297
|
-
if (options.limit) {
|
|
298
|
-
sql += " LIMIT ?";
|
|
299
|
-
params.push(options.limit);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const rows = db.prepare(sql).all(...params) as TimeEntryRow[];
|
|
303
|
-
return rows.map(rowToEntry);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
export function updateEntry(id: string, input: UpdateEntryInput): TimeEntry | null {
|
|
307
|
-
const db = getDatabase();
|
|
308
|
-
const existing = getEntry(id);
|
|
309
|
-
if (!existing) return null;
|
|
310
|
-
|
|
311
|
-
const sets: string[] = [];
|
|
312
|
-
const params: unknown[] = [];
|
|
313
|
-
|
|
314
|
-
if (input.project_id !== undefined) {
|
|
315
|
-
sets.push("project_id = ?");
|
|
316
|
-
params.push(input.project_id);
|
|
317
|
-
}
|
|
318
|
-
if (input.description !== undefined) {
|
|
319
|
-
sets.push("description = ?");
|
|
320
|
-
params.push(input.description);
|
|
321
|
-
}
|
|
322
|
-
if (input.date !== undefined) {
|
|
323
|
-
sets.push("date = ?");
|
|
324
|
-
params.push(input.date);
|
|
325
|
-
}
|
|
326
|
-
if (input.hours !== undefined) {
|
|
327
|
-
sets.push("hours = ?");
|
|
328
|
-
params.push(input.hours);
|
|
329
|
-
}
|
|
330
|
-
if (input.billable !== undefined) {
|
|
331
|
-
sets.push("billable = ?");
|
|
332
|
-
params.push(input.billable ? 1 : 0);
|
|
333
|
-
}
|
|
334
|
-
if (input.tags !== undefined) {
|
|
335
|
-
sets.push("tags = ?");
|
|
336
|
-
params.push(JSON.stringify(input.tags));
|
|
337
|
-
}
|
|
338
|
-
if (input.metadata !== undefined) {
|
|
339
|
-
sets.push("metadata = ?");
|
|
340
|
-
params.push(JSON.stringify(input.metadata));
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
if (sets.length === 0) return existing;
|
|
344
|
-
|
|
345
|
-
sets.push("updated_at = datetime('now')");
|
|
346
|
-
params.push(id);
|
|
347
|
-
|
|
348
|
-
db.prepare(
|
|
349
|
-
`UPDATE time_entries SET ${sets.join(", ")} WHERE id = ?`
|
|
350
|
-
).run(...params);
|
|
351
|
-
|
|
352
|
-
return getEntry(id);
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
export function deleteEntry(id: string): boolean {
|
|
356
|
-
const db = getDatabase();
|
|
357
|
-
return db.prepare("DELETE FROM time_entries WHERE id = ?").run(id).changes > 0;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// --- Summaries ---
|
|
361
|
-
|
|
362
|
-
export function getProjectSummary(projectId: string): ProjectSummary | null {
|
|
363
|
-
const db = getDatabase();
|
|
364
|
-
const project = getProject(projectId);
|
|
365
|
-
if (!project) return null;
|
|
366
|
-
|
|
367
|
-
const row = db
|
|
368
|
-
.prepare(
|
|
369
|
-
`SELECT
|
|
370
|
-
COALESCE(SUM(hours), 0) as total_hours,
|
|
371
|
-
COALESCE(SUM(CASE WHEN billable = 1 THEN hours ELSE 0 END), 0) as billable_hours,
|
|
372
|
-
COALESCE(SUM(CASE WHEN billable = 0 THEN hours ELSE 0 END), 0) as non_billable_hours
|
|
373
|
-
FROM time_entries WHERE project_id = ?`
|
|
374
|
-
)
|
|
375
|
-
.get(projectId) as { total_hours: number; billable_hours: number; non_billable_hours: number };
|
|
376
|
-
|
|
377
|
-
return {
|
|
378
|
-
project_id: project.id,
|
|
379
|
-
project_name: project.name,
|
|
380
|
-
client: project.client,
|
|
381
|
-
hourly_rate: project.hourly_rate,
|
|
382
|
-
budget_hours: project.budget_hours,
|
|
383
|
-
total_hours: row.total_hours,
|
|
384
|
-
billable_hours: row.billable_hours,
|
|
385
|
-
non_billable_hours: row.non_billable_hours,
|
|
386
|
-
total_value: row.billable_hours * project.hourly_rate,
|
|
387
|
-
budget_remaining: project.budget_hours > 0 ? project.budget_hours - row.total_hours : 0,
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
export function getWeeklySummary(weekStart: string): WeeklySummary {
|
|
392
|
-
const db = getDatabase();
|
|
393
|
-
|
|
394
|
-
// Calculate week end (6 days after start)
|
|
395
|
-
const start = new Date(weekStart);
|
|
396
|
-
const days: { date: string; hours: number; entries: number }[] = [];
|
|
397
|
-
|
|
398
|
-
let totalHours = 0;
|
|
399
|
-
let totalEntries = 0;
|
|
400
|
-
|
|
401
|
-
for (let i = 0; i < 7; i++) {
|
|
402
|
-
const d = new Date(start);
|
|
403
|
-
d.setDate(d.getDate() + i);
|
|
404
|
-
const dateStr = d.toISOString().split("T")[0];
|
|
405
|
-
|
|
406
|
-
const row = db
|
|
407
|
-
.prepare(
|
|
408
|
-
`SELECT
|
|
409
|
-
COALESCE(SUM(hours), 0) as hours,
|
|
410
|
-
COUNT(*) as entries
|
|
411
|
-
FROM time_entries WHERE date = ?`
|
|
412
|
-
)
|
|
413
|
-
.get(dateStr) as { hours: number; entries: number };
|
|
414
|
-
|
|
415
|
-
days.push({ date: dateStr, hours: row.hours, entries: row.entries });
|
|
416
|
-
totalHours += row.hours;
|
|
417
|
-
totalEntries += row.entries;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
return {
|
|
421
|
-
week_start: weekStart,
|
|
422
|
-
days,
|
|
423
|
-
total_hours: totalHours,
|
|
424
|
-
total_entries: totalEntries,
|
|
425
|
-
};
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
export function getClientSummary(): ClientSummary[] {
|
|
429
|
-
const db = getDatabase();
|
|
430
|
-
|
|
431
|
-
const rows = db
|
|
432
|
-
.prepare(
|
|
433
|
-
`SELECT
|
|
434
|
-
COALESCE(p.client, 'No Client') as client,
|
|
435
|
-
COUNT(DISTINCT p.id) as projects,
|
|
436
|
-
COALESCE(SUM(te.hours), 0) as total_hours,
|
|
437
|
-
COALESCE(SUM(CASE WHEN te.billable = 1 THEN te.hours ELSE 0 END), 0) as billable_hours,
|
|
438
|
-
COALESCE(SUM(CASE WHEN te.billable = 1 THEN te.hours * p.hourly_rate ELSE 0 END), 0) as total_value
|
|
439
|
-
FROM projects p
|
|
440
|
-
LEFT JOIN time_entries te ON te.project_id = p.id
|
|
441
|
-
GROUP BY COALESCE(p.client, 'No Client')
|
|
442
|
-
ORDER BY total_value DESC`
|
|
443
|
-
)
|
|
444
|
-
.all() as ClientSummary[];
|
|
445
|
-
|
|
446
|
-
return rows;
|
|
447
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* microservice-timesheets — Timesheet management microservice
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export {
|
|
6
|
-
createProject,
|
|
7
|
-
getProject,
|
|
8
|
-
listProjects,
|
|
9
|
-
updateProject,
|
|
10
|
-
deleteProject,
|
|
11
|
-
logTime,
|
|
12
|
-
getEntry,
|
|
13
|
-
listEntries,
|
|
14
|
-
updateEntry,
|
|
15
|
-
deleteEntry,
|
|
16
|
-
getProjectSummary,
|
|
17
|
-
getWeeklySummary,
|
|
18
|
-
getClientSummary,
|
|
19
|
-
type Project,
|
|
20
|
-
type CreateProjectInput,
|
|
21
|
-
type UpdateProjectInput,
|
|
22
|
-
type ListProjectsOptions,
|
|
23
|
-
type TimeEntry,
|
|
24
|
-
type LogTimeInput,
|
|
25
|
-
type UpdateEntryInput,
|
|
26
|
-
type ListEntriesOptions,
|
|
27
|
-
type ProjectSummary,
|
|
28
|
-
type WeeklySummary,
|
|
29
|
-
type ClientSummary,
|
|
30
|
-
} from "./db/timesheets.js";
|
|
31
|
-
|
|
32
|
-
export {
|
|
33
|
-
getCountryDefaults,
|
|
34
|
-
listSupportedCountries,
|
|
35
|
-
getSetting,
|
|
36
|
-
setSetting,
|
|
37
|
-
getAllSettings,
|
|
38
|
-
formatCurrency,
|
|
39
|
-
checkOvertimeStatus,
|
|
40
|
-
COUNTRY_DEFAULTS,
|
|
41
|
-
type CountryDefaults,
|
|
42
|
-
} from "./db/locale.js";
|
|
43
|
-
|
|
44
|
-
export { getDatabase, closeDatabase } from "./db/database.js";
|