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 +9 -9
- package/dist/tools/ai/explain-experience.js +3 -3
- package/dist/tools/ai/root-causes.js +1 -1
- package/dist/tools/analytics/sla-breaches.js +1 -1
- package/dist/tools/cfo/agreement-analysis.js +1 -1
- package/dist/tools/cfo/client-labor-breakdown.js +2 -2
- package/dist/tools/cfo/client-labor-breakdown.js.map +1 -1
- package/dist/tools/cfo/client-profitability.js +2 -2
- package/dist/tools/cfo/client-profitability.js.map +1 -1
- package/dist/tools/cfo/financial-overview.js +2 -2
- package/dist/tools/cfo/financial-overview.js.map +1 -1
- package/dist/tools/cfo/labor-cost-trend.js +2 -2
- package/dist/tools/cfo/monthly-trend.js +2 -2
- package/dist/tools/cfo/monthly-trend.js.map +1 -1
- package/dist/tools/cfo/portfolio-summary.js +2 -2
- package/dist/tools/cfo/portfolio-summary.js.map +1 -1
- package/dist/tools/cfo/uninvoiced-labor.js +1 -1
- package/dist/tools/cfo/uninvoiced-labor.js.map +1 -1
- package/dist/tools/cfo/unprofitable-clients.js +2 -2
- package/dist/tools/composite/client-360.js +1 -1
- package/dist/tools/composite/technician-360.js +1 -1
- package/package.json +1 -1
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 '
|
|
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 '
|
|
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 '
|
|
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() -
|
|
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() -
|
|
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 '
|
|
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;;;;;;;;
|
|
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":"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
|
|
1
|
+
{"version":3,"file":"client-profitability.js","sourceRoot":"","sources":["../../../src/tools/cfo/client-profitability.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAOtG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAa,EAAE,MAAsB;IAC9E,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,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzF,+BAA+B;QAC/B,QAAQ,CACN;;;;;;;;;;;;;gEAa0D,sBAAsB,CAAC,OAAO,CAAC,EAAE,EAC3F,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EACzB,KAAK,CACN;QAED,wBAAwB;QACxB,QAAQ,CACN;;;;;;;;;
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAOtD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,MAA0B;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,gBAAgB,GAAG,EAAE,CAAC;IAC1B,MAAM,SAAS,GAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,YAAY,GAAG,yCAAyC,CAAC;QACzD,gBAAgB,GAAG,oCAAoC,CAAC;QACxD,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;QACzC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,cAAc,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACtD,QAAQ,CACN
|
|
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;;;;;;;;
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AASzE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAa,EAAE,MAAwB;IAC9E,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,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,mBAAmB,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEzD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACtB,YAAY,GAAG,uCAAuC,CAAC;QACvD,mBAAmB,GAAG,yCAAyC,CAAC;QAChE,WAAW,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpC,MAAM,IAAI,GAAG,MAAM,QAAQ,CACzB;;;;;;;;;mCAS+B,YAAY,GAAG,sBAAsB,CAAC,OAAO,CAAC;;;;;;;;;
|
|
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 '
|
|
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 '
|
|
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),
|