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:
co-authored by
Claude Opus 5.5
parent
ef38a502d8
commit
3b371cdb28
@@ -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 '========================================';
|
||||
Reference in New Issue
Block a user