VoiceNotes is an Arduino sketch for the Waveshare ESP32-C6-LCD-0.85 that records meetings and voice memos to microSD and turns them into notes: - Records 16 kHz mono WAV (up to 4 h) from the ES7210 dual mics, with a boosted preamp and soft-limited digital gain - Transcribes via an OpenAI-compatible speech-to-text API in ~10 min parts cut at quiet points, with retries and resume after failures - Summarizes the transcript with Claude into meeting notes (decisions, action items, topics with timestamps), streamed to and from the card - Copies the notes to Nextcloud over WebDAV - Shows recording/processing state on the 0.85" LCD and the LED ring - Works around the board's SD card failing multi-sector reads Credentials live in VoiceNotes/secrets.h, which is git-ignored; see secrets.example.h. Also adds the Microsoft CDM customer service SQL implementation (DDL, sample data, reporting queries and docs). Its README is renamed to CDM_README.md so the repository README stays at the top level. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8.9 KiB
8.9 KiB
CDM Customer Service - Quick Reference Guide
🎯 Your Complete Database is Ready!
Server: localhost:1433
Database: CDM_CustomerService
Auth: SA / Welcome1
Tables: 26
Views: 4
Procedures: 19
📊 Viewing Dashboards
Executive Dashboard (All Key Metrics)
SELECT
activeCases,
closedCases,
totalCustomers,
activeContracts,
activeContractValue
FROM cdm.v_ExecutiveDashboard;
Case Health Dashboard
SELECT caseNumber, title, priority, status, statusHealth, daysOpen
FROM cdm.v_CasePerformanceMetrics
ORDER BY daysOpen DESC;
Agent Performance
SELECT agentName, totalCasesOwned, closedCases, avgHoursToResolution
FROM cdm.v_AgentPerformance
ORDER BY closedCases DESC;
Contract Status
SELECT contractNumber, accountName, utilizationPercent, daysRemaining, utilizationStatus
FROM cdm.v_ContractUtilizationDashboard
WHERE utilizationStatus != 'NORMAL';
🔍 Running Reports
Case Analysis
-- Cases by priority (last 90 days)
EXEC sp_CaseVolumeByPriority @Days = 90;
-- Customer satisfaction (last 6 months)
EXEC sp_CustomerSatisfactionAnalysis @Months = 6;
-- SLA Compliance (real-time)
EXEC sp_SLAComplianceReport;
Schedule & Workload
-- This week's activities
EXEC sp_ServiceActivitySchedule @Days = 7;
-- Resource utilization (last 30 days)
EXEC sp_ResourceUtilizationReport @Days = 30;
-- Agent workload
SELECT agentName, activeCases, criticalCases, highPriorityCases
FROM cdm.v_AgentPerformance;
Business Metrics
-- Monthly summary
EXEC sp_MonthlyActivityReport @Year = 2026, @Month = 9;
-- Customer revenue
EXEC sp_CustomerRevenueAnalysis;
-- KB article usage
EXEC sp_KnowledgeArticleEffectiveness;
🛠️ Common Tasks
Find Cases by Status
-- Active cases
SELECT caseNumber, title, priority FROM cdm.[Case]
WHERE status = 'Active' AND isActive = 1
ORDER BY priority DESC, createdDate;
-- Overdue cases (> 30 days)
EXEC sp_UpdateCaseOverdueStatus @ThresholdDays = 30;
-- Cases needing attention
SELECT * FROM cdm.v_CasePerformanceMetrics
WHERE statusHealth IN ('Overdue', 'Awaiting Close')
ORDER BY daysOpen DESC;
Find Contracts
-- Active contracts
SELECT contractNumber, contractName, accountName, status
FROM cdm.v_ContractSummary
WHERE status = 'Active'
ORDER BY contractValue DESC;
-- Expiring soon
EXEC sp_ContractRenewalAlerts @DaysUntilExpiry = 90;
-- Overutilized contracts
SELECT contractNumber, accountName, utilizationPercent
FROM cdm.v_ContractUtilizationDashboard
WHERE utilizationPercent > 80;
Find Data Quality Issues
-- Missing data
EXEC sp_CasesWithMissingData;
-- Orphaned records
EXEC sp_FindOrphanedRecords;
-- Incomplete cases
SELECT caseNumber, title
FROM cdm.[Case]
WHERE accountId IS NULL OR ownerUserId IS NULL;
📅 Maintenance Commands
Daily
-- Check SLA status
EXEC sp_SLAComplianceReport;
-- Today's schedule
EXEC sp_ServiceActivitySchedule @Days = 1;
Weekly
-- Overdue cases
EXEC sp_UpdateCaseOverdueStatus @ThresholdDays = 30;
-- Team performance
SELECT * FROM cdm.v_AgentPerformance
ORDER BY activeCases DESC;
-- Data quality
EXEC sp_CasesWithMissingData;
Monthly
-- Month summary
EXEC sp_MonthlyActivityReport @Year = 2026, @Month = 9;
-- Customer satisfaction
EXEC sp_CustomerSatisfactionAnalysis @Months = 1;
-- Revenue analysis
EXEC sp_CustomerRevenueAnalysis;
-- Auto-close old resolved cases
EXEC sp_CloseResolvedCases @DaysOld = 7;
Quarterly
-- Contract renewals
EXEC sp_ContractRenewalAlerts @DaysUntilExpiry = 90;
-- Resource utilization
EXEC sp_ResourceUtilizationReport @Days = 90;
-- KB effectiveness
EXEC sp_KnowledgeArticleEffectiveness;
Annually
-- Archive old cases (2+ years)
EXEC sp_ArchiveOldCases @YearsOld = 2;
-- Update contract status
EXEC sp_DeactivateExpiredContracts;
EXEC sp_UpdateEntitlementStatus;
🔗 Table Reference
Create Case
INSERT INTO cdm.[Case]
(caseNumber, title, accountId, contactId, priority, status, createdDate)
VALUES ('CSE-2026-0005', 'New Issue Title', @accountId, @contactId, 'High', 'Active', GETUTCDATE());
Create Contract
INSERT INTO cdm.Contract
(contractNumber, contractName, accountId, startDate, endDate, status, contractValue)
VALUES ('CNT-2026-001', 'Contract Name', @accountId, '2026-01-01', '2026-12-31', 'Active', 50000.00);
Create Service Activity
INSERT INTO cdm.ServiceActivity
(subject, serviceId, caseId, ownerUserId, startTime, endTime, duration, status)
VALUES ('Activity Name', @serviceId, @caseId, @userId, '2026-09-24 10:00:00', '2026-09-24 12:00:00', 120, 'Scheduled');
Update Case
UPDATE cdm.[Case]
SET status = 'Resolved', resolvedDate = GETUTCDATE()
WHERE caseId = @caseId;
📈 Sample Queries for Analysis
Cases by Account
SELECT
a.accountName,
COUNT(c.caseId) AS caseCount,
SUM(CASE WHEN c.status = 'Active' THEN 1 ELSE 0 END) AS activeCases,
SUM(CASE WHEN c.status = 'Closed' THEN 1 ELSE 0 END) AS closedCases
FROM cdm.Account a
LEFT JOIN cdm.[Case] c ON a.accountId = c.accountId
WHERE a.isActive = 1
GROUP BY a.accountId, a.accountName
ORDER BY activeCases DESC;
Average Case Duration
SELECT
a.accountName,
AVG(DATEDIFF(DAY, c.createdDate, c.resolvedDate)) AS avgDaysToResolve,
COUNT(*) AS totalCasesClosed
FROM cdm.[Case] c
JOIN cdm.Account a ON c.accountId = a.accountId
WHERE c.status = 'Closed' AND c.resolvedDate IS NOT NULL AND c.isActive = 1
GROUP BY a.accountId, a.accountName
ORDER BY avgDaysToResolve DESC;
Technician Workload
SELECT
u.firstName + ' ' + u.lastName AS technician,
COUNT(c.caseId) AS casesAssigned,
COUNT(CASE WHEN c.status = 'Active' THEN 1 END) AS activeCases,
COUNT(CASE WHEN c.status = 'Closed' THEN 1 END) AS closedCases,
ROUND(AVG(DATEDIFF(HOUR, c.createdDate, ISNULL(c.resolvedDate, GETUTCDATE()))), 2) AS avgHours
FROM cdm.[User] u
LEFT JOIN cdm.[Case] c ON u.userId = c.ownerUserId
WHERE u.isActive = 1 AND c.isActive = 1
GROUP BY u.userId, u.firstName, u.lastName
ORDER BY activeCases DESC;
Contract Value by Account
SELECT
a.accountName,
COUNT(c.contractId) AS contractCount,
SUM(c.contractValue) AS totalValue,
AVG(c.contractValue) AS avgValue,
SUM(CASE WHEN c.status = 'Active' THEN c.contractValue ELSE 0 END) AS activeValue
FROM cdm.Account a
LEFT JOIN cdm.Contract c ON a.accountId = c.accountId
WHERE a.accountType = 'Customer' AND a.isActive = 1
GROUP BY a.accountId, a.accountName
ORDER BY totalValue DESC;
Service Activity by Technician
SELECT
u.firstName + ' ' + u.lastName AS technician,
s.serviceName,
COUNT(sa.activityId) AS activityCount,
SUM(sa.duration) AS totalMinutes,
ROUND(SUM(sa.duration) / 60.0, 1) AS totalHours,
COUNT(CASE WHEN sa.status = 'Completed' THEN 1 END) AS completed
FROM cdm.ServiceActivity sa
JOIN cdm.[User] u ON sa.ownerUserId = u.userId
JOIN cdm.Service s ON sa.serviceId = s.serviceId
WHERE sa.isActive = 1 AND sa.startTime >= DATEADD(MONTH, -1, GETUTCDATE())
GROUP BY u.userId, u.firstName, u.lastName, s.serviceId, s.serviceName
ORDER BY totalMinutes DESC;
🎓 Learning Path
- Start: Review current state with
v_ExecutiveDashboard - Explore: Check
v_CasePerformanceMetricsfor details - Analyze: Run
sp_CaseVolumeByPriorityandsp_SLAComplianceReport - Plan: Use
sp_ServiceActivitySchedulefor scheduling - Monitor: Run reports from the procedures list regularly
💡 Pro Tips
Create a Dashboard in Excel
- Connect to CDM_CustomerService database
- Create queries pulling from views
- Set up auto-refresh
- Use Excel charts for visualization
Create Power BI Reports
- Import data from all 4 views
- Import result sets from procedures
- Create visual dashboards
- Set up data refresh schedule
Set Up Alerts
-- Create a job to auto-close resolved cases (weekly)
EXEC sp_CloseResolvedCases @DaysOld = 7;
-- Monitor overdue cases (daily)
EXEC sp_UpdateCaseOverdueStatus @ThresholdDays = 30;
-- Check contract renewals (weekly)
EXEC sp_ContractRenewalAlerts @DaysUntilExpiry = 30;
📞 Quick Links
- Full Documentation: CDM_Implementation_Guide.md
- Reporting Details: REPORTING_PROCEDURES_SUMMARY.md
- Database Setup: CDM_QUICKSTART.md
- Sample Data: Already loaded in tables
- View Definitions: Use
sp_helptext 'viewName' - Procedure Help: Use
sp_helptext 'sp_ProcedureName'
🚀 Next Steps
- ✅ Database Created - CDM_CustomerService ready
- ✅ Tables Created - 26 tables with sample data
- ✅ Views Added - 4 analytical views
- ✅ Procedures Added - 19 reporting/admin procedures
- 📋 Now: Start running queries and building reports!
Your database is production-ready. Start analyzing your data!
Last Updated: 2026-09-23