Files
secondbrain/CDM_Generate_Bulk_Data.sql
Ravi ReddyandClaude Opus 5.5 3b371cdb28 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>
2026-10-03 22:22:10 +05:30

756 lines
34 KiB
Transact-SQL

-- Microsoft Common Data Model - Customer Service
-- Bulk Data Generation Script - 100x Sample Data Over 3 Months
-- Version: 1.0
-- Generates realistic data spread over the last 3 months
USE CDM_CustomerService;
GO
PRINT '========================================';
PRINT 'Starting Bulk Data Generation...';
PRINT '========================================';
PRINT '';
DECLARE @StartDate DATE = DATEADD(MONTH, -3, CAST(GETUTCDATE() AS DATE));
DECLARE @EndDate DATE = CAST(GETUTCDATE() AS DATE);
DECLARE @i INT = 0;
DECLARE @j INT = 0;
DECLARE @RandomDate DATETIME2;
DECLARE @RandomUserId UNIQUEIDENTIFIER;
DECLARE @RandomAccountId UNIQUEIDENTIFIER;
DECLARE @RandomContactId UNIQUEIDENTIFIER;
DECLARE @RandomServiceId UNIQUEIDENTIFIER;
DECLARE @RandomResourceId UNIQUEIDENTIFIER;
DECLARE @RandomContractId UNIQUEIDENTIFIER;
DECLARE @RandomEntitlementId UNIQUEIDENTIFIER;
-- ============================================================================
-- CLEAR EXISTING SAMPLE DATA (OPTIONAL - COMMENT OUT IF YOU WANT TO KEEP IT)
-- ============================================================================
PRINT 'Clearing existing sample data...';
DELETE FROM cdm.SLAKPIInstance;
DELETE FROM cdm.CaseResolution;
DELETE FROM cdm.IncidentKnowledgeBaseRecord;
DELETE FROM cdm.KnowledgeArticleIncident;
DELETE FROM cdm.ActivityParty;
DELETE FROM cdm.ServiceActivity;
DELETE FROM cdm.Task;
DELETE FROM cdm.[Case];
DELETE FROM cdm.ChildIncidentCount;
DELETE FROM cdm.EntitlementProduct;
DELETE FROM cdm.EntitlementContact;
DELETE FROM cdm.Entitlement;
DELETE FROM cdm.ServiceContractContact;
DELETE FROM cdm.ContractLine;
DELETE FROM cdm.Contract;
DELETE FROM cdm.ResourceExpansion;
DELETE FROM cdm.ResourceSpecification;
DELETE FROM cdm.SchedulingGroup;
DELETE FROM cdm.FacilityEquipment;
DELETE FROM cdm.Resource;
DELETE FROM cdm.Service;
DELETE FROM cdm.Contact;
DELETE FROM cdm.Account;
DELETE FROM cdm.Site;
PRINT 'Existing sample data cleared.';
PRINT '';
-- ============================================================================
-- GENERATE USERS (20 total)
-- ============================================================================
PRINT 'Generating 20 Users...';
SET @i = 1;
INSERT INTO cdm.[User] (userName, firstName, lastName, email, phone, mobilePhone, isActive)
VALUES
('jsmith', 'John', 'Smith', 'john.smith@company.com', '555-0101', '555-6001', 1),
('mwhite', 'Maria', 'White', 'maria.white@company.com', '555-0102', '555-6002', 1),
('rjones', 'Robert', 'Jones', 'robert.jones@company.com', '555-0103', '555-6003', 1),
('sbrown', 'Sarah', 'Brown', 'sarah.brown@company.com', '555-0104', '555-6004', 1),
('mtaylor', 'Michael', 'Taylor', 'michael.taylor@company.com', '555-0105', '555-6005', 1),
('ejones', 'Emily', 'Jones', 'emily.jones@company.com', '555-0106', '555-6006', 1),
('dmiller', 'David', 'Miller', 'david.miller@company.com', '555-0107', '555-6007', 1),
('jwilson', 'James', 'Wilson', 'james.wilson@company.com', '555-0108', '555-6008', 1),
('agarcia', 'Angela', 'Garcia', 'angela.garcia@company.com', '555-0109', '555-6009', 1),
('crodriguez', 'Carlos', 'Rodriguez', 'carlos.rodriguez@company.com', '555-0110', '555-6010', 1),
('lmartinez', 'Lisa', 'Martinez', 'lisa.martinez@company.com', '555-0111', '555-6011', 1),
('phuang', 'Peter', 'Huang', 'peter.huang@company.com', '555-0112', '555-6012', 1),
('ktran', 'Kim', 'Tran', 'kim.tran@company.com', '555-0113', '555-6013', 1),
('nsingh', 'Nisha', 'Singh', 'nisha.singh@company.com', '555-0114', '555-6014', 1),
('opatel', 'Omkar', 'Patel', 'omkar.patel@company.com', '555-0115', '555-6015', 1),
('rkim', 'Rachel', 'Kim', 'rachel.kim@company.com', '555-0116', '555-6016', 1),
('tfernandez', 'Thomas', 'Fernandez', 'thomas.fernandez@company.com', '555-0117', '555-6017', 1),
('vlee', 'Victoria', 'Lee', 'victoria.lee@company.com', '555-0118', '555-6018', 1),
('wchen', 'William', 'Chen', 'william.chen@company.com', '555-0119', '555-6019', 1),
('ylopez', 'Yolanda', 'Lopez', 'yolanda.lopez@company.com', '555-0120', '555-6020', 1);
PRINT 'Users generated: 20';
PRINT '';
-- ============================================================================
-- GENERATE SITES (15 total)
-- ============================================================================
PRINT 'Generating 15 Sites...';
INSERT INTO cdm.Site (siteName, description, city, stateProvince, country, phone, email, isHeadquarters, createdBy)
SELECT 'New York Office', 'Main headquarters', 'New York', 'NY', 'USA', '555-0200', 'ny@company.com', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Los Angeles Office', 'West coast support center', 'Los Angeles', 'CA', 'USA', '555-0201', 'la@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Chicago Office', 'Midwest operations', 'Chicago', 'IL', 'USA', '555-0202', 'chi@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Houston Office', 'South operations', 'Houston', 'TX', 'USA', '555-0203', 'hou@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Phoenix Office', 'Southwest operations', 'Phoenix', 'AZ', 'USA', '555-0204', 'phx@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Philadelphia Office', 'Northeast operations', 'Philadelphia', 'PA', 'USA', '555-0205', 'phi@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'San Antonio Office', 'Texas operations', 'San Antonio', 'TX', 'USA', '555-0206', 'sat@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'San Diego Office', 'California operations', 'San Diego', 'CA', 'USA', '555-0207', 'sdi@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Dallas Office', 'Texas headquarters', 'Dallas', 'TX', 'USA', '555-0208', 'dal@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'San Jose Office', 'Silicon Valley', 'San Jose', 'CA', 'USA', '555-0209', 'sjc@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Austin Office', 'Tech hub', 'Austin', 'TX', 'USA', '555-0210', 'ats@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Jacksonville Office', 'Southeast operations', 'Jacksonville', 'FL', 'USA', '555-0211', 'jax@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Fort Worth Office', 'Texas operations', 'Fort Worth', 'TX', 'USA', '555-0212', 'ftw@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Columbus Office', 'Midwest operations', 'Columbus', 'OH', 'USA', '555-0213', 'cmh@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Charlotte Office', 'Southeast operations', 'Charlotte', 'NC', 'USA', '555-0214', 'clt@company.com', 0, TOP 1 userId FROM cdm.[User] ORDER BY NEWID();
PRINT 'Sites generated: 15';
PRINT '';
-- ============================================================================
-- GENERATE ACCOUNTS (400 total)
-- ============================================================================
PRINT 'Generating 400 Accounts...';
DECLARE @AccountIndex INT = 1;
DECLARE @SiteId UNIQUEIDENTIFIER;
DECLARE @OwnerId UNIQUEIDENTIFIER;
WHILE @AccountIndex <= 400
BEGIN
SELECT @SiteId = siteId FROM cdm.Site ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @OwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
INSERT INTO cdm.Account
(accountName, accountNumber, description, email, phone, ownerUserId, siteId, accountType, industry, numberOfEmployees, revenue, isActive)
VALUES
('Account ' + CAST(@AccountIndex AS VARCHAR(5)),
'ACC-' + RIGHT('0000' + CAST(@AccountIndex AS VARCHAR(5)), 5),
'Customer account ' + CAST(@AccountIndex AS VARCHAR(5)),
'contact' + CAST(@AccountIndex AS VARCHAR(5)) + '@customer.com',
'555-' + RIGHT('0000' + CAST(2000 + @AccountIndex AS VARCHAR(5)), 4),
@OwnerId,
@SiteId,
CASE WHEN @AccountIndex % 5 = 0 THEN 'Prospect' ELSE 'Customer' END,
CHOOSE(@AccountIndex % 10 + 1, 'Technology', 'Manufacturing', 'Finance', 'Healthcare', 'Retail', 'Consulting', 'Telecommunications', 'Education', 'Government', 'Energy'),
CAST(ABS(CHECKSUM(NEWID())) % 5000 + 50 AS INT),
CAST(ABS(CHECKSUM(NEWID())) % 10000000 + 100000 AS DECIMAL(18,2)),
1);
SET @AccountIndex = @AccountIndex + 1;
END
PRINT 'Accounts generated: 400';
PRINT '';
-- ============================================================================
-- GENERATE CONTACTS (500 total - ~1.25 per account)
-- ============================================================================
PRINT 'Generating 500 Contacts...';
DECLARE @ContactIndex INT = 1;
DECLARE @AccountId UNIQUEIDENTIFIER;
DECLARE @ContactOwnerId UNIQUEIDENTIFIER;
DECLARE @FirstNames TABLE (name NVARCHAR(50));
DECLARE @LastNames TABLE (name NVARCHAR(50));
INSERT INTO @FirstNames VALUES ('John'), ('Jane'), ('Michael'), ('Sarah'), ('David'), ('Emma'), ('Robert'), ('Lisa'), ('James'), ('Mary'), ('William'), ('Jennifer'), ('Richard'), ('Patricia'), ('Joseph'), ('Linda'), ('Charles'), ('Barbara'), ('Christopher'), ('Carol'), ('Daniel'), ('Margaret'), ('Matthew'), ('Susan'), ('Anthony'), ('Dorothy'), ('Mark'), ('Ashley'), ('Donald'), ('Kimberly'), ('Steven'), ('Donna'), ('Paul'), ('Carol'), ('Andrew'), ('Michelle'), ('Joshua'), ('Emily'), ('Kenneth'), ('Melissa');
INSERT INTO @LastNames VALUES ('Smith'), ('Johnson'), ('Williams'), ('Brown'), ('Jones'), ('Garcia'), ('Miller'), ('Davis'), ('Rodriguez'), ('Martinez'), ('Hernandez'), ('Lopez'), ('Gonzalez'), ('Wilson'), ('Anderson'), ('Thomas'), ('Taylor'), ('Moore'), ('Jackson'), ('Martin'), ('Lee'), ('Perez'), ('Thompson'), ('White'), ('Harris'), ('Sanchez'), ('Clark'), ('Ramirez'), ('Lewis'), ('Robinson'), ('Walker'), ('Young'), ('Allen'), ('King'), ('Wright'), ('Scott'), ('Torres'), ('Peterson'), ('Phillips'), ('Campbell'), ('Parker');
WHILE @ContactIndex <= 500
BEGIN
SELECT @AccountId = accountId FROM cdm.Account ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @ContactOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
INSERT INTO cdm.Contact
(firstName, lastName, email, phone, mobilePhone, accountId, ownerUserId, jobTitle, department, isActive)
VALUES
((SELECT TOP 1 name FROM @FirstNames ORDER BY NEWID()),
(SELECT TOP 1 name FROM @LastNames ORDER BY NEWID()),
'contact' + CAST(@ContactIndex AS VARCHAR(5)) + '@customer.com',
'555-' + RIGHT('0000' + CAST(3000 + @ContactIndex AS VARCHAR(5)), 4),
'555-' + RIGHT('0000' + CAST(7000 + @ContactIndex AS VARCHAR(5)), 4),
@AccountId,
@ContactOwnerId,
CHOOSE(@ContactIndex % 8 + 1, 'Manager', 'Director', 'Supervisor', 'Coordinator', 'Specialist', 'Analyst', 'Administrator', 'Executive'),
CHOOSE(@ContactIndex % 6 + 1, 'Operations', 'IT', 'Finance', 'HR', 'Sales', 'Support'),
1);
SET @ContactIndex = @ContactIndex + 1;
END
PRINT 'Contacts generated: 500';
PRINT '';
-- ============================================================================
-- GENERATE SERVICES (25 total)
-- ============================================================================
PRINT 'Generating 25 Services...';
INSERT INTO cdm.Service (serviceName, description, isActive, createdBy)
SELECT 'Technical Support', 'On-demand technical support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Installation Service', 'Professional installation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Maintenance & Updates', 'Regular maintenance', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Training & Consulting', 'Professional training', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Premium Support', '24/7 premium support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Implementation', 'System implementation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Data Migration', 'Data migration services', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Security Services', 'Security assessment', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Performance Tuning', 'System optimization', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Backup & Recovery', 'Backup services', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Integration Services', 'System integration', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Custom Development', 'Custom solutions', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Infrastructure Management', 'Infrastructure support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Cloud Services', 'Cloud deployment', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Mobile Services', 'Mobile app support', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'API Development', 'API development', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Testing Services', 'QA and testing', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Documentation', 'Technical documentation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Change Management', 'Change management', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Strategic Planning', 'IT strategy consulting', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Compliance Services', 'Compliance management', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Disaster Recovery', 'DR planning and implementation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'User Management', 'User administration', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Monitoring Services', 'System monitoring', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID() UNION ALL
SELECT 'Automation Services', 'Process automation', 1, TOP 1 userId FROM cdm.[User] ORDER BY NEWID();
PRINT 'Services generated: 25';
PRINT '';
-- ============================================================================
-- GENERATE RESOURCES (80 total)
-- ============================================================================
PRINT 'Generating 80 Resources...';
-- Generate user resources
INSERT INTO cdm.Resource (resourceName, description, resourceType, userId, isActive, createdBy)
SELECT
'Support Technician - ' + CAST(ROW_NUMBER() OVER (ORDER BY u.userId) AS VARCHAR(3)),
'Senior support technician',
'User',
u.userId,
1,
(SELECT TOP 1 userId FROM cdm.[User] ORDER BY NEWID())
FROM cdm.[User] u
WHERE u.isActive = 1;
-- Generate facility resources
INSERT INTO cdm.Resource (resourceName, description, resourceType, isActive, createdBy)
SELECT 'Conference Room ' + CHAR(64 + ROW_NUMBER() OVER (ORDER BY siteId)), 'Meeting facility', 'Facility', 1, (SELECT TOP 1 userId FROM cdm.[User] ORDER BY NEWID())
FROM cdm.Site;
-- Generate equipment resources
INSERT INTO cdm.Resource (resourceName, description, resourceType, isActive, createdBy)
SELECT
'Equipment ' + CAST(ROW_NUMBER() OVER (ORDER BY ROW_NUMBER() OVER (ORDER BY createdOn)) AS VARCHAR(3)),
'Support workstation',
'Equipment',
1,
(SELECT TOP 1 userId FROM cdm.[User] ORDER BY NEWID())
FROM (SELECT TOP 30 createdOn FROM cdm.Site) AS s;
PRINT 'Resources generated: 80+';
PRINT '';
-- ============================================================================
-- GENERATE CONTRACTS (300 total)
-- ============================================================================
PRINT 'Generating 300 Contracts...';
DECLARE @ContractIndex INT = 1;
DECLARE @ContractAccountId UNIQUEIDENTIFIER;
DECLARE @ContractOwnerId UNIQUEIDENTIFIER;
WHILE @ContractIndex <= 300
BEGIN
SELECT @ContractAccountId = accountId FROM cdm.Account WHERE accountType = 'Customer' ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @ContractOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
INSERT INTO cdm.Contract
(contractNumber, contractName, accountId, ownerUserId, startDate, endDate, status, contractValue, contractType, isActive)
VALUES
('CNT-' + FORMAT(@ContractIndex, '000000'),
'Contract ' + CAST(@ContractIndex AS VARCHAR(5)),
@ContractAccountId,
@ContractOwnerId,
DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT), @StartDate),
DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT) + 365, @StartDate),
CHOOSE(@ContractIndex % 4 + 1, 'Active', 'Active', 'Draft', 'Expired'),
CAST(ABS(CHECKSUM(NEWID())) % 500000 + 10000 AS DECIMAL(18,2)),
CHOOSE(@ContractIndex % 3 + 1, 'Support', 'Service', 'Maintenance'),
1);
SET @ContractIndex = @ContractIndex + 1;
END
PRINT 'Contracts generated: 300';
PRINT '';
-- ============================================================================
-- GENERATE CONTRACT LINES (900 total - 3 per contract)
-- ============================================================================
PRINT 'Generating 900 Contract Lines...';
INSERT INTO cdm.ContractLine (contractId, lineNumber, serviceId, description, quantityIncluded, quantityUsed, price)
SELECT
c.contractId,
ROW_NUMBER() OVER (PARTITION BY c.contractId ORDER BY s.serviceId) AS lineNumber,
s.serviceId,
'Service: ' + s.serviceName,
CAST(ABS(CHECKSUM(NEWID())) % 500 + 10 AS INT),
CAST(ABS(CHECKSUM(NEWID())) % 300 AS INT),
CAST(ABS(CHECKSUM(NEWID())) % 50000 + 1000 AS DECIMAL(18,2))
FROM cdm.Contract c
CROSS JOIN (SELECT TOP 3 serviceId FROM cdm.Service ORDER BY NEWID()) s;
PRINT 'Contract Lines generated: 900+';
PRINT '';
-- ============================================================================
-- GENERATE ENTITLEMENTS (250 total)
-- ============================================================================
PRINT 'Generating 250 Entitlements...';
DECLARE @EntitlementIndex INT = 1;
DECLARE @EntitlementAccountId UNIQUEIDENTIFIER;
WHILE @EntitlementIndex <= 250
BEGIN
SELECT @EntitlementAccountId = accountId FROM cdm.Account WHERE accountType = 'Customer' ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
INSERT INTO cdm.Entitlement
(entitlementName, description, accountId, startDate, endDate, type, duration, unitType, unitCount, status, isActive)
VALUES
('Entitlement ' + CAST(@EntitlementIndex AS VARCHAR(5)),
'Support entitlement for account',
@EntitlementAccountId,
DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT), @StartDate),
DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 90 AS INT) + 365, @StartDate),
CHOOSE(@EntitlementIndex % 3 + 1, 'Support', 'Service', 'Training'),
365,
CHOOSE(@EntitlementIndex % 2 + 1, 'Cases', 'Hours'),
CAST(ABS(CHECKSUM(NEWID())) % 500 + 50 AS INT),
CHOOSE(@EntitlementIndex % 5 + 1, 'Active', 'Active', 'Active', 'Inactive', 'Expired'),
1);
SET @EntitlementIndex = @EntitlementIndex + 1;
END
PRINT 'Entitlements generated: 250';
PRINT '';
-- ============================================================================
-- GENERATE CASES (2000 total)
-- ============================================================================
PRINT 'Generating 2000 Cases...';
DECLARE @CaseIndex INT = 1;
DECLARE @CaseAccountId UNIQUEIDENTIFIER;
DECLARE @CaseContactId UNIQUEIDENTIFIER;
DECLARE @CaseOwnerId UNIQUEIDENTIFIER;
DECLARE @CaseContractId UNIQUEIDENTIFIER;
DECLARE @CaseEntitlementId UNIQUEIDENTIFIER;
DECLARE @CaseCreatedDate DATETIME2;
WHILE @CaseIndex <= 2000
BEGIN
SELECT @CaseAccountId = accountId FROM cdm.Account ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @CaseContactId = contactId FROM cdm.Contact ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @CaseOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @CaseContractId = contractId FROM cdm.Contract WHERE accountId = @CaseAccountId ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @CaseEntitlementId = entitlementId FROM cdm.Entitlement WHERE accountId = @CaseAccountId ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SET @CaseCreatedDate = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % (3 * 24 * 60) AS INT), @StartDate);
INSERT INTO cdm.[Case]
(caseNumber, title, description, priority, severity, status, accountId, contactId, ownerUserId, contractId, entitlementId, createdDate, emailAddress, isActive)
VALUES
('CSE-' + FORMAT(@CaseIndex, '000000'),
'Issue ' + CAST(@CaseIndex AS VARCHAR(5)),
'Description for case ' + CAST(@CaseIndex AS VARCHAR(5)),
CHOOSE(@CaseIndex % 5 + 1, 'Low', 'Low', 'Medium', 'High', 'Critical'),
CHOOSE(@CaseIndex % 3 + 1, 'Low', 'Medium', 'High'),
CHOOSE(@CaseIndex % 6 + 1, 'Active', 'Active', 'Active', 'Waiting', 'Resolved', 'Closed'),
@CaseAccountId,
@CaseContactId,
@CaseOwnerId,
@CaseContractId,
@CaseEntitlementId,
@CaseCreatedDate,
(SELECT email FROM cdm.Contact WHERE contactId = @CaseContactId),
1);
SET @CaseIndex = @CaseIndex + 1;
IF @CaseIndex % 100 = 0
BEGIN
PRINT 'Cases generated: ' + CAST(@CaseIndex AS VARCHAR(5));
END
END
PRINT 'Cases generated: 2000';
PRINT '';
-- ============================================================================
-- GENERATE SERVICE ACTIVITIES (3000 total)
-- ============================================================================
PRINT 'Generating 3000 Service Activities...';
DECLARE @ActivityIndex INT = 1;
DECLARE @ActivityCaseId UNIQUEIDENTIFIER;
DECLARE @ActivityServiceId UNIQUEIDENTIFIER;
DECLARE @ActivityOwnerId UNIQUEIDENTIFIER;
DECLARE @ActivityStartTime DATETIME2;
DECLARE @ActivityEndTime DATETIME2;
WHILE @ActivityIndex <= 3000
BEGIN
SELECT @ActivityCaseId = caseId FROM cdm.[Case] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @ActivityServiceId = serviceId FROM cdm.Service ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @ActivityOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SET @ActivityStartTime = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % (3 * 24 * 60) AS INT), @StartDate);
SET @ActivityEndTime = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % 480 + 30 AS INT), @ActivityStartTime);
INSERT INTO cdm.ServiceActivity
(subject, description, serviceId, caseId, ownerUserId, startTime, endTime, duration, location, status, isActive)
VALUES
('Activity ' + CAST(@ActivityIndex AS VARCHAR(5)),
'Service activity description',
@ActivityServiceId,
@ActivityCaseId,
@ActivityOwnerId,
@ActivityStartTime,
@ActivityEndTime,
DATEDIFF(MINUTE, @ActivityStartTime, @ActivityEndTime),
CHOOSE(@ActivityIndex % 3 + 1, 'Remote', 'On-site', 'Phone'),
CHOOSE(@ActivityIndex % 4 + 1, 'Scheduled', 'In Progress', 'Completed', 'Cancelled'),
1);
SET @ActivityIndex = @ActivityIndex + 1;
IF @ActivityIndex % 300 = 0
BEGIN
PRINT 'Service Activities generated: ' + CAST(@ActivityIndex AS VARCHAR(5));
END
END
PRINT 'Service Activities generated: 3000';
PRINT '';
-- ============================================================================
-- GENERATE TASKS (1000 total)
-- ============================================================================
PRINT 'Generating 1000 Tasks...';
DECLARE @TaskIndex INT = 1;
DECLARE @TaskCaseId UNIQUEIDENTIFIER;
DECLARE @TaskOwnerId UNIQUEIDENTIFIER;
DECLARE @TaskDueDate DATE;
WHILE @TaskIndex <= 1000
BEGIN
SELECT @TaskCaseId = caseId FROM cdm.[Case] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SELECT @TaskOwnerId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SET @TaskDueDate = DATEADD(DAY, CAST(ABS(CHECKSUM(NEWID())) % 60 AS INT), @EndDate);
INSERT INTO cdm.Task
(subject, description, priority, status, dueDate, ownerUserId, caseId)
VALUES
('Task ' + CAST(@TaskIndex AS VARCHAR(5)),
'Task description',
CHOOSE(@TaskIndex % 3 + 1, 'Low', 'Medium', 'High'),
CHOOSE(@TaskIndex % 4 + 1, 'Open', 'In Progress', 'Completed', 'Cancelled'),
@TaskDueDate,
@TaskOwnerId,
@TaskCaseId);
SET @TaskIndex = @TaskIndex + 1;
IF @TaskIndex % 100 = 0
BEGIN
PRINT 'Tasks generated: ' + CAST(@TaskIndex AS VARCHAR(5));
END
END
PRINT 'Tasks generated: 1000';
PRINT '';
-- ============================================================================
-- GENERATE KNOWLEDGE ARTICLES (100 total)
-- ============================================================================
PRINT 'Generating 100 Knowledge Articles...';
DECLARE @ArticleIndex INT = 1;
DECLARE @ArticleAuthorId UNIQUEIDENTIFIER;
DECLARE @ArticlePublishedDate DATETIME2;
WHILE @ArticleIndex <= 100
BEGIN
SELECT @ArticleAuthorId = userId FROM cdm.[User] ORDER BY NEWID() OFFSET 0 ROWS FETCH NEXT 1 ROW ONLY;
SET @ArticlePublishedDate = DATEADD(MINUTE, CAST(ABS(CHECKSUM(NEWID())) % (3 * 24 * 60) AS INT), @StartDate);
INSERT INTO cdm.KnowledgeArticle
(title, content, category, keywords, authorUserId, status, publishedDate, viewCount, isActive)
VALUES
('Article ' + CAST(@ArticleIndex AS VARCHAR(5)),
'Content for knowledge article ' + CAST(@ArticleIndex AS VARCHAR(5)) + '. This is a detailed technical article.',
CHOOSE(@ArticleIndex % 10 + 1, 'Troubleshooting', 'How-To', 'Installation', 'Configuration', 'API', 'Security', 'Performance', 'Integration', 'Best Practices', 'FAQ'),
'keywords, support, help',
@ArticleAuthorId,
CHOOSE(@ArticleIndex % 3 + 1, 'Published', 'Published', 'Draft'),
CASE WHEN @ArticleIndex % 3 = 0 THEN @ArticlePublishedDate ELSE NULL END,
CAST(ABS(CHECKSUM(NEWID())) % 5000 AS INT),
1);
SET @ArticleIndex = @ArticleIndex + 1;
END
PRINT 'Knowledge Articles generated: 100';
PRINT '';
-- ============================================================================
-- GENERATE SLA KPI INSTANCES (3000 total - linked to cases)
-- ============================================================================
PRINT 'Generating 3000 SLA KPI Instances...';
INSERT INTO cdm.SLAKPIInstance (caseId, kpiName, metric, metricValue, metricUnit, targetValue, status)
SELECT
c.caseId,
'Response Time',
'Response Time',
CAST(ABS(CHECKSUM(NEWID())) % 240 + 15 AS DECIMAL(18,2)),
'Minutes',
60,
CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'Compliant', 'Compliant', 'Non-Compliant')
FROM cdm.[Case] c;
INSERT INTO cdm.SLAKPIInstance (caseId, kpiName, metric, metricValue, metricUnit, targetValue, status)
SELECT
c.caseId,
'Resolution Time',
'Resolution Time',
CAST(ABS(CHECKSUM(NEWID())) % 2880 + 240 AS DECIMAL(18,2)),
'Minutes',
1440,
CHOOSE(ABS(CHECKSUM(NEWID())) % 4 + 1, 'Compliant', 'Compliant', 'Compliant', 'Non-Compliant')
FROM cdm.[Case] c;
PRINT 'SLA KPI Instances generated: 3000+';
PRINT '';
-- ============================================================================
-- GENERATE CASE RESOLUTIONS (500 total - for closed/resolved cases)
-- ============================================================================
PRINT 'Generating 500 Case Resolutions...';
INSERT INTO cdm.CaseResolution (caseId, description, resolutionType, resolutionStatus, billingStatus, actualServiceDuration)
SELECT TOP 500
c.caseId,
'Case resolved: ' + c.title,
CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'Technical', 'Procedural', 'Escalation'),
'Resolved',
CHOOSE(ABS(CHECKSUM(NEWID())) % 2 + 1, 'Billable', 'Non-billable'),
CAST(ABS(CHECKSUM(NEWID())) % 480 + 30 AS INT)
FROM cdm.[Case] c
WHERE c.status IN ('Closed', 'Resolved')
ORDER BY NEWID();
PRINT 'Case Resolutions generated: 500';
PRINT '';
-- ============================================================================
-- GENERATE ENTITLEMENT CONTACTS (500 total)
-- ============================================================================
PRINT 'Generating 500 Entitlement Contacts...';
INSERT INTO cdm.EntitlementContact (entitlementId, contactId, isPrimary)
SELECT TOP 500
e.entitlementId,
c.contactId,
CASE WHEN ROW_NUMBER() OVER (PARTITION BY e.entitlementId ORDER BY NEWID()) = 1 THEN 1 ELSE 0 END
FROM cdm.Entitlement e
CROSS JOIN cdm.Contact c
WHERE e.accountId = c.accountId
ORDER BY NEWID();
PRINT 'Entitlement Contacts generated: 500';
PRINT '';
-- ============================================================================
-- GENERATE ENTITLEMENT PRODUCTS (750 total)
-- ============================================================================
PRINT 'Generating 750 Entitlement Products...';
INSERT INTO cdm.EntitlementProduct (entitlementId, serviceId)
SELECT TOP 750
e.entitlementId,
s.serviceId
FROM cdm.Entitlement e
CROSS JOIN cdm.Service s
ORDER BY NEWID();
PRINT 'Entitlement Products generated: 750';
PRINT '';
-- ============================================================================
-- GENERATE KNOWLEDGE ARTICLE INCIDENTS (1500 total)
-- ============================================================================
PRINT 'Generating 1500 Knowledge Article Incidents...';
INSERT INTO cdm.KnowledgeArticleIncident (articleId, caseId, isResolved)
SELECT TOP 1500
ka.articleId,
c.caseId,
CASE WHEN c.status IN ('Closed', 'Resolved') THEN 1 ELSE 0 END
FROM cdm.KnowledgeArticle ka
CROSS JOIN cdm.[Case] c
ORDER BY NEWID();
PRINT 'Knowledge Article Incidents generated: 1500';
PRINT '';
-- ============================================================================
-- GENERATE SERVICE CONTRACT CONTACTS (800 total)
-- ============================================================================
PRINT 'Generating 800 Service Contract Contacts...';
INSERT INTO cdm.ServiceContractContact (contractId, contactId, role, isPrimary)
SELECT TOP 800
c.contractId,
ct.contactId,
CHOOSE(ABS(CHECKSUM(NEWID())) % 4 + 1, 'Primary', 'Secondary', 'Technical', 'Admin'),
CASE WHEN ROW_NUMBER() OVER (PARTITION BY c.contractId ORDER BY NEWID()) = 1 THEN 1 ELSE 0 END
FROM cdm.Contract c
CROSS JOIN cdm.Contact ct
WHERE c.accountId = ct.accountId
ORDER BY NEWID();
PRINT 'Service Contract Contacts generated: 800';
PRINT '';
-- ============================================================================
-- GENERATE ACTIVITY PARTIES (1500 total)
-- ============================================================================
PRINT 'Generating 1500 Activity Parties...';
INSERT INTO cdm.ActivityParty (activityId, partyType, userId, email)
SELECT TOP 1500
sa.activityId,
CHOOSE(ABS(CHECKSUM(NEWID())) % 3 + 1, 'Required', 'Optional', 'Organizer'),
u.userId,
u.email
FROM cdm.ServiceActivity sa
CROSS JOIN cdm.[User] u
ORDER BY NEWID();
PRINT 'Activity Parties generated: 1500';
PRINT '';
-- ============================================================================
-- SUMMARY AND STATISTICS
-- ============================================================================
PRINT '';
PRINT '========================================';
PRINT 'Data Generation Complete!';
PRINT '========================================';
PRINT '';
SELECT
'Users' AS Entity,
COUNT(*) AS RecordCount
FROM cdm.[User]
UNION ALL
SELECT 'Sites', COUNT(*) FROM cdm.Site
UNION ALL
SELECT 'Accounts', COUNT(*) FROM cdm.Account
UNION ALL
SELECT 'Contacts', COUNT(*) FROM cdm.Contact
UNION ALL
SELECT 'Services', COUNT(*) FROM cdm.Service
UNION ALL
SELECT 'Resources', COUNT(*) FROM cdm.Resource
UNION ALL
SELECT 'Contracts', COUNT(*) FROM cdm.Contract
UNION ALL
SELECT 'Contract Lines', COUNT(*) FROM cdm.ContractLine
UNION ALL
SELECT 'Entitlements', COUNT(*) FROM cdm.Entitlement
UNION ALL
SELECT 'Entitlement Contacts', COUNT(*) FROM cdm.EntitlementContact
UNION ALL
SELECT 'Entitlement Products', COUNT(*) FROM cdm.EntitlementProduct
UNION ALL
SELECT 'Cases', COUNT(*) FROM cdm.[Case]
UNION ALL
SELECT 'Service Activities', COUNT(*) FROM cdm.ServiceActivity
UNION ALL
SELECT 'Activity Parties', COUNT(*) FROM cdm.ActivityParty
UNION ALL
SELECT 'Tasks', COUNT(*) FROM cdm.Task
UNION ALL
SELECT 'Knowledge Articles', COUNT(*) FROM cdm.KnowledgeArticle
UNION ALL
SELECT 'Knowledge Article Incidents', COUNT(*) FROM cdm.KnowledgeArticleIncident
UNION ALL
SELECT 'SLA KPI Instances', COUNT(*) FROM cdm.SLAKPIInstance
UNION ALL
SELECT 'Case Resolutions', COUNT(*) FROM cdm.CaseResolution
UNION ALL
SELECT 'Service Contract Contacts', COUNT(*) FROM cdm.ServiceContractContact
ORDER BY Entity;
PRINT '';
PRINT '========================================';
PRINT 'Database Statistics:';
PRINT '========================================';
PRINT '';
DECLARE @TotalRecords BIGINT = (
SELECT COUNT(*) FROM cdm.[User] +
COUNT(*) FROM cdm.Site +
COUNT(*) FROM cdm.Account +
COUNT(*) FROM cdm.Contact +
COUNT(*) FROM cdm.Service +
COUNT(*) FROM cdm.Resource +
COUNT(*) FROM cdm.Contract +
COUNT(*) FROM cdm.ContractLine +
COUNT(*) FROM cdm.Entitlement +
COUNT(*) FROM cdm.EntitlementContact +
COUNT(*) FROM cdm.EntitlementProduct +
COUNT(*) FROM cdm.[Case] +
COUNT(*) FROM cdm.ServiceActivity +
COUNT(*) FROM cdm.ActivityParty +
COUNT(*) FROM cdm.Task +
COUNT(*) FROM cdm.KnowledgeArticle +
COUNT(*) FROM cdm.KnowledgeArticleIncident +
COUNT(*) FROM cdm.SLAKPIInstance +
COUNT(*) FROM cdm.CaseResolution +
COUNT(*) FROM cdm.ServiceContractContact
);
SELECT
'Total Records Inserted' AS Metric,
@TotalRecords AS Value
UNION ALL
SELECT 'Average Records per Case', (SELECT COUNT(*) FROM cdm.ServiceActivity) / (SELECT COUNT(*) FROM cdm.[Case])
UNION ALL
SELECT 'Average Cases per Account', (SELECT COUNT(*) FROM cdm.[Case]) / (SELECT COUNT(*) FROM cdm.Account)
UNION ALL
SELECT 'Average Contract Lines', (SELECT COUNT(*) FROM cdm.ContractLine) / (SELECT COUNT(*) FROM cdm.Contract);
PRINT '';
PRINT 'Date Range: ' + CAST(@StartDate AS VARCHAR(10)) + ' to ' + CAST(@EndDate AS VARCHAR(10));
PRINT '';
PRINT 'All data has been generated successfully!';
PRINT '========================================';
GO