untrap-mcp 0.4.16 → 0.4.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/dist/server.js CHANGED
@@ -299,7 +299,7 @@ export function createServer(mspId, scopes = ["all"]) {
299
299
  fromDate: z
300
300
  .string()
301
301
  .optional()
302
- .describe("Start date (YYYY-MM-DD, default: 90 days ago)"),
302
+ .describe("Start date (YYYY-MM-DD, default: 30 days ago)"),
303
303
  toDate: z
304
304
  .string()
305
305
  .optional()
@@ -412,7 +412,7 @@ export function createServer(mspId, scopes = ["all"]) {
412
412
  limit: z.number().optional().describe("Max results (default: 5)"),
413
413
  }, async ({ ticketId, limit }) => wrapTool("find_similar_tickets", mspId, scopes, () => findSimilarTickets(mspId, { ticketId, limit }))());
414
414
  server.tool("analyze_root_causes", "Root cause category breakdown with AI recommendations for the top patterns. Optionally filter to a specific category.", {
415
- fromDate: z.string().optional().describe("Start date (default: 90 days ago)"),
415
+ fromDate: z.string().optional().describe("Start date (default: 30 days ago)"),
416
416
  toDate: z.string().optional().describe("End date (default: today)"),
417
417
  category: z.string().optional().describe("Filter to specific root cause category"),
418
418
  }, async ({ fromDate, toDate, category }) => wrapTool("analyze_root_causes", mspId, scopes, () => analyzeRootCauses(mspId, { fromDate, toDate, category }))());
@@ -505,11 +505,11 @@ RULES: Always use WHERE msp_id = $1. Always add ORDER BY and LIMIT. Use JOINs wi
505
505
  server.tool("get_agent_statuses", "Get the status of all AI agents: last run time, status, duration. Shows which agents are current and which need attention.", {}, async () => wrapTool("get_agent_statuses", mspId, scopes, () => getAgentStatuses(mspId))());
506
506
  // ── CFO / Financial Tools ─────────────────────────────────────
507
507
  server.tool("cfo_financial_overview", "CFO dashboard: total labor cost, utilization rate, cost per ticket, revenue leakage, workforce size. The executive financial snapshot.", {
508
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
508
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
509
509
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
510
510
  }, async ({ fromDate, toDate }) => wrapTool("cfo_financial_overview", mspId, scopes, () => cfoFinancialOverview(mspId, { fromDate, toDate }))());
511
511
  server.tool("cfo_client_profitability", "Cost-to-serve analysis per client: total hours, labor cost, cost per ticket, billable %, agreement coverage. Identifies which clients are profitable vs underwater.", {
512
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
512
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
513
513
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
514
514
  clientName: z.string().describe("Filter to a specific client").optional(),
515
515
  }, async ({ fromDate, toDate, clientName }) => wrapTool("cfo_client_profitability", mspId, scopes, () => cfoClientProfitability(mspId, { fromDate, toDate, clientName }))());
@@ -519,7 +519,7 @@ RULES: Always use WHERE msp_id = $1. Always add ORDER BY and LIMIT. Use JOINs wi
519
519
  technicianName: z.string().describe("Filter to a specific technician").optional(),
520
520
  }, async ({ fromDate, toDate, technicianName }) => wrapTool("cfo_technician_utilization", mspId, scopes, () => cfoTechnicianUtilization(mspId, { fromDate, toDate, technicianName }))());
521
521
  server.tool("cfo_revenue_leakage", "Identifies money left on the table: out-of-scope work not billed, agreement mismatches, work type breakdown. Shows exactly where revenue is leaking.", {
522
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
522
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
523
523
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
524
524
  }, async ({ fromDate, toDate }) => wrapTool("cfo_revenue_leakage", mspId, scopes, () => cfoRevenuLeakage(mspId, { fromDate, toDate }))());
525
525
  server.tool("cfo_labor_cost_trend", "Month-over-month labor cost trends: total cost, hours, utilization, headcount. Includes breakdown by department and work type. Shows where costs are growing.", {
@@ -527,14 +527,14 @@ RULES: Always use WHERE msp_id = $1. Always add ORDER BY and LIMIT. Use JOINs wi
527
527
  }, async ({ months }) => wrapTool("cfo_labor_cost_trend", mspId, scopes, () => cfoLaborCostTrend(mspId, { months }))());
528
528
  server.tool("cfo_agreement_analysis", "Agreement portfolio analysis: types, active counts, clients WITHOUT agreements (billing risk), prepaid block amounts. Identifies coverage gaps.", {}, async () => wrapTool("cfo_agreement_analysis", mspId, scopes, () => cfoAgreementAnalysis(mspId))());
529
529
  server.tool("cfo_service_cost_analysis", "AI-powered service cost analysis: cost breakdown by technician tier (L1/L2/L3), most expensive tickets, and AI recommendations for profitability improvement.", {
530
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
530
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
531
531
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
532
532
  }, async ({ fromDate, toDate }) => wrapTool("cfo_service_cost_analysis", mspId, scopes, () => cfoServiceCostAnalysis(mspId, { fromDate, toDate }))());
533
533
  server.tool("cfo_portfolio_summary", "Executive portfolio summary: total revenue (service + product), labor cost, service margin %, estimated MRR from agreements, client/technician counts. Supports periods: last_month, last_quarter, ytd, trailing_12m.", {
534
534
  period: z.enum(["last_month", "last_quarter", "ytd", "trailing_12m"]).describe("Time period").optional(),
535
535
  }, async ({ period }) => wrapTool("cfo_portfolio_summary", mspId, scopes, () => cfoPortfolioSummary(mspId, { period }))());
536
536
  server.tool("cfo_unprofitable_clients", "Clients where labor cost exceeds service revenue — sorted by biggest loss. Includes per-technician breakdown showing WHO is driving the cost on each unprofitable client.", {
537
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
537
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
538
538
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
539
539
  limit: z.number().describe("Max clients to return (default: 15)").optional(),
540
540
  }, async ({ fromDate, toDate, limit }) => wrapTool("cfo_unprofitable_clients", mspId, scopes, () => cfoUnprofitableClients(mspId, { fromDate, toDate, limit }))());
@@ -544,11 +544,11 @@ RULES: Always use WHERE msp_id = $1. Always add ORDER BY and LIMIT. Use JOINs wi
544
544
  }, async ({ months, clientName }) => wrapTool("cfo_monthly_trend", mspId, scopes, () => cfoMonthlyTrend(mspId, { months, clientName }))());
545
545
  server.tool("cfo_client_labor_breakdown", "Deep dive on a specific client: per-technician hours and cost, revenue breakdown (service/product), service margin, effective rate, top 10 most expensive tickets. Answers 'why is this client expensive?'", {
546
546
  clientName: z.string().describe("Client name (partial match supported)"),
547
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
547
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
548
548
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
549
549
  }, async ({ clientName, fromDate, toDate }) => wrapTool("cfo_client_labor_breakdown", mspId, scopes, () => cfoClientLaborBreakdown(mspId, { clientName, fromDate, toDate }))());
550
550
  server.tool("cfo_uninvoiced_labor", "Finds billable time entries that never made it onto an invoice. Compares billable labor value against invoiced service revenue per client to find the gap — money left on the table.", {
551
- fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 90 days ago)").optional(),
551
+ fromDate: z.string().describe("Start date (YYYY-MM-DD, default: 30 days ago)").optional(),
552
552
  toDate: z.string().describe("End date (YYYY-MM-DD, default: today)").optional(),
553
553
  clientName: z.string().describe("Filter to a specific client").optional(),
554
554
  limit: z.number().describe("Max results (default: 20)").optional(),
@@ -10,7 +10,7 @@ export async function explainExperienceScore(mspId, params) {
10
10
  avg_sentiment_score, health_score, total_cost, sla_breach_count
11
11
  FROM analytics.client_experience_chat_mv
12
12
  WHERE msp_id = $1 AND LOWER(company_name) = LOWER($2)
13
- AND period_start >= CURRENT_DATE - INTERVAL '90 days'
13
+ AND period_start >= CURRENT_DATE - INTERVAL '30 days'
14
14
  ORDER BY period_start DESC
15
15
  LIMIT 1`, [mspId, params.clientName], mspId);
16
16
  }
@@ -24,13 +24,13 @@ export async function explainExperienceScore(mspId, params) {
24
24
  FROM ticket_notes_sentiment tns
25
25
  JOIN ticket_lifecycle tl ON tl.msp_id = tns.msp_id AND tl.ticket_id = tns.ticket_id
26
26
  WHERE tns.msp_id = $1 AND LOWER(tl.company_name) = LOWER($2)
27
- AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days' ${tf}`, [mspId, params.clientName], mspId),
27
+ AND tl.responded_date >= CURRENT_DATE - INTERVAL '30 days' ${tf}`, [mspId, params.clientName], mspId),
28
28
  queryRLS(`SELECT COUNT(*)::int as breach_count,
29
29
  AVG(resolution_minutes)::numeric as avg_breach_resolution_min
30
30
  FROM ticket_lifecycle tl
31
31
  WHERE tl.msp_id = $1 AND LOWER(tl.company_name) = LOWER($2)
32
32
  AND tl.resolution_minutes > 0 AND tl.is_resolved = true
33
- AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days' ${tf}`, [mspId, params.clientName], mspId),
33
+ AND tl.responded_date >= CURRENT_DATE - INTERVAL '30 days' ${tf}`, [mspId, params.clientName], mspId),
34
34
  ]);
35
35
  if (metrics.length === 0) {
36
36
  return { found: false, message: `No experience data found for client "${params.clientName}"`, sentiment: sentiment[0] ?? {}, sla_breaches: slaBreaches[0] ?? {} };
@@ -1,7 +1,7 @@
1
1
  import { queryRLS } from "../../db/gateway-client.js";
2
2
  import { getFilters, buildCompanyExclusionFilter } from "../../db/filters.js";
3
3
  export async function analyzeRootCauses(mspId, params) {
4
- const fromDate = params.fromDate ?? new Date(Date.now() - 90 * 86400000).toISOString().split("T")[0];
4
+ const fromDate = params.fromDate ?? new Date(Date.now() - 30 * 86400000).toISOString().split("T")[0];
5
5
  const toDate = params.toDate ?? new Date().toISOString().split("T")[0];
6
6
  const filters = await getFilters(mspId);
7
7
  const cf = buildCompanyExclusionFilter(filters, { tableAlias: "rc" });
@@ -1,7 +1,7 @@
1
1
  import { queryRLS } from "../../db/gateway-client.js";
2
2
  import { getFilters, buildTicketFilter } from "../../db/filters.js";
3
3
  export async function getSlaBreachesByTechnician(mspId, params) {
4
- const fromDate = params.fromDate || new Date(Date.now() - 90 * 86400000).toISOString().slice(0, 10);
4
+ const fromDate = params.fromDate || new Date(Date.now() - 30 * 86400000).toISOString().slice(0, 10);
5
5
  const toDate = params.toDate || new Date().toISOString().slice(0, 10);
6
6
  const mspFilters = await getFilters(mspId);
7
7
  const ticketFilter = buildTicketFilter(mspFilters);
@@ -22,7 +22,7 @@ export async function cfoAgreementAnalysis(mspId) {
22
22
  LEFT JOIN company_agreements ca
23
23
  ON ca.msp_id = te.msp_id AND ca.company_name = te.company AND ca.agreement_status = 'Active'
24
24
  WHERE te.msp_id = $1
25
- AND te.time_start >= CURRENT_DATE - INTERVAL '90 days'
25
+ AND te.time_start >= CURRENT_DATE - INTERVAL '30 days'
26
26
  AND ca.id IS NULL
27
27
  AND te.company IS NOT NULL ${tef}
28
28
  GROUP BY te.company
@@ -19,7 +19,7 @@ export async function cfoClientLaborBreakdown(mspId, params) {
19
19
  GROUP BY te.member_name, t.level
20
20
  ORDER BY cost DESC`, [mspId, fromDate, toDate, `%${params.clientName}%`], mspId),
21
21
  // Client revenue
22
- queryRLS(`SELECT SUM(total)::numeric as total_revenue,
22
+ queryRLS(`SELECT SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
23
23
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
24
24
  SUM(COALESCE(product_total, 0))::numeric as product_revenue,
25
25
  COUNT(*)::int as invoice_count
@@ -27,7 +27,7 @@ export async function cfoClientLaborBreakdown(mspId, params) {
27
27
  WHERE msp_id = $1
28
28
  AND date >= $2::date AND date <= $3::date
29
29
  AND LOWER(company_name) LIKE LOWER($4)
30
- AND total > 0`, [mspId, fromDate, toDate, `%${params.clientName}%`], mspId).catch(() => [{}]),
30
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)`, [mspId, fromDate, toDate, `%${params.clientName}%`], mspId).catch(() => [{}]),
31
31
  // Top expensive tickets
32
32
  queryRLS(`SELECT te.ticket_id,
33
33
  SUM(te.actual_hours)::numeric as hours,
@@ -1 +1 @@
1
- {"version":3,"file":"client-labor-breakdown.js","sourceRoot":"","sources":["../../../src/tools/cfo/client-labor-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAQtD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAa,EAAE,MAA4B;IACvF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvE,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtE,2BAA2B;QAC3B,QAAQ,CACN;;;;;;;;;;;;;0BAaoB,EACpB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EACnD,KAAK,CACN;QAED,iBAAiB;QACjB,QAAQ,CACN;;;;;;;;uBAQiB,EACjB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EACnD,KAAK,CACN,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEnB,wBAAwB;QACxB,QAAQ,CACN;;;;;;;;;;;;gBAYU,EACV,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EACnD,KAAK,CACN;KACF,CAAC,CAAC;IAEH,MAAM,GAAG,GAA4B,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAExD,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5C,GAAG,CAAC;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;QAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC5C,iBAAiB,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;KAC5F,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE;QACtC,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,OAAO,EAAE;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC/D,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,GAAG;YAC/C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACnE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;SAC9C;QACD,KAAK,EAAE;YACL,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG;YAC7C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,GAAG,EAAE;YAC7C,gBAAgB,EAAE,WAAW,CAAC,MAAM;SACrC;QACD,aAAa,EAAE;YACb,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC5D,UAAU,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5G,cAAc,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;SAC3F;QACD,WAAW;QACX,qBAAqB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,CAAC;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE;YAC5C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SAC7C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"client-labor-breakdown.js","sourceRoot":"","sources":["../../../src/tools/cfo/client-labor-breakdown.ts"],"names":[],"mappings":"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"}
@@ -39,14 +39,14 @@ export async function cfoClientProfitability(mspId, params) {
39
39
  LIMIT 50`, costParams, mspId),
40
40
  // Revenue per client from invoices
41
41
  queryRLS(`SELECT company_name as client_name,
42
- SUM(total)::numeric as total_revenue,
42
+ SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
43
43
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
44
44
  SUM(COALESCE(product_total, 0))::numeric as product_revenue,
45
45
  COUNT(*)::int as invoice_count
46
46
  FROM invoices
47
47
  WHERE msp_id = $1
48
48
  AND date >= $2::date AND date <= $3::date
49
- AND total > 0${revenueClientFilter}
49
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)${revenueClientFilter}
50
50
  GROUP BY company_name
51
51
  ORDER BY total_revenue DESC`, revParams, mspId).catch(() => []),
52
52
  // Active agreements
@@ -1 +1 @@
1
- {"version":3,"file":"client-profitability.js","sourceRoot":"","sources":["../../../src/tools/cfo/client-profitability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client-profitability.js","sourceRoot":"","sources":["../../../src/tools/cfo/client-profitability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAQzE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAa,EAAE,MAA2B;IACrF,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,mBAAmB,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACxD,MAAM,SAAS,GAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,YAAY,GAAG,uCAAuC,CAAC;QACvD,mBAAmB,GAAG,yCAAyC,CAAC;QAChE,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACrD,wBAAwB;QACxB,QAAQ,CACN;;;;;;;;;;;;;;;;WAgBK,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC;;;;gBAIzC,EACV,UAAU,EACV,KAAK,CACN;QAED,mCAAmC;QACnC,QAAQ,CACN;;;;;;;;+DAQyD,mBAAmB;;mCAE/C,EAC7B,SAAS,EACT,KAAK,CACN,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAEjB,oBAAoB;QACpB,QAAQ,CACN;;;6BAGuB,EACvB,CAAC,KAAK,CAAC,EACP,KAAK,CACN;KACF,CAAC,CAAC;IAEH,0CAA0C;IAC1C,MAAM,UAAU,GAAuH,EAAE,CAAC;IAC1I,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG;YACvD,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;YAC3C,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;YAC/C,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;YAC/C,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;SAC5C,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAsG,EAAE,CAAC;IAC3H,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACjD,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACzB,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;YAC9B,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YACvC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,+CAA+C;IAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;QAC/G,MAAM,gBAAgB,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC/D,MAAM,aAAa,GAAG,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC;QACtD,MAAM,WAAW,GAAG,GAAG,CAAC,aAAa,GAAG,SAAS,CAAC;QAElD,OAAO;YACL,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,GAAG;YACxD,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,GAAG;YAC5D,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,GAAG;YAC5D,UAAU,EAAE,SAAS;YACrB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,GAAG,GAAG;YACrD,kBAAkB,EAAE,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,GAAG,GAAG,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/G,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG;YACjD,gBAAgB,EAAE,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACvG,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrH,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;YACvC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YACzC,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,aAAa,EAAE,gBAAgB,CAAC,MAAM,GAAG,CAAC;YAC1C,UAAU,EAAE,gBAAgB;SAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,mEAAmE;IACnE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9F,MAAM,kBAAkB,GAAG,OAAO;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;SAC/E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC9D,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAClE,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAClE,UAAU,EAAE,CAAC;QACb,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QACjE,kBAAkB,EAAE,GAAG;QACvB,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;QAC7D,gBAAgB,EAAE,GAAG;QACrB,cAAc,EAAE,CAAC;QACjB,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,CAAC;QACd,YAAY,EAAE,CAAC;QACf,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;QAC3C,aAAa,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;QAC1F,UAAU,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;QAC1E,IAAI,EAAE,8DAA8D;KACrE,CAAC,CAAC,CAAC;IAEN,MAAM,UAAU,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,kBAAkB,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACnE,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAEpE,OAAO;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE;QACtC,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,CAAC,MAAM;YAChC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG;YACnD,qBAAqB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,GAAG,GAAG,CAAC,GAAG,GAAG;YAClE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG;YACnD,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,mBAAmB,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACzE,kBAAkB,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,GAAG,SAAS,CAAC,GAAG,mBAAmB,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACnI,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAChE,gBAAgB,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5G,oBAAoB,EAAE,YAAY,CAAC,MAAM;YACzC,eAAe,EAAE,gBAAgB;YACjC,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YAC3G,yBAAyB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM;SAC7E;KACF,CAAC;AACJ,CAAC"}
@@ -21,7 +21,7 @@ export async function cfoFinancialOverview(mspId, params) {
21
21
  WHERE msp_id = $1
22
22
  AND time_start >= $2::date AND time_start <= $3::date${buildTimeEntriesFilter(filters)}`, [mspId, fromDate, toDate], mspId),
23
23
  // Revenue from invoices
24
- queryRLS(`SELECT SUM(total)::numeric as total_revenue,
24
+ queryRLS(`SELECT SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
25
25
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
26
26
  SUM(COALESCE(product_total, 0))::numeric as product_revenue,
27
27
  SUM(COALESCE(expense_total, 0))::numeric as expense_revenue,
@@ -30,7 +30,7 @@ export async function cfoFinancialOverview(mspId, params) {
30
30
  FROM invoices
31
31
  WHERE msp_id = $1
32
32
  AND date >= $2::date AND date <= $3::date
33
- AND total > 0`, [mspId, fromDate, toDate], mspId).catch(() => [{}]),
33
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)`, [mspId, fromDate, toDate], mspId).catch(() => [{}]),
34
34
  // Out-of-scope recoverable
35
35
  queryRLS(`SELECT COUNT(DISTINCT ticket_id)::int as tickets,
36
36
  COALESCE(SUM(billable_amount), 0)::numeric as dollars
@@ -1 +1 @@
1
- {"version":3,"file":"financial-overview.js","sourceRoot":"","sources":["../../../src/tools/cfo/financial-overview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"financial-overview.js","sourceRoot":"","sources":["../../../src/tools/cfo/financial-overview.ts"],"names":[],"mappings":"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"}
@@ -24,14 +24,14 @@ export async function cfoLaborCostTrend(mspId, params) {
24
24
  ORDER BY month`, [mspId, fromDate], mspId),
25
25
  // Monthly revenue from invoices
26
26
  queryRLS(`SELECT TO_CHAR(date, 'YYYY-MM') as month,
27
- SUM(total)::numeric as total_revenue,
27
+ SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
28
28
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
29
29
  SUM(COALESCE(product_total, 0))::numeric as product_revenue,
30
30
  COUNT(*)::int as invoice_count
31
31
  FROM invoices
32
32
  WHERE msp_id = $1
33
33
  AND date >= $2::date
34
- AND total > 0
34
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)
35
35
  GROUP BY TO_CHAR(date, 'YYYY-MM')
36
36
  ORDER BY month`, [mspId, fromDate], mspId).catch(() => []),
37
37
  // Cost by department
@@ -14,7 +14,7 @@ export async function cfoMonthlyTrend(mspId, params) {
14
14
  }
15
15
  const [revenueMonthly, costMonthly] = await Promise.all([
16
16
  queryRLS(`SELECT TO_CHAR(date, 'YYYY-MM') as month,
17
- SUM(total)::numeric as total_revenue,
17
+ SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
18
18
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
19
19
  SUM(COALESCE(product_total, 0))::numeric as product_revenue,
20
20
  COUNT(*)::int as invoice_count,
@@ -22,7 +22,7 @@ export async function cfoMonthlyTrend(mspId, params) {
22
22
  FROM invoices
23
23
  WHERE msp_id = $1
24
24
  AND date >= $2::date
25
- AND total > 0${clientFilter}
25
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)${clientFilter}
26
26
  GROUP BY TO_CHAR(date, 'YYYY-MM')
27
27
  ORDER BY month`, revParams, mspId).catch(() => []),
28
28
  queryRLS(`SELECT TO_CHAR(time_start, 'YYYY-MM') as month,
@@ -1 +1 @@
1
- {"version":3,"file":"monthly-trend.js","sourceRoot":"","sources":["../../../src/tools/cfo/monthly-trend.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monthly-trend.js","sourceRoot":"","sources":["../../../src/tools/cfo/monthly-trend.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ export async function cfoPortfolioSummary(mspId, params) {
30
30
  }
31
31
  }
32
32
  const [revenueResult, laborResult, agreementResult] = await Promise.all([
33
- queryRLS(`SELECT SUM(total)::numeric as total_revenue,
33
+ queryRLS(`SELECT SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
34
34
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
35
35
  SUM(COALESCE(product_total, 0))::numeric as product_revenue,
36
36
  COUNT(*)::int as invoice_count,
@@ -38,7 +38,7 @@ export async function cfoPortfolioSummary(mspId, params) {
38
38
  FROM invoices
39
39
  WHERE msp_id = $1
40
40
  AND date >= $2::date AND date <= $3::date
41
- AND total > 0`, [mspId, fromDate, toDate], mspId).catch(() => [{}]),
41
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)`, [mspId, fromDate, toDate], mspId).catch(() => [{}]),
42
42
  queryRLS(`SELECT SUM(actual_hours)::numeric as total_hours,
43
43
  SUM(total_cost)::numeric as total_labor_cost,
44
44
  COUNT(DISTINCT member_name)::int as active_technicians,
@@ -1 +1 @@
1
- {"version":3,"file":"portfolio-summary.js","sourceRoot":"","sources":["../../../src/tools/cfo/portfolio-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAMtD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,MAAuB;IAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC;IAE7C,IAAI,QAAgB,CAAC;IACrB,IAAI,MAAc,CAAC;IACnB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACtF,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAChF,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM;QACR,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,QAAQ,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC;YACxC,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM;QACR,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM;QACR,CAAC;QACD,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa;YACtB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,CAAC,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtE,QAAQ,CACN;;;;;;;;uBAQiB,EACjB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EACzB,KAAK,CACN,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEnB,QAAQ,CACN;;;;;;;;;;;+DAWyD,EACzD,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EACzB,KAAK,CACN;QAED,QAAQ,CACN;;;;;;;;;;;6BAWuB,EACvB,CAAC,KAAK,CAAC,EACP,KAAK,CACN;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,GAA4B,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,CAAC,GAA4B,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,CAAC,GAA4B,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5D,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAAC,MAAM,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnF,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO;QACL,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;QACrD,OAAO,EAAE;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG;YAC3C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,GAAG;YAC/C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACjE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;SAC5C;QACD,aAAa,EAAE;YACb,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,GAAG,CAAC,GAAG,GAAG;YAC7C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG;YACtC,UAAU,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1E,cAAc,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;SAC3F;QACD,UAAU,EAAE;YACV,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YAC7C,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACjD,kBAAkB,EAAE,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC;YACrD,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;YAC7C,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,GAAG;YAC/C,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;SAChD;QACD,UAAU,EAAE;YACV,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAC9C,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;SACtE;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"portfolio-summary.js","sourceRoot":"","sources":["../../../src/tools/cfo/portfolio-summary.ts"],"names":[],"mappings":"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"}
@@ -33,7 +33,7 @@ export async function cfoUninvoicedLabor(mspId, params) {
33
33
  FROM invoices
34
34
  WHERE msp_id = $1
35
35
  AND date >= $2::date AND date <= $3::date
36
- AND total > 0${invoiceClientFilter}
36
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)${invoiceClientFilter}
37
37
  GROUP BY company_name
38
38
  )
39
39
  SELECT
@@ -1 +1 @@
1
- {"version":3,"file":"uninvoiced-labor.js","sourceRoot":"","sources":["../../../src/tools/cfo/uninvoiced-labor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uninvoiced-labor.js","sourceRoot":"","sources":["../../../src/tools/cfo/uninvoiced-labor.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,12 @@ export async function cfoUnprofitableClients(mspId, params) {
9
9
  const unprofitable = await queryRLS(`WITH revenue AS (
10
10
  SELECT company_name,
11
11
  SUM(COALESCE(service_total, 0))::numeric as service_revenue,
12
- SUM(total)::numeric as total_revenue,
12
+ SUM(total + COALESCE(agreement_amount, 0))::numeric as total_revenue,
13
13
  COUNT(*)::int as invoice_count
14
14
  FROM invoices
15
15
  WHERE msp_id = $1
16
16
  AND date >= $2::date AND date <= $3::date
17
- AND total > 0
17
+ AND (total > 0 OR COALESCE(agreement_amount, 0) > 0)
18
18
  GROUP BY company_name
19
19
  ),
20
20
  costs AS (
@@ -29,7 +29,7 @@ export async function getClient360(mspId, params) {
29
29
  queryRLS(`SELECT tl.owner_name as technician_name, COUNT(*)::int as tickets
30
30
  FROM ticket_lifecycle tl
31
31
  WHERE tl.msp_id = $1 AND LOWER(tl.company_name) = LOWER($2)
32
- AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days'
32
+ AND tl.responded_date >= CURRENT_DATE - INTERVAL '30 days'
33
33
  AND tl.owner_name IS NOT NULL AND tl.owner_name != ''${ticketFilter}
34
34
  GROUP BY tl.owner_name
35
35
  ORDER BY tickets DESC
@@ -39,7 +39,7 @@ export async function getTechnician360(mspId, params) {
39
39
  queryRLS(`SELECT tl.company_name, COUNT(*)::int as tickets
40
40
  FROM ticket_lifecycle tl
41
41
  WHERE tl.msp_id = $1 AND LOWER(tl.owner_name) = LOWER($2)
42
- AND tl.responded_date >= CURRENT_DATE - INTERVAL '90 days'${ticketFilterNoTech}
42
+ AND tl.responded_date >= CURRENT_DATE - INTERVAL '30 days'${ticketFilterNoTech}
43
43
  GROUP BY tl.company_name
44
44
  ORDER BY tickets DESC
45
45
  LIMIT 5`, [mspId, params.technicianName], mspId),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "untrap-mcp",
3
- "version": "0.4.16",
3
+ "version": "0.4.18",
4
4
  "description": "Untrap MCP Server — AI-powered MSP analytics via Claude Desktop",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",