Add VoiceNotes firmware and CDM customer service SQL project

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>
This commit is contained in:
Ravi Reddy
2026-10-03 22:22:10 +05:30
co-authored by Claude Opus 5.5
parent ef38a502d8
commit 3b371cdb28
24 changed files with 8700 additions and 0 deletions
+889
View File
@@ -0,0 +1,889 @@
-- Microsoft Common Data Model - Customer Service Application Model
-- SQL Server DDL Implementation
-- Version: 1.0
-- Date: 2026-09-23
-- ============================================================================
-- DATABASE AND SCHEMA SETUP
-- ============================================================================
-- Create Database (uncomment to create)
-- CREATE DATABASE CDM_CustomerService;
-- GO
USE CDM_CustomerService;
GO
-- Create Schema for CDM
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'cdm')
BEGIN
EXEC sp_executesql N'CREATE SCHEMA cdm'
END
GO
-- ============================================================================
-- FOUNDATION TABLES
-- ============================================================================
-- 1. User Table - Represents system users with access to the CRM
CREATE TABLE cdm.User (
userId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
userName NVARCHAR(200) NOT NULL UNIQUE,
firstName NVARCHAR(100) NOT NULL,
lastName NVARCHAR(100) NOT NULL,
email NVARCHAR(200) NOT NULL UNIQUE,
phone NVARCHAR(20),
mobilePhone NVARCHAR(20),
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER
);
-- 2. Site Table - Represents business locations/branches
CREATE TABLE cdm.Site (
siteId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
siteName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
address NVARCHAR(500),
city NVARCHAR(100),
stateProvince NVARCHAR(100),
postalCode NVARCHAR(20),
country NVARCHAR(100),
phone NVARCHAR(20),
email NVARCHAR(200),
isHeadquarters BIT DEFAULT 0,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 3. Account Table - Represents customer organizations
CREATE TABLE cdm.Account (
accountId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
accountName NVARCHAR(200) NOT NULL,
accountNumber NVARCHAR(50) UNIQUE,
description NVARCHAR(2000),
email NVARCHAR(200),
phone NVARCHAR(20),
faxPhone NVARCHAR(20),
websiteUrl NVARCHAR(500),
parentAccountId UNIQUEIDENTIFIER,
ownerUserId UNIQUEIDENTIFIER,
siteId UNIQUEIDENTIFIER,
accountType NVARCHAR(50), -- 'Prospect', 'Customer', 'Partner'
industry NVARCHAR(100),
numberOfEmployees INT,
revenue DECIMAL(18,2),
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (parentAccountId) REFERENCES cdm.Account(accountId),
FOREIGN KEY (ownerUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (siteId) REFERENCES cdm.Site(siteId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 4. Contact Table - Represents individual persons
CREATE TABLE cdm.Contact (
contactId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
firstName NVARCHAR(100) NOT NULL,
lastName NVARCHAR(100) NOT NULL,
email NVARCHAR(200),
phone NVARCHAR(20),
mobilePhone NVARCHAR(20),
accountId UNIQUEIDENTIFIER,
ownerUserId UNIQUEIDENTIFIER,
jobTitle NVARCHAR(100),
department NVARCHAR(100),
address NVARCHAR(500),
city NVARCHAR(100),
stateProvince NVARCHAR(100),
postalCode NVARCHAR(20),
country NVARCHAR(100),
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (accountId) REFERENCES cdm.Account(accountId),
FOREIGN KEY (ownerUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- SERVICE CONFIGURATION TABLES
-- ============================================================================
-- 5. Service Table - Represents services offered to customers
CREATE TABLE cdm.Service (
serviceId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
serviceName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 6. Resource Table - Users or equipment that can be scheduled
CREATE TABLE cdm.Resource (
resourceId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
resourceName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
resourceType NVARCHAR(50) NOT NULL, -- 'User', 'Equipment', 'Facility'
userId UNIQUEIDENTIFIER, -- For user type resources
siteId UNIQUEIDENTIFIER, -- For facility type resources
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (userId) REFERENCES cdm.User(userId),
FOREIGN KEY (siteId) REFERENCES cdm.Site(siteId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 7. FacilityEquipment Table - Resources that can be scheduled
CREATE TABLE cdm.FacilityEquipment (
equipmentId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
equipmentName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
resourceId UNIQUEIDENTIFIER NOT NULL UNIQUE,
location NVARCHAR(200),
capacity INT,
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (resourceId) REFERENCES cdm.Resource(resourceId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 8. SchedulingGroup Table - Resource group or team
CREATE TABLE cdm.SchedulingGroup (
groupId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
groupName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
resourceId UNIQUEIDENTIFIER,
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (resourceId) REFERENCES cdm.Resource(resourceId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 9. ResourceSpecification Table - Selection rules for resources
CREATE TABLE cdm.ResourceSpecification (
specificationId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
specificationName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
serviceId UNIQUEIDENTIFIER,
minRequiredCount INT DEFAULT 1,
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (serviceId) REFERENCES cdm.Service(serviceId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- CONTRACT TABLES
-- ============================================================================
-- 10. Contract Table - Customer service contracts
CREATE TABLE cdm.Contract (
contractId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
contractNumber NVARCHAR(100) NOT NULL UNIQUE,
contractName NVARCHAR(200) NOT NULL,
accountId UNIQUEIDENTIFIER NOT NULL,
ownerUserId UNIQUEIDENTIFIER,
startDate DATE NOT NULL,
endDate DATE NOT NULL,
status NVARCHAR(50) NOT NULL, -- 'Draft', 'Active', 'Expired', 'Cancelled'
contractValue DECIMAL(18,2),
description NVARCHAR(2000),
contractType NVARCHAR(50), -- 'Service', 'Support', 'Maintenance'
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (accountId) REFERENCES cdm.Account(accountId),
FOREIGN KEY (ownerUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 11. ContractLine Table - Line items in contracts
CREATE TABLE cdm.ContractLine (
contractLineId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
contractId UNIQUEIDENTIFIER NOT NULL,
lineNumber INT NOT NULL,
serviceId UNIQUEIDENTIFIER NOT NULL,
description NVARCHAR(2000),
quantityIncluded INT,
quantityUsed INT DEFAULT 0,
price DECIMAL(18,2),
discount DECIMAL(18,2),
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
UNIQUE (contractId, lineNumber),
FOREIGN KEY (contractId) REFERENCES cdm.Contract(contractId) ON DELETE CASCADE,
FOREIGN KEY (serviceId) REFERENCES cdm.Service(serviceId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 12. ServiceContractContact Table - Contacts associated with contracts
CREATE TABLE cdm.ServiceContractContact (
serviceContractContactId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
contractId UNIQUEIDENTIFIER NOT NULL,
contactId UNIQUEIDENTIFIER NOT NULL,
role NVARCHAR(100),
isPrimary BIT DEFAULT 0,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
UNIQUE (contractId, contactId),
FOREIGN KEY (contractId) REFERENCES cdm.Contract(contractId) ON DELETE CASCADE,
FOREIGN KEY (contactId) REFERENCES cdm.Contact(contactId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- ENTITLEMENT TABLES
-- ============================================================================
-- 13. Entitlement Table - Support entitlements for customers
CREATE TABLE cdm.Entitlement (
entitlementId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
entitlementName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
accountId UNIQUEIDENTIFIER NOT NULL,
startDate DATE NOT NULL,
endDate DATE,
type NVARCHAR(50) NOT NULL, -- 'Support', 'Service', 'Training'
duration INT, -- Duration in days
unitType NVARCHAR(50), -- 'Cases', 'Hours', 'Incidents'
unitCount INT,
status NVARCHAR(50) NOT NULL, -- 'Active', 'Inactive', 'Expired'
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (accountId) REFERENCES cdm.Account(accountId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 14. EntitlementContact Table - Contacts associated with entitlements
CREATE TABLE cdm.EntitlementContact (
entitlementContactId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
entitlementId UNIQUEIDENTIFIER NOT NULL,
contactId UNIQUEIDENTIFIER NOT NULL,
isPrimary BIT DEFAULT 0,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
UNIQUE (entitlementId, contactId),
FOREIGN KEY (entitlementId) REFERENCES cdm.Entitlement(entitlementId) ON DELETE CASCADE,
FOREIGN KEY (contactId) REFERENCES cdm.Contact(contactId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 15. EntitlementProduct Table - Products covered by entitlements
CREATE TABLE cdm.EntitlementProduct (
entitlementProductId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
entitlementId UNIQUEIDENTIFIER NOT NULL,
serviceId UNIQUEIDENTIFIER NOT NULL,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
UNIQUE (entitlementId, serviceId),
FOREIGN KEY (entitlementId) REFERENCES cdm.Entitlement(entitlementId) ON DELETE CASCADE,
FOREIGN KEY (serviceId) REFERENCES cdm.Service(serviceId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- CASE/INCIDENT TABLES
-- ============================================================================
-- 16. Case Table - Service request cases
CREATE TABLE cdm.Case (
caseId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
caseNumber NVARCHAR(50) NOT NULL UNIQUE,
title NVARCHAR(200) NOT NULL,
description NVARCHAR(MAX),
priority NVARCHAR(50) NOT NULL DEFAULT 'Medium', -- 'Low', 'Medium', 'High', 'Critical'
severity NVARCHAR(50), -- 'Low', 'Medium', 'High'
status NVARCHAR(50) NOT NULL DEFAULT 'Active', -- 'Active', 'Resolved', 'Closed', 'Waiting'
accountId UNIQUEIDENTIFIER NOT NULL,
contactId UNIQUEIDENTIFIER,
ownerUserId UNIQUEIDENTIFIER,
contractId UNIQUEIDENTIFIER,
entitlementId UNIQUEIDENTIFIER,
createdDate DATETIME2(7) DEFAULT GETUTCDATE(),
resolvedDate DATETIME2(7),
closedDate DATETIME2(7),
parentCaseId UNIQUEIDENTIFIER,
emailAddress NVARCHAR(200),
resolutionNotes NVARCHAR(MAX),
billingStatus NVARCHAR(50), -- 'Billable', 'Non-billable'
actualServiceDuration INT, -- Duration in minutes
estimatedServiceDuration INT,
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (accountId) REFERENCES cdm.Account(accountId),
FOREIGN KEY (contactId) REFERENCES cdm.Contact(contactId),
FOREIGN KEY (ownerUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (contractId) REFERENCES cdm.Contract(contractId),
FOREIGN KEY (entitlementId) REFERENCES cdm.Entitlement(entitlementId),
FOREIGN KEY (parentCaseId) REFERENCES cdm.Case(caseId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 17. CaseResolution Table - Special activity for case resolution
CREATE TABLE cdm.CaseResolution (
resolutionId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
caseId UNIQUEIDENTIFIER NOT NULL,
description NVARCHAR(MAX),
resolutionType NVARCHAR(100),
resolutionStatus NVARCHAR(50),
billingStatus NVARCHAR(50), -- 'Billable', 'Non-billable'
actualServiceDuration INT, -- Duration in minutes
totalCostAmount DECIMAL(18,2),
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (caseId) REFERENCES cdm.Case(caseId) ON DELETE CASCADE,
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 18. ChildIncidentCount Table - Tracks child incidents for a case
CREATE TABLE cdm.ChildIncidentCount (
countId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
parentCaseId UNIQUEIDENTIFIER NOT NULL,
childIncidentCount INT DEFAULT 0,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
modifiedOn DATETIME2(7),
UNIQUE (parentCaseId),
FOREIGN KEY (parentCaseId) REFERENCES cdm.Case(caseId) ON DELETE CASCADE
);
-- ============================================================================
-- SERVICE ACTIVITY TABLES
-- ============================================================================
-- 19. ServiceActivity Table - Service activities scheduled for cases
CREATE TABLE cdm.ServiceActivity (
activityId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
subject NVARCHAR(200) NOT NULL,
description NVARCHAR(MAX),
serviceId UNIQUEIDENTIFIER NOT NULL,
caseId UNIQUEIDENTIFIER,
contactId UNIQUEIDENTIFIER,
ownerUserId UNIQUEIDENTIFIER,
startTime DATETIME2(7) NOT NULL,
endTime DATETIME2(7) NOT NULL,
duration INT, -- Duration in minutes
location NVARCHAR(200),
status NVARCHAR(50) NOT NULL DEFAULT 'Scheduled', -- 'Scheduled', 'In Progress', 'Completed', 'Cancelled'
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (serviceId) REFERENCES cdm.Service(serviceId),
FOREIGN KEY (caseId) REFERENCES cdm.Case(caseId),
FOREIGN KEY (contactId) REFERENCES cdm.Contact(contactId),
FOREIGN KEY (ownerUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 20. ActivityParty Table - Persons or groups associated with activities
CREATE TABLE cdm.ActivityParty (
partyId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
activityId UNIQUEIDENTIFIER NOT NULL,
partyType NVARCHAR(50) NOT NULL, -- 'Required', 'Optional', 'Organizer'
userId UNIQUEIDENTIFIER,
contactId UNIQUEIDENTIFIER,
email NVARCHAR(200),
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
FOREIGN KEY (activityId) REFERENCES cdm.ServiceActivity(activityId) ON DELETE CASCADE,
FOREIGN KEY (userId) REFERENCES cdm.User(userId),
FOREIGN KEY (contactId) REFERENCES cdm.Contact(contactId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- SLA AND KPI TABLES
-- ============================================================================
-- 21. SLAKPIInstance Table - SLA KPI tracking
CREATE TABLE cdm.SLAKPIInstance (
kpiInstanceId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
caseId UNIQUEIDENTIFIER NOT NULL,
kpiName NVARCHAR(200) NOT NULL,
description NVARCHAR(2000),
metric NVARCHAR(100), -- 'Response Time', 'Resolution Time', 'Customer Satisfaction'
metricValue DECIMAL(18,2),
metricUnit NVARCHAR(50), -- 'Minutes', 'Hours', 'Days', '%'
targetValue DECIMAL(18,2),
isWarning BIT DEFAULT 0,
isCritical BIT DEFAULT 0,
status NVARCHAR(50), -- 'Compliant', 'Non-Compliant', 'In Progress'
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
modifiedOn DATETIME2(7),
FOREIGN KEY (caseId) REFERENCES cdm.Case(caseId) ON DELETE CASCADE
);
-- ============================================================================
-- KNOWLEDGE BASE TABLES
-- ============================================================================
-- 22. KnowledgeArticle Table - Knowledge base articles
CREATE TABLE cdm.KnowledgeArticle (
articleId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
title NVARCHAR(500) NOT NULL,
content NVARCHAR(MAX),
category NVARCHAR(100),
keywords NVARCHAR(500),
authorUserId UNIQUEIDENTIFIER,
status NVARCHAR(50) NOT NULL DEFAULT 'Draft', -- 'Draft', 'Published', 'Expired'
publishedDate DATETIME2(7),
expirationDate DATETIME2(7),
viewCount INT DEFAULT 0,
isActive BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (authorUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- 23. KnowledgeArticleIncident Table - Association between articles and cases
CREATE TABLE cdm.KnowledgeArticleIncident (
associationId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
articleId UNIQUEIDENTIFIER NOT NULL,
caseId UNIQUEIDENTIFIER NOT NULL,
isResolved BIT DEFAULT 0,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
UNIQUE (articleId, caseId),
FOREIGN KEY (articleId) REFERENCES cdm.KnowledgeArticle(articleId) ON DELETE CASCADE,
FOREIGN KEY (caseId) REFERENCES cdm.Case(caseId) ON DELETE CASCADE,
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId)
);
-- 24. IncidentKnowledgeBaseRecord Table - Knowledge base records for incidents
CREATE TABLE cdm.IncidentKnowledgeBaseRecord (
recordId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
caseId UNIQUEIDENTIFIER NOT NULL,
articleId UNIQUEIDENTIFIER NOT NULL,
notes NVARCHAR(2000),
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
FOREIGN KEY (caseId) REFERENCES cdm.Case(caseId) ON DELETE CASCADE,
FOREIGN KEY (articleId) REFERENCES cdm.KnowledgeArticle(articleId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- ACTIVITY TABLES (Generic Activities)
-- ============================================================================
-- 25. Task Table - Generic task activities
CREATE TABLE cdm.Task (
taskId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
subject NVARCHAR(200) NOT NULL,
description NVARCHAR(MAX),
priority NVARCHAR(50) NOT NULL DEFAULT 'Medium',
status NVARCHAR(50) NOT NULL DEFAULT 'Open', -- 'Open', 'In Progress', 'Completed', 'Cancelled'
dueDate DATE,
ownerUserId UNIQUEIDENTIFIER NOT NULL,
caseId UNIQUEIDENTIFIER,
contactId UNIQUEIDENTIFIER,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
modifiedOn DATETIME2(7),
modifiedBy UNIQUEIDENTIFIER,
FOREIGN KEY (ownerUserId) REFERENCES cdm.User(userId),
FOREIGN KEY (caseId) REFERENCES cdm.Case(caseId),
FOREIGN KEY (contactId) REFERENCES cdm.Contact(contactId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId),
FOREIGN KEY (modifiedBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- RESOURCE EXPANSION TABLES
-- ============================================================================
-- 26. ResourceExpansion Table - Resource expansion configurations
CREATE TABLE cdm.ResourceExpansion (
expansionId UNIQUEIDENTIFIER PRIMARY KEY DEFAULT NEWID(),
resourceId UNIQUEIDENTIFIER NOT NULL,
resourceSpecificationId UNIQUEIDENTIFIER,
isIncluded BIT DEFAULT 1,
createdOn DATETIME2(7) DEFAULT GETUTCDATE(),
createdBy UNIQUEIDENTIFIER,
UNIQUE (resourceId, resourceSpecificationId),
FOREIGN KEY (resourceId) REFERENCES cdm.Resource(resourceId) ON DELETE CASCADE,
FOREIGN KEY (resourceSpecificationId) REFERENCES cdm.ResourceSpecification(specificationId),
FOREIGN KEY (createdBy) REFERENCES cdm.User(userId)
);
-- ============================================================================
-- INDEXES FOR PERFORMANCE
-- ============================================================================
-- User indexes
CREATE NONCLUSTERED INDEX IX_User_Email ON cdm.User(email);
CREATE NONCLUSTERED INDEX IX_User_IsActive ON cdm.User(isActive);
-- Site indexes
CREATE NONCLUSTERED INDEX IX_Site_IsActive ON cdm.Site(isActive);
-- Account indexes
CREATE NONCLUSTERED INDEX IX_Account_ParentAccountId ON cdm.Account(parentAccountId);
CREATE NONCLUSTERED INDEX IX_Account_OwnerUserId ON cdm.Account(ownerUserId);
CREATE NONCLUSTERED INDEX IX_Account_IsActive ON cdm.Account(isActive);
CREATE NONCLUSTERED INDEX IX_Account_AccountType ON cdm.Account(accountType);
-- Contact indexes
CREATE NONCLUSTERED INDEX IX_Contact_AccountId ON cdm.Contact(accountId);
CREATE NONCLUSTERED INDEX IX_Contact_Email ON cdm.Contact(email);
CREATE NONCLUSTERED INDEX IX_Contact_IsActive ON cdm.Contact(isActive);
-- Service indexes
CREATE NONCLUSTERED INDEX IX_Service_IsActive ON cdm.Service(isActive);
-- Resource indexes
CREATE NONCLUSTERED INDEX IX_Resource_ResourceType ON cdm.Resource(resourceType);
CREATE NONCLUSTERED INDEX IX_Resource_IsActive ON cdm.Resource(isActive);
-- Contract indexes
CREATE NONCLUSTERED INDEX IX_Contract_AccountId ON cdm.Contract(accountId);
CREATE NONCLUSTERED INDEX IX_Contract_OwnerUserId ON cdm.Contract(ownerUserId);
CREATE NONCLUSTERED INDEX IX_Contract_Status ON cdm.Contract(status);
CREATE NONCLUSTERED INDEX IX_Contract_DateRange ON cdm.Contract(startDate, endDate);
-- ContractLine indexes
CREATE NONCLUSTERED INDEX IX_ContractLine_ServiceId ON cdm.ContractLine(serviceId);
-- Entitlement indexes
CREATE NONCLUSTERED INDEX IX_Entitlement_AccountId ON cdm.Entitlement(accountId);
CREATE NONCLUSTERED INDEX IX_Entitlement_Status ON cdm.Entitlement(status);
CREATE NONCLUSTERED INDEX IX_Entitlement_DateRange ON cdm.Entitlement(startDate, endDate);
-- Case indexes
CREATE NONCLUSTERED INDEX IX_Case_CaseNumber ON cdm.Case(caseNumber);
CREATE NONCLUSTERED INDEX IX_Case_AccountId ON cdm.Case(accountId);
CREATE NONCLUSTERED INDEX IX_Case_ContactId ON cdm.Case(contactId);
CREATE NONCLUSTERED INDEX IX_Case_OwnerUserId ON cdm.Case(ownerUserId);
CREATE NONCLUSTERED INDEX IX_Case_Status ON cdm.Case(status);
CREATE NONCLUSTERED INDEX IX_Case_Priority ON cdm.Case(priority);
CREATE NONCLUSTERED INDEX IX_Case_CreatedDate ON cdm.Case(createdDate);
CREATE NONCLUSTERED INDEX IX_Case_ParentCaseId ON cdm.Case(parentCaseId);
-- ServiceActivity indexes
CREATE NONCLUSTERED INDEX IX_ServiceActivity_CaseId ON cdm.ServiceActivity(caseId);
CREATE NONCLUSTERED INDEX IX_ServiceActivity_ContactId ON cdm.ServiceActivity(contactId);
CREATE NONCLUSTERED INDEX IX_ServiceActivity_OwnerUserId ON cdm.ServiceActivity(ownerUserId);
CREATE NONCLUSTERED INDEX IX_ServiceActivity_Status ON cdm.ServiceActivity(status);
CREATE NONCLUSTERED INDEX IX_ServiceActivity_TimeRange ON cdm.ServiceActivity(startTime, endTime);
-- Task indexes
CREATE NONCLUSTERED INDEX IX_Task_OwnerUserId ON cdm.Task(ownerUserId);
CREATE NONCLUSTERED INDEX IX_Task_CaseId ON cdm.Task(caseId);
CREATE NONCLUSTERED INDEX IX_Task_Status ON cdm.Task(status);
CREATE NONCLUSTERED INDEX IX_Task_DueDate ON cdm.Task(dueDate);
-- KnowledgeArticle indexes
CREATE NONCLUSTERED INDEX IX_KnowledgeArticle_Status ON cdm.KnowledgeArticle(status);
CREATE NONCLUSTERED INDEX IX_KnowledgeArticle_Category ON cdm.KnowledgeArticle(category);
-- SLAKPIInstance indexes
CREATE NONCLUSTERED INDEX IX_SLAKPIInstance_CaseId ON cdm.SLAKPIInstance(caseId);
CREATE NONCLUSTERED INDEX IX_SLAKPIInstance_Status ON cdm.SLAKPIInstance(status);
GO
-- ============================================================================
-- SAMPLE DATA
-- ============================================================================
-- Sample Users
INSERT INTO cdm.User (userId, userName, firstName, lastName, email, phone, isActive)
VALUES
(NEWID(), 'jsmith', 'John', 'Smith', 'john.smith@company.com', '555-0101', 1),
(NEWID(), 'mwhite', 'Maria', 'White', 'maria.white@company.com', '555-0102', 1),
(NEWID(), 'rjones', 'Robert', 'Jones', 'robert.jones@company.com', '555-0103', 1),
(NEWID(), 'sbrown', 'Sarah', 'Brown', 'sarah.brown@company.com', '555-0104', 1),
(NEWID(), 'mtaylor', 'Michael', 'Taylor', 'michael.taylor@company.com', '555-0105', 1);
DECLARE @UserId1 UNIQUEIDENTIFIER = (SELECT TOP 1 userId FROM cdm.User WHERE userName = 'jsmith');
DECLARE @UserId2 UNIQUEIDENTIFIER = (SELECT TOP 1 userId FROM cdm.User WHERE userName = 'mwhite');
DECLARE @UserId3 UNIQUEIDENTIFIER = (SELECT TOP 1 userId FROM cdm.User WHERE userName = 'rjones');
-- Sample Sites
INSERT INTO cdm.Site (siteId, siteName, description, city, stateProvince, country, phone, createdBy)
VALUES
(NEWID(), 'New York Office', 'Main headquarters', 'New York', 'NY', 'USA', '555-0200', @UserId1),
(NEWID(), 'Los Angeles Office', 'West coast support center', 'Los Angeles', 'CA', 'USA', '555-0201', @UserId1),
(NEWID(), 'Chicago Office', 'Midwest operations', 'Chicago', 'IL', 'USA', '555-0202', @UserId1);
DECLARE @SiteId1 UNIQUEIDENTIFIER = (SELECT TOP 1 siteId FROM cdm.Site WHERE siteName = 'New York Office');
DECLARE @SiteId2 UNIQUEIDENTIFIER = (SELECT TOP 1 siteId FROM cdm.Site WHERE siteName = 'Los Angeles Office');
-- Sample Accounts
INSERT INTO cdm.Account (accountId, accountName, accountNumber, description, email, phone, ownerUserId, siteId, accountType, industry, numberOfEmployees, isActive, createdBy)
VALUES
(NEWID(), 'Acme Corporation', 'ACC-001', 'Leading manufacturing company', 'contact@acme.com', '555-1001', @UserId1, @SiteId1, 'Customer', 'Manufacturing', 500, 1, @UserId1),
(NEWID(), 'TechVision Inc', 'ACC-002', 'Software development services', 'info@techvision.com', '555-1002', @UserId2, @SiteId2, 'Customer', 'Technology', 250, 1, @UserId1),
(NEWID(), 'Global Services Ltd', 'ACC-003', 'Consulting and support services', 'contact@globalservices.com', '555-1003', @UserId3, @SiteId1, 'Customer', 'Consulting', 1000, 1, @UserId1),
(NEWID(), 'StartupX', 'ACC-004', 'Early stage technology startup', 'hello@startupx.com', '555-1004', @UserId2, @SiteId2, 'Prospect', 'Technology', 50, 1, @UserId1);
DECLARE @AccountId1 UNIQUEIDENTIFIER = (SELECT TOP 1 accountId FROM cdm.Account WHERE accountName = 'Acme Corporation');
DECLARE @AccountId2 UNIQUEIDENTIFIER = (SELECT TOP 1 accountId FROM cdm.Account WHERE accountName = 'TechVision Inc');
DECLARE @AccountId3 UNIQUEIDENTIFIER = (SELECT TOP 1 accountId FROM cdm.Account WHERE accountName = 'Global Services Ltd');
-- Sample Contacts
INSERT INTO cdm.Contact (contactId, firstName, lastName, email, phone, accountId, ownerUserId, jobTitle, department, isActive, createdBy)
VALUES
(NEWID(), 'Alice', 'Johnson', 'alice.johnson@acme.com', '555-1101', @AccountId1, @UserId1, 'Manager', 'Operations', 1, @UserId1),
(NEWID(), 'Bob', 'Williams', 'bob.williams@acme.com', '555-1102', @AccountId1, @UserId1, 'Director', 'IT', 1, @UserId1),
(NEWID(), 'Carol', 'Davis', 'carol.davis@techvision.com', '555-1103', @AccountId2, @UserId2, 'Project Manager', 'Services', 1, @UserId1),
(NEWID(), 'David', 'Miller', 'david.miller@globalservices.com', '555-1104', @AccountId3, @UserId3, 'CTO', 'Technology', 1, @UserId1),
(NEWID(), 'Emma', 'Wilson', 'emma.wilson@startupx.com', '555-1105', (SELECT TOP 1 accountId FROM cdm.Account WHERE accountName = 'StartupX'), @UserId2, 'CEO', 'Executive', 1, @UserId1);
DECLARE @ContactId1 UNIQUEIDENTIFIER = (SELECT TOP 1 contactId FROM cdm.Contact WHERE firstName = 'Alice');
DECLARE @ContactId2 UNIQUEIDENTIFIER = (SELECT TOP 1 contactId FROM cdm.Contact WHERE firstName = 'Carol');
-- Sample Services
INSERT INTO cdm.Service (serviceId, serviceName, description, isActive, createdBy)
VALUES
(NEWID(), 'Technical Support', 'On-demand technical support for systems and applications', 1, @UserId1),
(NEWID(), 'Installation Service', 'Professional installation and setup of products', 1, @UserId1),
(NEWID(), 'Maintenance & Updates', 'Regular maintenance and software updates', 1, @UserId1),
(NEWID(), 'Training & Consulting', 'Professional training and consulting services', 1, @UserId1),
(NEWID(), 'Premium Support', '24/7 premium support with SLA guarantees', 1, @UserId1);
DECLARE @ServiceId1 UNIQUEIDENTIFIER = (SELECT TOP 1 serviceId FROM cdm.Service WHERE serviceName = 'Technical Support');
DECLARE @ServiceId2 UNIQUEIDENTIFIER = (SELECT TOP 1 serviceId FROM cdm.Service WHERE serviceName = 'Installation Service');
DECLARE @ServiceId3 UNIQUEIDENTIFIER = (SELECT TOP 1 serviceId FROM cdm.Service WHERE serviceName = 'Premium Support');
-- Sample Resources
INSERT INTO cdm.Resource (resourceId, resourceName, description, resourceType, userId, isActive, createdBy)
VALUES
(NEWID(), 'John Smith - Support', 'Senior Support Technician', 'User', @UserId1, 1, @UserId1),
(NEWID(), 'Maria White - Support', 'Support Engineer', 'User', @UserId2, 1, @UserId1),
(NEWID(), 'Robert Jones - Support', 'Support Manager', 'User', @UserId3, 1, @UserId1),
(NEWID(), 'Conference Room A', 'Medium capacity meeting room', 'Facility', NULL, 1, @UserId1),
(NEWID(), 'Support Terminal 1', 'Customer support workstation', 'Equipment', NULL, 1, @UserId1);
-- Sample Contracts
INSERT INTO cdm.Contract (contractId, contractNumber, contractName, accountId, ownerUserId, startDate, endDate, status, contractValue, contractType, isActive, createdBy)
VALUES
(NEWID(), 'CNT-2024-001', 'Acme Annual Support Contract', @AccountId1, @UserId1, '2024-01-01', '2024-12-31', 'Active', 50000.00, 'Support', 1, @UserId1),
(NEWID(), 'CNT-2024-002', 'TechVision Premium Service', @AccountId2, @UserId2, '2024-03-01', '2025-02-28', 'Active', 75000.00, 'Service', 1, @UserId1),
(NEWID(), 'CNT-2024-003', 'Global Services Maintenance', @AccountId3, @UserId3, '2024-01-01', '2024-12-31', 'Active', 100000.00, 'Maintenance', 1, @UserId1);
DECLARE @ContractId1 UNIQUEIDENTIFIER = (SELECT TOP 1 contractId FROM cdm.Contract WHERE contractNumber = 'CNT-2024-001');
DECLARE @ContractId2 UNIQUEIDENTIFIER = (SELECT TOP 1 contractId FROM cdm.Contract WHERE contractNumber = 'CNT-2024-002');
-- Sample Contract Lines
INSERT INTO cdm.ContractLine (contractLineId, contractId, lineNumber, serviceId, description, quantityIncluded, quantityUsed, price)
VALUES
(NEWID(), @ContractId1, 1, @ServiceId1, 'Technical Support - 100 hours', 100, 25, 5000.00),
(NEWID(), @ContractId1, 2, @ServiceId3, 'Premium 24/7 Support', NULL, NULL, 20000.00),
(NEWID(), @ContractId2, 1, @ServiceId2, 'Installation Services - 5 installations', 5, 2, 10000.00),
(NEWID(), @ContractId2, 2, @ServiceId1, 'Technical Support - 200 hours', 200, 45, 15000.00);
-- Sample Entitlements
INSERT INTO cdm.Entitlement (entitlementId, entitlementName, description, accountId, startDate, endDate, type, duration, unitType, unitCount, status, isActive, createdBy)
VALUES
(NEWID(), 'Acme - Silver Support', 'Silver tier support entitlement', @AccountId1, '2024-01-01', '2024-12-31', 'Support', 365, 'Cases', 50, 'Active', 1, @UserId1),
(NEWID(), 'Acme - Gold Support', 'Gold tier support entitlement', @AccountId1, '2024-01-01', '2024-12-31', 'Support', 365, 'Hours', 200, 'Active', 1, @UserId1),
(NEWID(), 'TechVision - Platinum', 'Platinum service entitlement', @AccountId2, '2024-03-01', '2025-02-28', 'Service', 365, 'Cases', 100, 'Active', 1, @UserId1);
DECLARE @EntitlementId1 UNIQUEIDENTIFIER = (SELECT TOP 1 entitlementId FROM cdm.Entitlement WHERE entitlementName = 'Acme - Silver Support');
-- Sample Cases
INSERT INTO cdm.Case (caseId, caseNumber, title, description, priority, severity, status, accountId, contactId, ownerUserId, contractId, entitlementId, createdDate, emailAddress, isActive, createdBy)
VALUES
(NEWID(), 'CSE-2024-0001', 'System Login Issues', 'Users unable to login to the main system', 'High', 'High', 'Active', @AccountId1, @ContactId1, @UserId1, @ContractId1, @EntitlementId1, GETUTCDATE(), 'alice.johnson@acme.com', 1, @UserId1),
(NEWID(), 'CSE-2024-0002', 'Database Performance', 'Database queries running slowly', 'Medium', 'Medium', 'Active', @AccountId1, @ContactId1, @UserId2, @ContractId1, @EntitlementId1, GETUTCDATE(), 'alice.johnson@acme.com', 1, @UserId1),
(NEWID(), 'CSE-2024-0003', 'Software Installation Request', 'Need to install new version of software', 'Low', 'Low', 'Waiting', @AccountId2, @ContactId2, @UserId2, @ContractId2, NULL, GETUTCDATE(), 'carol.davis@techvision.com', 1, @UserId1),
(NEWID(), 'CSE-2024-0004', 'Data Import Error', 'Error importing data from CSV file', 'High', 'High', 'Active', @AccountId3, NULL, @UserId3, NULL, NULL, GETUTCDATE(), NULL, 1, @UserId1);
DECLARE @CaseId1 UNIQUEIDENTIFIER = (SELECT TOP 1 caseId FROM cdm.Case WHERE caseNumber = 'CSE-2024-0001');
DECLARE @CaseId2 UNIQUEIDENTIFIER = (SELECT TOP 1 caseId FROM cdm.Case WHERE caseNumber = 'CSE-2024-0002');
DECLARE @CaseId3 UNIQUEIDENTIFIER = (SELECT TOP 1 caseId FROM cdm.Case WHERE caseNumber = 'CSE-2024-0003');
-- Sample ServiceActivities
INSERT INTO cdm.ServiceActivity (activityId, subject, description, serviceId, caseId, contactId, ownerUserId, startTime, endTime, duration, location, status, isActive, createdBy)
VALUES
(NEWID(), 'Initial Diagnosis - System Login', 'Initial investigation of login issues', @ServiceId1, @CaseId1, @ContactId1, @UserId1, '2024-09-23 10:00:00', '2024-09-23 11:30:00', 90, 'Remote', 'Completed', 1, @UserId1),
(NEWID(), 'Database Performance Review', 'Performance analysis and optimization', @ServiceId1, @CaseId2, @ContactId1, @UserId2, '2024-09-23 14:00:00', '2024-09-23 16:00:00', 120, 'Remote', 'Scheduled', 1, @UserId1),
(NEWID(), 'Software Installation', 'Install new software version', @ServiceId2, @CaseId3, @ContactId2, @UserId3, '2024-09-24 09:00:00', '2024-09-24 12:00:00', 180, 'On-site', 'Scheduled', 1, @UserId1);
-- Sample Tasks
INSERT INTO cdm.Task (taskId, subject, description, priority, status, dueDate, ownerUserId, caseId, createdBy)
VALUES
(NEWID(), 'Verify System Login Fix', 'Test login functionality after fix', 'High', 'In Progress', '2024-09-24', @UserId1, @CaseId1, @UserId1),
(NEWID(), 'Gather Database Metrics', 'Collect database performance metrics', 'Medium', 'Open', '2024-09-25', @UserId2, @CaseId2, @UserId1),
(NEWID(), 'Prepare Installation Package', 'Package software for installation', 'Medium', 'Completed', '2024-09-23', @UserId3, @CaseId3, @UserId1),
(NEWID(), 'Follow-up with Customer', 'Confirm resolution satisfaction', 'Low', 'Open', '2024-09-26', @UserId1, @CaseId1, @UserId1);
-- Sample Knowledge Articles
INSERT INTO cdm.KnowledgeArticle (articleId, title, content, category, keywords, authorUserId, status, publishedDate, isActive, createdBy)
VALUES
(NEWID(), 'How to Reset System Login', 'Step-by-step guide for resetting system login credentials...', 'User Management', 'login, reset, credentials', @UserId1, 'Published', GETUTCDATE(), 1, @UserId1),
(NEWID(), 'Database Query Optimization Tips', 'Best practices for optimizing database queries...', 'Database', 'database, query, optimization, performance', @UserId2, 'Published', GETUTCDATE(), 1, @UserId1),
(NEWID(), 'Software Installation Guide', 'Complete software installation procedures...', 'Installation', 'installation, setup, software', @UserId3, 'Published', GETUTCDATE(), 1, @UserId1),
(NEWID(), 'Troubleshooting Common Issues', 'Common issues and their solutions...', 'Troubleshooting', 'troubleshooting, errors, solutions', @UserId1, 'Draft', NULL, 1, @UserId1);
-- Sample SLA KPI Instances
INSERT INTO cdm.SLAKPIInstance (kpiInstanceId, caseId, kpiName, metric, metricValue, metricUnit, targetValue, status)
VALUES
(NEWID(), @CaseId1, 'First Response Time', 'Response Time', 30, 'Minutes', 60, 'Compliant'),
(NEWID(), @CaseId1, 'Resolution Time', 'Resolution Time', 480, 'Minutes', 1440, 'Compliant'),
(NEWID(), @CaseId2, 'First Response Time', 'Response Time', 45, 'Minutes', 60, 'Compliant'),
(NEWID(), @CaseId3, 'First Response Time', 'Response Time', 120, 'Minutes', 120, 'In Progress');
-- Sample Case Resolution
INSERT INTO cdm.CaseResolution (resolutionId, caseId, description, resolutionType, resolutionStatus, billingStatus, actualServiceDuration, totalCostAmount, createdBy)
VALUES
(NEWID(), @CaseId1, 'System login issue was caused by expired SSL certificate. Certificate updated and login functionality restored.', 'Technical Resolution', 'Resolved', 'Billable', 90, 500.00, @UserId1);
GO
-- ============================================================================
-- VIEWS FOR COMMON QUERIES
-- ============================================================================
-- View: Active Cases Summary
CREATE VIEW cdm.v_ActiveCasesSummary AS
SELECT
c.caseNumber,
c.title,
c.priority,
c.status,
a.accountName,
ct.firstName + ' ' + ct.lastName AS contactName,
u.firstName + ' ' + u.lastName AS ownerName,
c.createdDate,
DATEDIFF(DAY, c.createdDate, GETUTCDATE()) AS daysSinceCreation
FROM cdm.Case c
LEFT JOIN cdm.Account a ON c.accountId = a.accountId
LEFT JOIN cdm.Contact ct ON c.contactId = ct.contactId
LEFT JOIN cdm.[User] u ON c.ownerUserId = u.userId
WHERE c.status IN ('Active', 'Waiting') AND c.isActive = 1;
-- View: Contract Summary
CREATE VIEW cdm.v_ContractSummary AS
SELECT
c.contractNumber,
c.contractName,
a.accountName,
c.startDate,
c.endDate,
c.status,
c.contractValue,
COUNT(cl.contractLineId) AS lineCount,
u.firstName + ' ' + u.lastName AS owner
FROM cdm.Contract c
LEFT JOIN cdm.Account a ON c.accountId = a.accountId
LEFT JOIN cdm.ContractLine cl ON c.contractId = cl.contractId
LEFT JOIN cdm.[User] u ON c.ownerUserId = u.userId
GROUP BY c.contractId, c.contractNumber, c.contractName, a.accountName, c.startDate, c.endDate, c.status, c.contractValue, u.firstName, u.lastName;
-- View: Case Service Activity
CREATE VIEW cdm.v_CaseServiceActivity AS
SELECT
c.caseNumber,
c.title,
sa.subject,
s.serviceName,
u.firstName + ' ' + u.lastName AS technician,
sa.startTime,
sa.endTime,
sa.duration,
sa.status
FROM cdm.Case c
INNER JOIN cdm.ServiceActivity sa ON c.caseId = sa.caseId
INNER JOIN cdm.Service s ON sa.serviceId = s.serviceId
LEFT JOIN cdm.[User] u ON sa.ownerUserId = u.userId
WHERE c.isActive = 1;
-- View: Customer Support Status
CREATE VIEW cdm.v_CustomerSupportStatus AS
SELECT
a.accountName,
COUNT(DISTINCT c.caseId) AS totalCases,
SUM(CASE WHEN c.status = 'Active' THEN 1 ELSE 0 END) AS activeCases,
SUM(CASE WHEN c.status = 'Resolved' THEN 1 ELSE 0 END) AS resolvedCases,
SUM(CASE WHEN c.status = 'Closed' THEN 1 ELSE 0 END) AS closedCases,
COUNT(DISTINCT e.entitlementId) AS activeEntitlements
FROM cdm.Account a
LEFT JOIN cdm.Case c ON a.accountId = c.accountId
LEFT JOIN cdm.Entitlement e ON a.accountId = e.accountId AND e.status = 'Active'
GROUP BY a.accountId, a.accountName;
GO
PRINT '========================================';
PRINT 'CDM Customer Service Database Created Successfully!';
PRINT '========================================';
PRINT 'Total Tables: 26';
PRINT 'Tables include:';
PRINT ' - Foundation: User, Site, Account, Contact';
PRINT ' - Services: Service, Resource, FacilityEquipment, SchedulingGroup, ResourceSpecification';
PRINT ' - Contracts: Contract, ContractLine, ServiceContractContact';
PRINT ' - Entitlements: Entitlement, EntitlementContact, EntitlementProduct';
PRINT ' - Cases: Case, CaseResolution, ChildIncidentCount';
PRINT ' - Activities: ServiceActivity, ActivityParty, Task';
PRINT ' - Knowledge: KnowledgeArticle, KnowledgeArticleIncident, IncidentKnowledgeBaseRecord';
PRINT ' - SLA: SLAKPIInstance';
PRINT ' - Other: ResourceExpansion';
PRINT 'Views: 4 (v_ActiveCasesSummary, v_ContractSummary, v_CaseServiceActivity, v_CustomerSupportStatus)';
PRINT '========================================';