mirror of
https://github.com/Microsoft/sql-server-samples.git
synced 2025-12-08 14:58:54 +00:00
6165 lines
236 KiB
Transact-SQL
6165 lines
236 KiB
Transact-SQL
-- Configure required database objects
|
|
--
|
|
|
|
USE WideWorldImporters;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].CreateRoleIfNonexistent;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].CreateRoleIfNonexistent
|
|
@RoleName sysname
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE name = @RoleName AND type = N'R')
|
|
BEGIN
|
|
BEGIN TRY
|
|
|
|
DECLARE @SQL nvarchar(max) = N'CREATE ROLE ' + QUOTENAME(@RoleName) + N';'
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'Role ' + @RoleName + N' created';
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to create role ' + @RoleName;
|
|
THROW;
|
|
END CATCH;
|
|
END;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].AddRoleMemberIfNonexistent;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].AddRoleMemberIfNonexistent
|
|
@RoleName sysname,
|
|
@UserName sysname
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.database_role_members AS drm
|
|
INNER JOIN sys.database_principals AS dpr
|
|
ON drm.role_principal_id = dpr.principal_id
|
|
AND dpr.type = N'R'
|
|
INNER JOIN sys.database_principals AS dpu
|
|
ON drm.member_principal_id = dpu.principal_id
|
|
AND dpu.type = N'S'
|
|
WHERE dpr.name = @RoleName
|
|
AND dpu.name = @UserName)
|
|
BEGIN
|
|
BEGIN TRY
|
|
|
|
DECLARE @SQL nvarchar(max) = N'ALTER ROLE ' + QUOTENAME(@RoleName)
|
|
+ N' ADD MEMBER ' + QUOTENAME(@UserName) + N';'
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'User ' + @UserName + N' added to role ' + @RoleName;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to add user ' + @UserName + N' to role ' + @RoleName;
|
|
THROW;
|
|
END CATCH;
|
|
END;
|
|
END;
|
|
GO
|
|
|
|
EXEC [Application].CreateRoleIfNonexistent N'External Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Far West Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Great Lakes Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Mideast Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'New England Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Plains Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Rocky Mountain Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Southeast Sales';
|
|
EXEC [Application].CreateRoleIfNonexistent N'Southwest Sales';
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Website.SearchForPeople;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.SearchForPeople
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
AS
|
|
BEGIN
|
|
SELECT TOP(@MaximumRowsToReturn)
|
|
p.PersonID,
|
|
p.FullName,
|
|
p.PreferredName,
|
|
CASE WHEN p.IsSalesperson <> 0 THEN N'Salesperson'
|
|
WHEN p.IsEmployee <> 0 THEN N'Employee'
|
|
WHEN c.CustomerID IS NOT NULL THEN N'Customer'
|
|
WHEN sp.SupplierID IS NOT NULL THEN N'Supplier'
|
|
WHEN sa.SupplierID IS NOT NULL THEN N'Supplier'
|
|
END AS Relationship,
|
|
COALESCE(c.CustomerName, sp.SupplierName, sa.SupplierName, N'WWI') AS Company
|
|
FROM [Application].People AS p
|
|
LEFT OUTER JOIN Sales.Customers AS c
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
LEFT OUTER JOIN Purchasing.Suppliers AS sp
|
|
ON sp.PrimaryContactPersonID = p.PersonID
|
|
LEFT OUTER JOIN Purchasing.Suppliers AS sa
|
|
ON sa.AlternateContactPersonID = p.PersonID
|
|
WHERE p.SearchName LIKE N'%' + @SearchText + N'%'
|
|
ORDER BY p.FullName
|
|
FOR JSON AUTO, ROOT(N'People');
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
EXEC Website.SearchForPeople N'Isabella', 20;
|
|
EXEC Website.SearchForPeople N'Helene', 20;
|
|
|
|
*/
|
|
|
|
DROP PROCEDURE IF EXISTS Website.SearchForSuppliers;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.SearchForSuppliers
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT TOP(@MaximumRowsToReturn)
|
|
s.SupplierID,
|
|
s.SupplierName,
|
|
c.CityName,
|
|
s.PhoneNumber,
|
|
s.FaxNumber ,
|
|
p.FullName AS PrimaryContactFullName,
|
|
p.PreferredName AS PrimaryContactPreferredName
|
|
FROM Purchasing.Suppliers AS s
|
|
INNER JOIN [Application].Cities AS c
|
|
ON s.DeliveryCityID = c.CityID
|
|
LEFT OUTER JOIN [Application].People AS p
|
|
ON s.PrimaryContactPersonID = p.PersonID
|
|
WHERE CONCAT(s.SupplierName, N' ', p.FullName, N' ', p.PreferredName) LIKE N'%' + @SearchText + N'%'
|
|
ORDER BY s.SupplierName
|
|
FOR JSON AUTO, ROOT(N'Suppliers');
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
EXEC Website.SearchForSuppliers N'Litware', 20;
|
|
|
|
*/
|
|
|
|
DROP PROCEDURE IF EXISTS Website.SearchForCustomers;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.SearchForCustomers
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT TOP(@MaximumRowsToReturn)
|
|
c.CustomerID,
|
|
c.CustomerName,
|
|
ct.CityName,
|
|
c.PhoneNumber,
|
|
c.FaxNumber,
|
|
p.FullName AS PrimaryContactFullName,
|
|
p.PreferredName AS PrimaryContactPreferredName
|
|
FROM Sales.Customers AS c
|
|
INNER JOIN [Application].Cities AS ct
|
|
ON c.DeliveryCityID = ct.CityID
|
|
LEFT OUTER JOIN [Application].People AS p
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
WHERE CONCAT(c.CustomerName, N' ', p.FullName, N' ', p.PreferredName) LIKE N'%' + @SearchText + N'%'
|
|
ORDER BY c.CustomerName
|
|
FOR JSON AUTO, ROOT(N'Customers');
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
EXEC Website.SearchForCustomers N'Tailspin', 20;
|
|
|
|
*/
|
|
|
|
DROP PROCEDURE IF EXISTS Website.SearchForStockItems;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.SearchForStockItems
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT TOP(@MaximumRowsToReturn)
|
|
si.StockItemID,
|
|
si.StockItemName
|
|
FROM Warehouse.StockItems AS si
|
|
WHERE si.SearchDetails LIKE N'%' + @SearchText + N'%'
|
|
ORDER BY si.StockItemName
|
|
FOR JSON AUTO, ROOT(N'StockItems');
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
EXEC Website.SearchForStockItems N'food', 20;
|
|
EXEC Website.SearchForStockItems N'chocolate', 20;
|
|
|
|
*/
|
|
|
|
DROP PROCEDURE IF EXISTS Website.SearchForStockItemsByTags;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.SearchForStockItemsByTags
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT TOP(@MaximumRowsToReturn)
|
|
si.StockItemID,
|
|
si.StockItemName
|
|
FROM Warehouse.StockItems AS si
|
|
WHERE si.Tags LIKE N'%' + @SearchText + N'%'
|
|
ORDER BY si.StockItemName
|
|
FOR JSON AUTO, ROOT(N'StockItems');
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
EXEC Website.SearchForStockItemsByTags N'USB', 20;
|
|
|
|
*/
|
|
|
|
DROP PROCEDURE IF EXISTS Website.RecordVehicleTemperature;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.RecordVehicleTemperature
|
|
@FullSensorDataArray nvarchar(1000)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @CrLf nchar(2) = nchar(13) + nchar(10);
|
|
DECLARE @HelpMessage nvarchar(max) = N'JSON sensor data is invalid. An example of what is required is as follows:' + @CrLf + @CrLf
|
|
+ N'{"Recordings":' + @CrLf
|
|
+ N' [' + @CrLf
|
|
+ N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"2016-01-01T07:00:00","temp":3.96}},' + @CrLf
|
|
+ N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"2016-01-01T07:00:00","temp":3.98}}' + @CrLf
|
|
+ N' ]' + @CrLf
|
|
+ N'}';
|
|
|
|
IF ISJSON(@FullSensorDataArray) = 0
|
|
BEGIN
|
|
PRINT @HelpMessage;
|
|
THROW 51000, N'FullSensorDataArray must be valid JSON data', 1;
|
|
RETURN 1;
|
|
END;
|
|
|
|
BEGIN TRY
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Warehouse.VehicleTemperatures
|
|
(VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature,
|
|
FullSensorData, IsCompressed, CompressedSensorData)
|
|
SELECT VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature,
|
|
FullSensorData, 0, NULL
|
|
FROM OPENJSON(@FullSensorDataArray, N'$.Recordings')
|
|
WITH ( VehicleRegistration nvarchar(40) N'$.properties.rego',
|
|
ChillerSensorNumber int N'$.properties.sensor',
|
|
RecordedWhen datetime2(7) N'$.properties.when',
|
|
Temperature decimal(18,2) N'$.properties.temp',
|
|
FullSensorData nvarchar(max) N'$' AS JSON);
|
|
|
|
IF @@ROWCOUNT = 0
|
|
BEGIN
|
|
PRINT N'Warning: No valid sensor data found';
|
|
PRINT @HelpMessage;
|
|
END;
|
|
|
|
COMMIT;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT @HelpMessage;
|
|
|
|
THROW 51000, N'Valid JSON was supplied but does not match the temperature recordings array structure', 2;
|
|
|
|
IF XACT_STATE() <> 0 ROLLBACK TRAN;
|
|
|
|
RETURN 1;
|
|
END CATCH;
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
-- should succeed
|
|
|
|
DECLARE @Recordings nvarchar(max) = N'{"Recordings": '
|
|
+ N' ['
|
|
+ N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"2016-01-01T07:00:00","temp":3.96}},'
|
|
+ N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"2016-01-01T07:00:00","temp":3.98}}'
|
|
+ N' ]'
|
|
+ N'}';
|
|
EXEC Website.RecordVehicleTemperature @Recordings;
|
|
|
|
-- should get help message
|
|
|
|
DECLARE @Recordings nvarchar(max) = N'{"Recordings":"Nothing useful"}';
|
|
EXEC Website.RecordVehicleTemperature @Recordings;
|
|
|
|
-- should get error and help message
|
|
|
|
DECLARE @Recordings nvarchar(max) = N'{"Recordings": '
|
|
+ N' ['
|
|
+ N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":1,"when":"NOT A DATE","temp":3.96}},'
|
|
+ N' {"type":"Feature", "geometry": {"type":"Point", "coordinates":[-89.7600464,50.4742420] }, "properties":{"rego":"WWI-321-A","sensor":2,"when":"NOT A DATE","temp":3.98}}'
|
|
+ N' ]'
|
|
+ N'}';
|
|
EXEC Website.RecordVehicleTemperature @Recordings;
|
|
|
|
*/
|
|
|
|
EXEC DataLoadSimulation.DeactivateTemporalTablesBeforeDataLoad;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures;
|
|
GO
|
|
|
|
CREATE PROCEDURE DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
EXEC DataLoadSimulation.DeactivateTemporalTablesBeforeDataLoad;
|
|
|
|
DECLARE @SQL nvarchar(max);
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.objects WHERE name = N'GetAreaCode'
|
|
AND type = N'FN'
|
|
AND SCHEMA_NAME(schema_id) = N'DataLoadSimulation')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE FUNCTION DataLoadSimulation.GetAreaCode
|
|
(
|
|
@StateProvinceCode nvarchar(2)
|
|
)
|
|
RETURNS INT
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
DECLARE @AreaCode int;
|
|
|
|
WITH AreaCodes
|
|
AS
|
|
(
|
|
SELECT StateProvinceCode, AreaCode
|
|
FROM
|
|
(VALUES (''NJ'', 201),
|
|
(''DC'', 202),
|
|
(''CT'', 203),
|
|
(''MB'', 204),
|
|
(''AL'', 205),
|
|
(''WA'', 206),
|
|
(''ME'', 207),
|
|
(''ID'', 208),
|
|
(''CA'', 209),
|
|
(''TX'', 210),
|
|
(''NY'', 212),
|
|
(''CA'', 213),
|
|
(''TX'', 214),
|
|
(''PA'', 215),
|
|
(''OH'', 216),
|
|
(''IL'', 217),
|
|
(''MN'', 218),
|
|
(''IN'', 219),
|
|
(''OH'', 220),
|
|
(''IL'', 224),
|
|
(''LA'', 225),
|
|
(''ON'', 226),
|
|
(''MS'', 228),
|
|
(''GA'', 229),
|
|
(''MI'', 231),
|
|
(''OH'', 234),
|
|
(''BC'', 236),
|
|
(''FL'', 239),
|
|
(''MD'', 240),
|
|
(''MI'', 248),
|
|
(''BC'', 250),
|
|
(''AL'', 251),
|
|
(''NC'', 252),
|
|
(''WA'', 253),
|
|
(''TX'', 254),
|
|
(''AL'', 256),
|
|
(''IN'', 260),
|
|
(''WI'', 262),
|
|
(''PA'', 267),
|
|
(''MI'', 269),
|
|
(''KY'', 270),
|
|
(''PA'', 272),
|
|
(''VA'', 276),
|
|
(''MI'', 278),
|
|
(''TX'', 281),
|
|
(''OH'', 283),
|
|
(''ON'', 289),
|
|
(''MD'', 301),
|
|
(''DE'', 302),
|
|
(''CO'', 303),
|
|
(''WV'', 304),
|
|
(''FL'', 305),
|
|
(''SK'', 306),
|
|
(''WY'', 307),
|
|
(''NE'', 308),
|
|
(''IL'', 309),
|
|
(''CA'', 310),
|
|
(''IL'', 312),
|
|
(''MI'', 313),
|
|
(''MO'', 314),
|
|
(''NY'', 315),
|
|
(''KS'', 316),
|
|
(''IN'', 317),
|
|
(''LA'', 318),
|
|
(''IA'', 319),
|
|
(''MN'', 320),
|
|
(''FL'', 321),
|
|
(''CA'', 323),
|
|
(''TX'', 325),
|
|
(''OH'', 330),
|
|
(''IL'', 331),
|
|
(''AL'', 334),
|
|
(''NC'', 336),
|
|
(''LA'', 337),
|
|
(''MA'', 339),
|
|
(''VI'', 340),
|
|
(''CA'', 341),
|
|
(''ON'', 343),
|
|
(''NY'', 347),
|
|
(''MA'', 351),
|
|
(''FL'', 352),
|
|
(''WA'', 360),
|
|
(''TX'', 361),
|
|
(''ON'', 365),
|
|
(''CA'', 369),
|
|
(''OH'', 380),
|
|
(''UT'', 385),
|
|
(''FL'', 386),
|
|
(''RI'', 401),
|
|
(''NE'', 402),
|
|
(''AB'', 403),
|
|
(''GA'', 404),
|
|
(''OK'', 405),
|
|
(''MT'', 406),
|
|
(''FL'', 407),
|
|
(''CA'', 408),
|
|
(''TX'', 409),
|
|
(''MD'', 410),
|
|
(''PA'', 412),
|
|
(''MA'', 413),
|
|
(''WI'', 414),
|
|
(''CA'', 415),
|
|
(''ON'', 416),
|
|
(''MO'', 417),
|
|
(''QC'', 418),
|
|
(''OH'', 419),
|
|
(''TN'', 423),
|
|
(''CA'', 424),
|
|
(''WA'', 425),
|
|
(''TX'', 430),
|
|
(''MB'', 431),
|
|
(''TX'', 432),
|
|
(''VA'', 434),
|
|
(''UT'', 435),
|
|
(''ON'', 437),
|
|
(''QC'', 438),
|
|
(''OH'', 440),
|
|
(''CA'', 442),
|
|
(''MD'', 443),
|
|
(''QC'', 450),
|
|
(''OR'', 458),
|
|
(''IL'', 464),
|
|
(''TX'', 469),
|
|
(''GA'', 470),
|
|
(''CT'', 475),
|
|
(''GA'', 478),
|
|
(''AR'', 479),
|
|
(''AZ'', 480),
|
|
(''QC'', 481),
|
|
(''PA'', 484),
|
|
(''AR'', 501),
|
|
(''KY'', 502),
|
|
(''OR'', 503),
|
|
(''LA'', 504),
|
|
(''NM'', 505),
|
|
(''NB'', 506),
|
|
(''MN'', 507),
|
|
(''MA'', 508),
|
|
(''WA'', 509),
|
|
(''CA'', 510),
|
|
(''TX'', 512),
|
|
(''OH'', 513),
|
|
(''QC'', 514),
|
|
(''IA'', 515),
|
|
(''NY'', 516),
|
|
(''MI'', 517),
|
|
(''NY'', 518),
|
|
(''ON'', 519),
|
|
(''AZ'', 520),
|
|
(''CA'', 530),
|
|
(''OK'', 539),
|
|
(''VA'', 540),
|
|
(''OR'', 541),
|
|
(''ON'', 548),
|
|
(''NJ'', 551),
|
|
(''MO'', 557),
|
|
(''CA'', 559),
|
|
(''FL'', 561),
|
|
(''CA'', 562),
|
|
(''IA'', 563),
|
|
(''WA'', 564),
|
|
(''OH'', 567),
|
|
(''PA'', 570),
|
|
(''VA'', 571),
|
|
(''MO'', 573),
|
|
(''IN'', 574),
|
|
(''NM'', 575),
|
|
(''QC'', 579),
|
|
(''OK'', 580),
|
|
(''NY'', 585),
|
|
(''MI'', 586),
|
|
(''AB'', 587),
|
|
(''MS'', 601),
|
|
(''AZ'', 602),
|
|
(''NH'', 603),
|
|
(''BC'', 604),
|
|
(''SD'', 605),
|
|
(''KY'', 606),
|
|
(''NY'', 607),
|
|
(''WI'', 608),
|
|
(''NJ'', 609),
|
|
(''PA'', 610),
|
|
(''MN'', 612),
|
|
(''ON'', 613),
|
|
(''OH'', 614),
|
|
(''TN'', 615),
|
|
(''MI'', 616),
|
|
(''MA'', 617),
|
|
(''IL'', 618),
|
|
(''CA'', 619),
|
|
(''KS'', 620),
|
|
(''AZ'', 623),
|
|
(''CA'', 626),
|
|
(''CA'', 627),
|
|
(''CA'', 628),
|
|
(''TN'', 629),
|
|
(''IL'', 630),
|
|
(''NY'', 631),
|
|
(''MO'', 636),
|
|
(''SK'', 639),
|
|
(''IA'', 641),
|
|
(''NY'', 646),
|
|
(''ON'', 647),
|
|
(''CA'', 650),
|
|
(''MN'', 651),
|
|
(''CA'', 657),
|
|
(''MO'', 660),
|
|
(''CA'', 661),
|
|
(''MS'', 662),
|
|
(''CA'', 669),
|
|
(''MP'', 670),
|
|
(''GU'', 671),
|
|
(''GA'', 678),
|
|
(''MI'', 679),
|
|
(''WV'', 681),
|
|
(''TX'', 682),
|
|
(''FL'', 689),
|
|
(''ND'', 701),
|
|
(''NV'', 702),
|
|
(''VA'', 703),
|
|
(''NC'', 704),
|
|
(''ON'', 705),
|
|
(''GA'', 706),
|
|
(''CA'', 707),
|
|
(''IL'', 708),
|
|
(''NL'', 709),
|
|
(''IA'', 712),
|
|
(''TX'', 713),
|
|
(''CA'', 714),
|
|
(''WI'', 715),
|
|
(''NY'', 716),
|
|
(''PA'', 717),
|
|
(''NY'', 718),
|
|
(''CO'', 719),
|
|
(''CO'', 720),
|
|
(''PA'', 724),
|
|
(''NV'', 725),
|
|
(''FL'', 727),
|
|
(''TN'', 731),
|
|
(''NJ'', 732),
|
|
(''MI'', 734),
|
|
(''TX'', 737),
|
|
(''OH'', 740),
|
|
(''CA'', 747),
|
|
(''FL'', 754),
|
|
(''VA'', 757),
|
|
(''CA'', 760),
|
|
(''GA'', 762),
|
|
(''MN'', 763),
|
|
(''CA'', 764),
|
|
(''IN'', 765),
|
|
(''MS'', 769),
|
|
(''GA'', 770),
|
|
(''FL'', 772),
|
|
(''IL'', 773),
|
|
(''MA'', 774),
|
|
(''NV'', 775),
|
|
(''BC'', 778),
|
|
(''IL'', 779),
|
|
(''AB'', 780),
|
|
(''MA'', 781),
|
|
(''NS'', 782),
|
|
(''KS'', 785),
|
|
(''FL'', 786),
|
|
(''PR'', 787),
|
|
(''UT'', 801),
|
|
(''VT'', 802),
|
|
(''SC'', 803),
|
|
(''VA'', 804),
|
|
(''CA'', 805),
|
|
(''TX'', 806),
|
|
(''ON'', 807),
|
|
(''HI'', 808),
|
|
(''MI'', 810),
|
|
(''IN'', 812),
|
|
(''FL'', 813),
|
|
(''PA'', 814),
|
|
(''IL'', 815),
|
|
(''MO'', 816),
|
|
(''TX'', 817),
|
|
(''CA'', 818),
|
|
(''QC'', 819),
|
|
(''AB'', 825),
|
|
(''NC'', 828),
|
|
(''TX'', 830),
|
|
(''CA'', 831),
|
|
(''TX'', 832),
|
|
(''PA'', 835),
|
|
(''SC'', 843),
|
|
(''NY'', 845),
|
|
(''IL'', 847),
|
|
(''NJ'', 848),
|
|
(''FL'', 850),
|
|
(''NJ'', 856),
|
|
(''MA'', 857),
|
|
(''CA'', 858),
|
|
(''KY'', 859),
|
|
(''CT'', 860),
|
|
(''NJ'', 862),
|
|
(''FL'', 863),
|
|
(''SC'', 864),
|
|
(''TN'', 865),
|
|
(''YT'', 867),
|
|
(''AR'', 870),
|
|
(''IL'', 872),
|
|
(''QC'', 873),
|
|
(''PA'', 878),
|
|
(''TN'', 901),
|
|
(''NS'', 902),
|
|
(''TX'', 903),
|
|
(''FL'', 904),
|
|
(''ON'', 905),
|
|
(''MI'', 906),
|
|
(''AK'', 907),
|
|
(''NJ'', 908),
|
|
(''CA'', 909),
|
|
(''NC'', 910),
|
|
(''GA'', 912),
|
|
(''KS'', 913),
|
|
(''NY'', 914),
|
|
(''TX'', 915),
|
|
(''CA'', 916),
|
|
(''NY'', 917),
|
|
(''OK'', 918),
|
|
(''NC'', 919),
|
|
(''WI'', 920),
|
|
(''CA'', 925),
|
|
(''FL'', 927),
|
|
(''AZ'', 928),
|
|
(''NY'', 929),
|
|
(''TN'', 931),
|
|
(''CA'', 935),
|
|
(''TX'', 936),
|
|
(''OH'', 937),
|
|
(''PR'', 939),
|
|
(''TX'', 940),
|
|
(''FL'', 941),
|
|
(''MI'', 947),
|
|
(''CA'', 949),
|
|
(''CA'', 951),
|
|
(''MN'', 952),
|
|
(''FL'', 954),
|
|
(''TX'', 956),
|
|
(''NM'', 957),
|
|
(''CT'', 959),
|
|
(''CO'', 970),
|
|
(''OR'', 971),
|
|
(''TX'', 972),
|
|
(''NJ'', 973),
|
|
(''MO'', 975),
|
|
(''MA'', 978),
|
|
(''TX'', 979),
|
|
(''NC'', 980),
|
|
(''NC'', 984),
|
|
(''LA'', 985),
|
|
(''MI'', 989)
|
|
) AS AreaCodes(StateProvinceCode, AreaCode)
|
|
)
|
|
SELECT TOP(1) @AreaCode = AreaCode FROM AreaCodes AS ac WHERE ac.StateProvinceCode = @StateProvinceCode;
|
|
|
|
RETURN @AreaCode;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'ActivateWebsiteLogins')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.ActivateWebsiteLogons
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
-- Approximately 1 in 8 days has a new website activation
|
|
|
|
DECLARE @NumberOfLogonsToActivate int = CASE WHEN (RAND() * 8) <= 1 THEN 1 ELSE 0 END;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Activating '' + CAST(@NumberOfLogonsToActivate AS nvarchar(20)) + N'' logons'';
|
|
END;
|
|
|
|
DECLARE @Counter int = 0;
|
|
DECLARE @PersonID int;
|
|
DECLARE @EmailAddress nvarchar(256);
|
|
DECLARE @HashedPassword varbinary(max);
|
|
DECLARE @FullName nvarchar(50);
|
|
DECLARE @UserPreferences nvarchar(max) = (SELECT UserPreferences FROM [Application].People WHERE PersonID = 1);
|
|
|
|
WHILE @Counter < @NumberOfLogonsToActivate
|
|
BEGIN
|
|
SELECT TOP(1) @PersonID = PersonID,
|
|
@EmailAddress = EmailAddress,
|
|
@FullName = FullName
|
|
FROM [Application].People
|
|
WHERE IsPermittedToLogon = 0 AND PersonID <> 1
|
|
ORDER BY NEWID();
|
|
|
|
UPDATE [Application].People
|
|
SET IsPermittedToLogon = 1,
|
|
LogonName = @EmailAddress,
|
|
HashedPassword = HASHBYTES(N''SHA2_256'', N''SQLRocks!00'' + @FullName),
|
|
UserPreferences = @UserPreferences,
|
|
[ValidFrom] = @StartingWhen
|
|
WHERE PersonID = @PersonID;
|
|
|
|
SET @Counter += 1;
|
|
END;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'AddCustomers')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.AddCustomers
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
-- add a customer one in 15 days average
|
|
DECLARE @NumberOfCustomersToAdd int = (SELECT TOP(1) Quantity
|
|
FROM (VALUES (0), (0), (0), (0), (0),
|
|
(0), (0), (0), (0), (0),
|
|
(0), (0), (0), (0), (0),
|
|
(0), (0), (0), (0), (0),
|
|
(0), (0), (0), (0), (1)) AS q(Quantity)
|
|
ORDER BY NEWID());
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Adding '' + CAST(@NumberOfCustomersToAdd AS nvarchar(20)) + N'' customers'';
|
|
END;
|
|
|
|
DECLARE @Counter int = 0;
|
|
DECLARE @CityID int;
|
|
DECLARE @CityName nvarchar(max);
|
|
DECLARE @CityStateProvinceID int;
|
|
DECLARE @CityStateProvinceCode nvarchar(5);
|
|
DECLARE @AreaCode int;
|
|
DECLARE @CustomerCategoryID int;
|
|
|
|
|
|
DECLARE @CustomerID int;
|
|
DECLARE @PrimaryContactFullName nvarchar(50);
|
|
DECLARE @PrimaryContactPersonID int;
|
|
DECLARE @PrimaryContactFirstName nvarchar(50);
|
|
DECLARE @DeliveryMethodID int = (SELECT DeliveryMethodID FROM [Application].DeliveryMethods
|
|
WHERE DeliveryMethodName = N''Delivery Van'');
|
|
DECLARE @DeliveryAddressLine1 nvarchar(max);
|
|
DECLARE @DeliveryAddressLine2 nvarchar(max);
|
|
DECLARE @DeliveryPostalCode nvarchar(max);
|
|
DECLARE @PostalAddressLine1 nvarchar(max);
|
|
DECLARE @PostalAddressLine2 nvarchar(max);
|
|
DECLARE @PostalPostalCode nvarchar(max);
|
|
DECLARE @StreetSuffix nvarchar(max);
|
|
DECLARE @CompanySuffix nvarchar(max);
|
|
DECLARE @StorePrefix nvarchar(max);
|
|
DECLARE @CreditLimit int;
|
|
|
|
WHILE @Counter < @NumberOfCustomersToAdd
|
|
BEGIN
|
|
WITH NamesToUse
|
|
AS
|
|
(
|
|
SELECT FirstName, LastName, FullName
|
|
FROM
|
|
(VALUES (''Mark'', ''Korjus'', ''Mark Korjus''),
|
|
(''Emil'', ''Bojin'', ''Emil Bojin''),
|
|
(''Hue'', ''Ton'', ''Hue Ton''),
|
|
(''Leonardo'', ''Jozic'', ''Leonardo Jozic''),
|
|
(''Ivana'', ''Hadrabova'', ''Ivana Hadrabova''),
|
|
(''Hakan'', ''Akbulut'', ''Hakan Akbulut''),
|
|
(''Jayanti'', ''Pandit'', ''Jayanti Pandit''),
|
|
(''Judit'', ''Gyenes'', ''Judit Gyenes''),
|
|
(''Coralie'', ''Monty'', ''Coralie Monty''),
|
|
(''Hai'', ''Banh'', ''Hai Banh''),
|
|
(''Manuel'', ''Jaramillo'', ''Manuel Jaramillo''),
|
|
(''Damodar'', ''Shenoy'', ''Damodar Shenoy''),
|
|
(''Jatindra'', ''Bandopadhyay'', ''Jatindra Bandopadhyay''),
|
|
(''Kanan'', ''Malakar'', ''Kanan Malakar''),
|
|
(''Miloslav'', ''Fisar'', ''Miloslav Fisar''),
|
|
(''Sylvie'', ''Laramee'', ''Sylvie Laramee''),
|
|
(''Rene'', ''Saucier'', ''Rene Saucier''),
|
|
(''Aruna'', ''Cheema'', ''Aruna Cheema''),
|
|
(''Jagdish'', ''Shergill'', ''Jagdish Shergill''),
|
|
(''Gopichand'', ''Dutta'', ''Gopichand Dutta''),
|
|
(''Adrian'', ''Lindqvist'', ''Adrian Lindqvist''),
|
|
(''Renata'', ''Michnova'', ''Renata Michnova''),
|
|
(''Gunnar'', ''Bjorklund'', ''Gunnar Bjorklund''),
|
|
(''Binoba'', ''Dey'', ''Binoba Dey''),
|
|
(''Stefan'', ''Selezeanu'', ''Stefan Selezeanu''),
|
|
(''Amolik'', ''Chakraborty'', ''Amolik Chakraborty''),
|
|
(''Mai'', ''Ton'', ''Mai Ton''),
|
|
(''Rajendra'', ''Mulye'', ''Rajendra Mulye''),
|
|
(''Sushila'', ''Baruah'', ''Sushila Baruah''),
|
|
(''Jibek'', ''Juniskyzy'', ''Jibek Juniskyzy''),
|
|
(''Rabindra'', ''Kaul'', ''Rabindra Kaul''),
|
|
(''Lucia'', ''Hinojosa'', ''Lucia Hinojosa''),
|
|
(''Maija'', ''Lukstina'', ''Maija Lukstina''),
|
|
(''Rajanikant'', ''Pandit'', ''Rajanikant Pandit''),
|
|
(''Nichole '', ''Deslauriers'', ''Nichole Deslauriers''),
|
|
(''Max'', ''Shand'', ''Max Shand''),
|
|
(''Farzana'', ''Abbasi'', ''Farzana Abbasi''),
|
|
(''Ekambar'', ''Bhuiyan'', ''Ekambar Bhuiyan''),
|
|
(''Dhanishta'', ''Pullela'', ''Dhanishta Pullela''),
|
|
(''Busarakham'', ''Kitjakarn'', ''Busarakham Kitjakarn''),
|
|
(''Manjunatha'', ''Karnik'', ''Manjunatha Karnik''),
|
|
(''Bianca'', ''Lack'', ''Bianca Lack''),
|
|
(''Viktoria'', ''Hudecova'', ''Viktoria Hudecova''),
|
|
(''Haarati'', ''Pendyala'', ''Haarati Pendyala''),
|
|
(''Bhagavateeprasaad'', ''Malladi'', ''Bhagavateeprasaad Malladi''),
|
|
(''Aykut'', ''ozkan'', ''Aykut ozkan''),
|
|
(''Essie'', ''Wimmer'', ''Essie Wimmer''),
|
|
(''Ivan'', ''Ignatyev'', ''Ivan Ignatyev''),
|
|
(''Sohail'', ''Shasthri'', ''Sohail Shasthri''),
|
|
(''Nils'', ''Kaulins'', ''Nils Kaulins''),
|
|
(''Suresh'', ''Singh'', ''Suresh Singh''),
|
|
(''Christian'', ''Couet'', ''Christian Couet''),
|
|
(''Tami'', ''Braggs'', ''Tami Braggs''),
|
|
(''Ian'', ''Olofsson'', ''Ian Olofsson''),
|
|
(''Juan'', ''Roy'', ''Juan Roy''),
|
|
(''Chandrani'', ''Dey'', ''Chandrani Dey''),
|
|
(''Esther'', ''Jobrani'', ''Esther Jobrani''),
|
|
(''Kristi'', ''Kuusik'', ''Kristi Kuusik''),
|
|
(''Abhaya'', ''Paruchuri'', ''Abhaya Paruchuri''),
|
|
(''Sung-Hwan'', ''Yoo'', ''Sung-Hwan Yoo''),
|
|
(''Amet'', ''Shergill'', ''Amet Shergill''),
|
|
(''Damla'', ''Yavuz'', ''Damla Yavuz''),
|
|
(''Naveen'', ''Scindia'', ''Naveen Scindia''),
|
|
(''Anurupa'', ''Mitra'', ''Anurupa Mitra''),
|
|
(''Raymond'', ''Beauchamp'', ''Raymond Beauchamp''),
|
|
(''Tara'', ''Kotadia'', ''Tara Kotadia''),
|
|
(''Arnost'', ''Hovorka'', ''Arnost Hovorka''),
|
|
(''Aive'', ''Petrov'', ''Aive Petrov''),
|
|
(''Tomo'', ''Vidovic'', ''Tomo Vidovic''),
|
|
(''Arundhati'', ''Majumdar'', ''Arundhati Majumdar''),
|
|
(''Marcela'', ''Mencikova'', ''Marcela Mencikova''),
|
|
(''Cosmina'', ''Leonte'', ''Cosmina Leonte''),
|
|
(''Linda'', ''Ohl'', ''Linda Ohl''),
|
|
(''Gulzar'', ''Sarkar'', ''Gulzar Sarkar''),
|
|
(''Carol'', ''Antonescu'', ''Carol Antonescu''),
|
|
(''Kyung-Soon'', ''Pak'', ''Kyung-Soon Pak''),
|
|
(''Jaroslav'', ''Fisar'', ''Jaroslav Fisar''),
|
|
(''Amrita'', ''Ganguly'', ''Amrita Ganguly''),
|
|
(''Śani'', ''Shasthri'', ''Śani Shasthri''),
|
|
(''Ivan'', ''Arenas'', ''Ivan Arenas''),
|
|
(''Miljan'', ''Stojanovic'', ''Miljan Stojanovic''),
|
|
(''Tereza'', ''Cermakova'', ''Tereza Cermakova''),
|
|
(''Harendra'', ''Sonkar'', ''Harendra Sonkar''),
|
|
(''Taj'', ''Syme'', ''Taj Syme''),
|
|
(''Rajeev'', ''Sandhu'', ''Rajeev Sandhu''),
|
|
(''Alok'', ''Sridhara'', ''Alok Sridhara''),
|
|
(''Falgun'', ''Bagchi'', ''Falgun Bagchi''),
|
|
(''Kashi'', ''Singh'', ''Kashi Singh''),
|
|
(''Bong-Soo'', ''Ha'', ''Bong-Soo Ha''),
|
|
(''Damodara'', ''Trivedi'', ''Damodara Trivedi''),
|
|
(''Nguyen'', ''Banh'', ''Nguyen Banh''),
|
|
(''Lan'', ''Bach'', ''Lan Bach''),
|
|
(''Surya'', ''Kulkarni'', ''Surya Kulkarni''),
|
|
(''Afsar-ud-Din'', ''Zare'', ''Afsar-ud-Din Zare''),
|
|
(''Dita'', ''Kreslina'', ''Dita Kreslina''),
|
|
(''TunC'', ''Polat'', ''TunC Polat''),
|
|
(''Aleksandra'', ''Semjonov'', ''Aleksandra Semjonov''),
|
|
(''Bianh'', ''Banh'', ''Bianh Banh''),
|
|
(''Promita'', ''Chattopadhyay'', ''Promita Chattopadhyay''),
|
|
(''Alessandro'', ''Sagese'', ''Alessandro Sagese''),
|
|
(''Dinh'', ''Mai'', ''Dinh Mai''),
|
|
(''Cam'', ''Dinh'', ''Cam Dinh''),
|
|
(''Shyam'', ''Sarma'', ''Shyam Sarma''),
|
|
(''Ramesh'', ''Das'', ''Ramesh Das''),
|
|
(''Inna'', ''Kask'', ''Inna Kask''),
|
|
(''Luis'', ''Saucedo'', ''Luis Saucedo''),
|
|
(''Ilgonis'', ''Prieditis'', ''Ilgonis Prieditis''),
|
|
(''Min-ji'', ''Nan'', ''Min-ji Nan''),
|
|
(''Risto'', ''Lepmets'', ''Risto Lepmets''),
|
|
(''Vjekoslava'', ''Brkic'', ''Vjekoslava Brkic''),
|
|
(''Spidols'', ''Podnieks'', ''Spidols Podnieks''),
|
|
(''Orions'', ''Podnieks'', ''Orions Podnieks''),
|
|
(''Kristine'', ''Zvaigzne'', ''Kristine Zvaigzne''),
|
|
(''Kalyani'', ''Benjaree'', ''Kalyani Benjaree''),
|
|
(''Gadhar'', ''Das'', ''Gadhar Das''),
|
|
(''Sashi'', ''Dev'', ''Sashi Dev''),
|
|
(''Bhadram'', ''Kamasamudram'', ''Bhadram Kamasamudram''),
|
|
(''Som'', ''Mukherjee'', ''Som Mukherjee''),
|
|
(''Kyle'', ''Redd'', ''Kyle Redd''),
|
|
(''Śani'', ''Sarkar'', ''Śani Sarkar''),
|
|
(''Narendra'', ''Tickoo'', ''Narendra Tickoo''),
|
|
(''Ganesh'', ''Majumdar'', ''Ganesh Majumdar''),
|
|
(''Anusuya'', ''Dutta'', ''Anusuya Dutta''),
|
|
(''Katarina'', ''Filipovic'', ''Katarina Filipovic''),
|
|
(''Dhanya'', ''Mokkapati'', ''Dhanya Mokkapati''),
|
|
(''Mehmet'', ''Arslan'', ''Mehmet Arslan''),
|
|
(''Gita'', ''Bhutia'', ''Gita Bhutia''),
|
|
(''Tapas'', ''Sikdar'', ''Tapas Sikdar''),
|
|
(''Lucija'', ''Cosic'', ''Lucija Cosic''),
|
|
(''Vitalijs'', ''Baltins'', ''Vitalijs Baltins''),
|
|
(''Kanchana'', ''Dutta'', ''Kanchana Dutta''),
|
|
(''Elvira'', ''Konovalova'', ''Elvira Konovalova''),
|
|
(''Preecha'', ''Suppamongkon'', ''Preecha Suppamongkon''),
|
|
(''Min-ji'', ''Shim'', ''Min-ji Shim''),
|
|
(''Noora'', ''Piili'', ''Noora Piili''),
|
|
(''Arshagouhi'', ''Deilami'', ''Arshagouhi Deilami''),
|
|
(''Risto'', ''Lill'', ''Risto Lill''),
|
|
(''Emma'', ''Van Zant'', ''Emma Van Zant''),
|
|
(''Hardi'', ''Laurits'', ''Hardi Laurits''),
|
|
(''Zoltan'', ''Gero'', ''Zoltan Gero''),
|
|
(''Soner'', ''Guler'', ''Soner Guler''),
|
|
(''Abhra'', ''Ganguly'', ''Abhra Ganguly''),
|
|
(''Fabrice'', ''Cloutier'', ''Fabrice Cloutier''),
|
|
(''Yonca'', ''Basturk'', ''Yonca Basturk''),
|
|
(''Nandita'', ''Bhuiyan'', ''Nandita Bhuiyan''),
|
|
(''Omar'', ''Lind'', ''Omar Lind''),
|
|
(''Mai'', ''Thai'', ''Mai Thai''),
|
|
(''David'', ''Novacek '', ''David Novacek ''),
|
|
(''Adriana'', ''Pena'', ''Adriana Pena''),
|
|
(''Rato'', ''Novakovic'', ''Rato Novakovic''),
|
|
(''Neelam'', ''Ahmadi'', ''Neelam Ahmadi''),
|
|
(''Phoung'', ''Du'', ''Phoung Du''),
|
|
(''Luca'', ''Barese'', ''Luca Barese''),
|
|
(''Aasaajyoeti'', ''Bhogireddy'', ''Aasaajyoeti Bhogireddy''),
|
|
(''Catherine'', ''Potts'', ''Catherine Potts''),
|
|
(''Aishwarya'', ''Tottempudi'', ''Aishwarya Tottempudi''),
|
|
(''Aarti'', ''Kommineni'', ''Aarti Kommineni''),
|
|
(''Lilli'', ''Peetre'', ''Lilli Peetre''),
|
|
(''Lassi'', ''Santala'', ''Lassi Santala''),
|
|
(''Umut'', ''Acar'', ''Umut Acar''),
|
|
(''Kevin'', ''Rummo'', ''Kevin Rummo''),
|
|
(''Nargis'', ''Shakiba'', ''Nargis Shakiba''),
|
|
(''Irma'', ''Berzina'', ''Irma Berzina''),
|
|
(''Irma'', ''Auzina'', ''Irma Auzina''),
|
|
(''Manindra'', ''Sidhu'', ''Manindra Sidhu''),
|
|
(''Aita'', ''Kasesalu'', ''Aita Kasesalu''),
|
|
(''Narayan'', ''Ogra'', ''Narayan Ogra''),
|
|
(''Amrita'', ''Shetty'', ''Amrita Shetty''),
|
|
(''Logan'', ''Dixon'', ''Logan Dixon''),
|
|
(''Celik'', ''TunC'', ''Celik TunC''),
|
|
(''David'', ''Jaramillo'', ''David Jaramillo''),
|
|
(''Gagan'', ''Sengupta'', ''Gagan Sengupta''),
|
|
(''Kalpana'', ''Sen'', ''Kalpana Sen''),
|
|
(''Charline'', ''Monjeau'', ''Charline Monjeau''),
|
|
(''Essie'', ''Braggs'', ''Essie Braggs''),
|
|
(''Teresa'', ''Fields'', ''Teresa Fields''),
|
|
(''Ron'', ''Williams'', ''Ron Williams''),
|
|
(''Daniela'', ''Lo Duca'', ''Daniela Lo Duca''),
|
|
(''Ashutosh'', ''Bandopadhyay'', ''Ashutosh Bandopadhyay''),
|
|
(''Cristina'', ''Angelo'', ''Cristina Angelo''),
|
|
(''Indranil'', ''Prabhupāda'', ''Indranil Prabhupāda''),
|
|
(''Julia'', ''Eder'', ''Julia Eder''),
|
|
(''Baebeesaroejini'', ''Veturi'', ''Baebeesaroejini Veturi''),
|
|
(''Giovanna'', ''Loggia'', ''Giovanna Loggia''),
|
|
(''Nicola'', ''Dellucci'', ''Nicola Dellucci''),
|
|
(''Pavel'', ''Bures'', ''Pavel Bures''),
|
|
(''Bhaamini'', ''Palagummi'', ''Bhaamini Palagummi''),
|
|
(''Cyrus'', ''Zardindoost'', ''Cyrus Zardindoost''),
|
|
(''Jautrite'', ''Avotina'', ''Jautrite Avotina''),
|
|
(''Matija'', ''Rusl'', ''Matija Rusl''),
|
|
(''Daniella'', ''Cavalcante'', ''Daniella Cavalcante''),
|
|
(''Vedrana'', ''Kovacevic'', ''Vedrana Kovacevic''),
|
|
(''Isa'', ''Hulsegge'', ''Isa Hulsegge''),
|
|
(''Ivana'', ''Popov'', ''Ivana Popov''),
|
|
(''Tuulikki'', ''Linna'', ''Tuulikki Linna''),
|
|
(''Allan'', ''Olofsson'', ''Allan Olofsson''),
|
|
(''Cosmin'', ''Vulpes'', ''Cosmin Vulpes''),
|
|
(''Dipti'', ''Shah'', ''Dipti Shah''),
|
|
(''Teresa'', ''Borgen'', ''Teresa Borgen''),
|
|
(''Veronika'', ''Necesana'', ''Veronika Necesana''),
|
|
(''Alfonso'', ''Barese'', ''Alfonso Barese''),
|
|
(''Erik'', ''Malk'', ''Erik Malk''),
|
|
(''Deepa'', ''Nandamuri'', ''Deepa Nandamuri''),
|
|
(''Arka'', ''Chatterjee'', ''Arka Chatterjee''),
|
|
(''Veronika'', ''Svancarova'', ''Veronika Svancarova''),
|
|
(''Felipe'', ''Robles'', ''Felipe Robles''),
|
|
(''Tami'', ''Shuler'', ''Tami Shuler''),
|
|
(''Flynn'', ''Moresby'', ''Flynn Moresby''),
|
|
(''Harsha'', ''Raju'', ''Harsha Raju''),
|
|
(''Aishwarya'', ''Dantuluri'', ''Aishwarya Dantuluri''),
|
|
(''Truman'', ''Schmidt'', ''Truman Schmidt''),
|
|
(''Divyendu'', ''Sen'', ''Divyendu Sen''),
|
|
(''Nhung'', ''Ton'', ''Nhung Ton''),
|
|
(''Cuneyt'', ''Arslan'', ''Cuneyt Arslan''),
|
|
(''Drishti'', ''Bose'', ''Drishti Bose''),
|
|
(''Farzana'', ''Habibi'', ''Farzana Habibi''),
|
|
(''Angelica'', ''Nilsson'', ''Angelica Nilsson''),
|
|
(''Arjun'', ''Bhowmick'', ''Arjun Bhowmick''),
|
|
(''Salamans'', ''Karklins'', ''Salamans Karklins''),
|
|
(''Hyun-Shik'', ''Lee'', ''Hyun-Shik Lee''),
|
|
(''Anand'', ''Mudaliyar'', ''Anand Mudaliyar''),
|
|
(''Carlos'', ''Aguayo'', ''Carlos Aguayo''),
|
|
(''Sharmila'', ''Bhutia'', ''Sharmila Bhutia''),
|
|
(''Hanita'', ''Nookala'', ''Hanita Nookala''),
|
|
(''Ondrej'', ''Polak'', ''Ondrej Polak''),
|
|
(''Serdar'', ''ozden'', ''Serdar ozden''),
|
|
(''Serdar'', ''ozCelik'', ''Serdar ozCelik''),
|
|
(''Javiera'', ''Laureano'', ''Javiera Laureano''),
|
|
(''Rafael'', ''Azevedo'', ''Rafael Azevedo''),
|
|
(''Raj'', ''Verma'', ''Raj Verma''),
|
|
(''Philippe'', ''Bellefeuille'', ''Philippe Bellefeuille''),
|
|
(''Arda'', ''Gunes'', ''Arda Gunes''),
|
|
(''Marcello'', ''Longo'', ''Marcello Longo''),
|
|
(''Marcela'', ''Antunes'', ''Marcela Antunes''),
|
|
(''Matteo'', ''Cattaneo'', ''Matteo Cattaneo''),
|
|
(''Prasad'', ''Raju'', ''Prasad Raju''),
|
|
(''Peep'', ''Lill'', ''Peep Lill''),
|
|
(''Chompoo'', ''Atitarn'', ''Chompoo Atitarn''),
|
|
(''Emma'', ''Salpa'', ''Emma Salpa''),
|
|
(''Le'', ''Chu'', ''Le Chu''),
|
|
(''Kailash'', ''Mittal'', ''Kailash Mittal''),
|
|
(''Pinja'', ''Pekkanen'', ''Pinja Pekkanen''),
|
|
(''Karita'', ''Jantunen'', ''Karita Jantunen''),
|
|
(''Antonio Carlos'', ''Rocha'', ''Antonio Carlos Rocha''),
|
|
(''Kim-ly'', ''Vanh'', ''Kim-ly Vanh''),
|
|
(''Cuc'', ''Du'', ''Cuc Du''),
|
|
(''Chaowalit'', ''Rojumanong'', ''Chaowalit Rojumanong''),
|
|
(''Maria'', ''Nechita'', ''Maria Nechita''),
|
|
(''Shirley'', ''Doane'', ''Shirley Doane''),
|
|
(''Roberto'', ''Sal'', ''Roberto Sal''),
|
|
(''Damyanti'', ''Bhamidipati'', ''Damyanti Bhamidipati''),
|
|
(''Aleksandrs'', ''Purins'', ''Aleksandrs Purins''),
|
|
(''Alen'', ''Kustrin'', ''Alen Kustrin''),
|
|
(''Urve'', ''Kasesalu'', ''Urve Kasesalu''),
|
|
(''David'', ''Serbanescu'', ''David Serbanescu''),
|
|
(''Nadir'', ''Seddigh'', ''Nadir Seddigh''),
|
|
(''Dhirendro'', ''Ghatak'', ''Dhirendro Ghatak''),
|
|
(''Monika'', ''Kozakova'', ''Monika Kozakova''),
|
|
(''Riccardo'', ''Esposito'', ''Riccardo Esposito''),
|
|
(''Aleksandra'', ''Abola'', ''Aleksandra Abola''),
|
|
(''Agrita'', ''Abele'', ''Agrita Abele''),
|
|
(''Sabrina'', ''Baresi'', ''Sabrina Baresi''),
|
|
(''Mudar'', ''Mihajlovik'', ''Mudar Mihajlovik''),
|
|
(''Liga'', ''Dumina'', ''Liga Dumina''),
|
|
(''Buu'', ''Tran'', ''Buu Tran''),
|
|
(''Annette '', ''Hetu'', ''Annette Hetu''),
|
|
(''Sami'', ''Lundin'', ''Sami Lundin''),
|
|
(''Sylvie'', ''Methot'', ''Sylvie Methot''),
|
|
(''Petr'', ''Spousta'', ''Petr Spousta''),
|
|
(''Lorenzo'', ''Howland'', ''Lorenzo Howland''),
|
|
(''Fatima'', ''Pulido'', ''Fatima Pulido''),
|
|
(''Rui'', ''Carvalho'', ''Rui Carvalho'')) AS Names(FirstName, LastName, FullName)
|
|
),
|
|
UnusedNames
|
|
AS
|
|
(
|
|
SELECT *
|
|
FROM NamesToUse AS ntu
|
|
WHERE NOT EXISTS (SELECT 1 FROM [Application].People AS p WHERE p.FullName = ntu.FullName)
|
|
)
|
|
SELECT TOP(1) @PrimaryContactFullName = un.FullName,
|
|
@PrimaryContactFirstName = un.FirstName
|
|
FROM UnusedNames AS un
|
|
ORDER BY NEWID();
|
|
|
|
SET @CustomerID = NEXT VALUE FOR Sequences.CustomerID;
|
|
SET @CustomerCategoryID = (SELECT TOP(1) CustomerCategoryID
|
|
FROM Sales.CustomerCategories
|
|
WHERE CustomerCategoryName IN (N''Novelty Shop'', N''Supermarket'', N''Computer Store'', N''Gift Store'', N''Corporate'')
|
|
ORDER BY NEWID());
|
|
SET @CityID = (SELECT TOP(1) CityID FROM [Application].Cities AS c
|
|
ORDER BY NEWID());
|
|
SET @CityName = (SELECT CityName FROM [Application].Cities WHERE CityID = @CityID);
|
|
SET @CityStateProvinceID = (SELECT StateProvinceID FROM [Application].Cities WHERE CityID = @CityID);
|
|
SET @CityStateProvinceCode = (SELECT StateProvinceCode
|
|
FROM [Application].StateProvinces
|
|
WHERE StateProvinceID = @CityStateProvinceID);
|
|
SET @AreaCode = DataLoadSimulation.GetAreaCode(@CityStateProvinceCode);
|
|
SET @StreetSuffix = (SELECT TOP(1) StreetType
|
|
FROM (VALUES(N''Street''), (N''Lane''), (N''Avenue''), (N''Boulevard''), (N''Crescent''), (N''Road'')) AS st(StreetType)
|
|
ORDER BY NEWID());
|
|
SET @CompanySuffix = (SELECT TOP(1) CompanySuffix
|
|
FROM (VALUES(N''Inc''), (N''Corp''), (N''LLC'')) AS cs(CompanySuffix)
|
|
ORDER BY NEWID());
|
|
SET @StorePrefix = (SELECT TOP(1) StorePrefix
|
|
FROM (VALUES(N''Shop''), (N''Suite''), (N''Unit'')) AS sp(StorePrefix)
|
|
ORDER BY NEWID());
|
|
SET @CreditLimit = CEILING(RAND() * 30) * 100 + 1000;
|
|
|
|
SET @DeliveryAddressLine1 = @StorePrefix + N'' '' + CAST(CEILING(RAND() * 30) + 1 AS nvarchar(20));
|
|
SET @DeliveryAddressLine2 = CAST(CEILING(RAND() * 2000) + 1 AS nvarchar(20)) + N'' ''
|
|
+ (SELECT TOP(1) PreferredName FROM [Application].People ORDER BY NEWID())
|
|
+ N'' '' + @StreetSuffix;
|
|
SET @DeliveryPostalCode = CAST(CEILING(RAND() * 800) + 90000 AS nvarchar(20));
|
|
SET @PostalAddressLine1 = N''PO Box '' + CAST(CEILING(RAND() * 10000) + 10 AS nvarchar(20));
|
|
SET @PostalAddressLine2 = (SELECT TOP(1) PreferredName FROM [Application].People ORDER BY NEWID()) + N''ville'';
|
|
SET @PostalPostalCode = @DeliveryPostalCode;
|
|
|
|
SET @PrimaryContactPersonID = NEXT VALUE FOR Sequences.PersonID;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT [Application].People
|
|
(PersonID, FullName, PreferredName, IsPermittedToLogon, LogonName,
|
|
IsExternalLogonProvider, HashedPassword, IsSystemUser, IsEmployee,
|
|
IsSalesperson, UserPreferences, PhoneNumber, FaxNumber,
|
|
EmailAddress, LastEditedBy, ValidFrom, ValidTo)
|
|
VALUES
|
|
(@PrimaryContactPersonID, @PrimaryContactFullName, @PrimaryContactFirstName, 0, N''NO LOGON'',
|
|
0, NULL, 0, 0,
|
|
0, NULL, N''('' + CAST(@AreaCode AS nvarchar(20)) + N'') 555-0100'', N''('' + CAST(@AreaCode AS nvarchar(20)) + N'') 555-0101'',
|
|
LOWER(REPLACE(@PrimaryContactFirstName, N'''''''', N'''')) + N''@example.com'', 1, @CurrentDateTime, @EndOfTime);
|
|
|
|
INSERT Sales.Customers
|
|
(CustomerID, CustomerName, BillToCustomerID, CustomerCategoryID,
|
|
BuyingGroupID, PrimaryContactPersonID, AlternateContactPersonID, DeliveryMethodID,
|
|
DeliveryCityID, PostalCityID, CreditLimit, AccountOpenedDate, StandardDiscountPercentage,
|
|
IsStatementSent, IsOnCreditHold, PaymentDays, PhoneNumber, FaxNumber,
|
|
DeliveryRun, RunPosition, WebsiteURL, DeliveryAddressLine1, DeliveryAddressLine2,
|
|
DeliveryPostalCode, DeliveryLocation, PostalAddressLine1, PostalAddressLine2,
|
|
PostalPostalCode, LastEditedBy, ValidFrom, ValidTo)
|
|
VALUES
|
|
(@CustomerID, @PrimaryContactFullName, @CustomerID, @CustomerCategoryID,
|
|
NULL, @PrimaryContactPersonID, NULL, @DeliveryMethodID,
|
|
@CityID, @CityID, @CreditLimit, @StartingWhen, 0,
|
|
0, 0, 7, N''('' + CAST(@AreaCode AS nvarchar(20)) + N'') 555-0100'', N''('' + CAST(@AreaCode AS nvarchar(20)) + N'') 555-0101'',
|
|
NULL, NULL, N''http://www.microsoft.com/'', @DeliveryAddressLine1, @DeliveryAddressLine2,
|
|
@DeliveryPostalCode, (SELECT TOP(1) Location FROM [Application].Cities WHERE CityID = @CityID),
|
|
@PostalAddressLine1, @PostalAddressLine2,
|
|
@PostalPostalCode, 1, @CurrentDateTime, @EndOfTime);
|
|
|
|
COMMIT;
|
|
|
|
SET @Counter += 1;
|
|
END;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'AddSpecialDeals')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.AddSpecialDeals
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF CAST(@CurrentDateTime AS date) = ''20151231''
|
|
BEGIN
|
|
BEGIN TRAN;
|
|
|
|
INSERT Sales.SpecialDeals
|
|
(StockItemID, CustomerID, BuyingGroupID, CustomerCategoryID, StockGroupID,
|
|
DealDescription, StartDate, EndDate, DiscountAmount, DiscountPercentage,
|
|
UnitPrice, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(NULL, NULL, (SELECT BuyingGroupID FROM Sales.BuyingGroups WHERE BuyingGroupName = N''Wingtip Toys''),
|
|
NULL, (SELECT StockGroupID FROM Warehouse.StockGroups WHERE StockGroupName = N''USB Novelties''),
|
|
N''10% 1st qtr USB Wingtip'', ''20160101'', ''20160331'', NULL, 10, NULL,
|
|
2, @StartingWhen);
|
|
|
|
INSERT Sales.SpecialDeals
|
|
(StockItemID, CustomerID, BuyingGroupID, CustomerCategoryID, StockGroupID,
|
|
DealDescription, StartDate, EndDate, DiscountAmount, DiscountPercentage,
|
|
UnitPrice, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(NULL, NULL, (SELECT BuyingGroupID FROM Sales.BuyingGroups WHERE BuyingGroupName = N''Tailspin Toys''),
|
|
NULL, (SELECT StockGroupID FROM Warehouse.StockGroups WHERE StockGroupName = N''USB Novelties''),
|
|
N''15% 2nd qtr USB Tailspin'', ''20160401'', ''20160630'', NULL, 15, NULL,
|
|
2, @StartingWhen);
|
|
|
|
COMMIT;
|
|
|
|
END;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Adding special deals'';
|
|
END;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'AddStockItems')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.AddStockItems
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @NumberOfStockItems int = 0;
|
|
|
|
IF CAST(@CurrentDateTime AS date) = ''20160101''
|
|
BEGIN
|
|
SET @NumberOfStockItems = 2;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (220,''Novelty chilli chocolates 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8302039293929'',10,8.55,12.23,0.25,''Watch your friends faces when they eat these'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (221,''Novelty chilli chocolates 500g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''500g'',3,12,1,''8302039293647'',10,14.5,20.74,0.5,''Watch your friends faces when they eat these'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (220,360,''CH-1'',360,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (221,12,''CH-2'',12,8.75,120,250,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 220, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 221, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
|
|
COMMIT;
|
|
|
|
END ELSE IF CAST(@CurrentDateTime AS date) = ''20160102''
|
|
BEGIN
|
|
SET @NumberOfStockItems = 2;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (222,''Chocolate beetles 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293820'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (223,''Chocolate echidnas 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293728'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (222,120,''CH-3'',120,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (223,120,''CH-4'',120,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 222, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 223, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
|
|
COMMIT;
|
|
|
|
END ELSE IF CAST(@CurrentDateTime AS date) = ''20160104''
|
|
BEGIN
|
|
SET @NumberOfStockItems = 2;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (224,''Chocolate frogs 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293987'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (225,''Chocolate sharks 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293234'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (224,144,''CH-5'',144,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (225,160,''CH-6'',160,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 224, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 225, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
|
|
COMMIT;
|
|
|
|
END ELSE IF CAST (@CurrentDateTime AS date) = ''20160105''
|
|
BEGIN
|
|
SET @NumberOfStockItems = 2;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (226,''White chocolate snow balls 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293236'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItems (StockItemID, StockItemName, SupplierID, ColorID, UnitPackageID, OuterPackageID, Brand, Size, LeadTimeDays, QuantityPerOuter, IsChillerStock, Barcode, TaxRate, UnitPrice, RecommendedRetailPrice, TypicalWeightPerUnit, MarketingComments, InternalComments, Photo, CustomFields, LastEditedBy, ValidFrom, ValidTo) VALUES (227,''White chocolate moon rocks 250g'',(SELECT SupplierID FROM Purchasing.Suppliers WHERE SupplierName = N''A Datum Corporation''),(SELECT ColorID FROM Warehouse.Colors WHERE ColorName = N''NULL''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Bag''),(SELECT PackageTypeID FROM Warehouse.PackageTypes WHERE PackageTypeName = N''Carton''),NULL,''250g'',3,24,1,''8792838293289'',10,8.55,12.23,0.25,''Perfect for your child''''s party'',NULL,NULL,NULL,1,@CurrentDateTime,@EndOfTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (226,24,''CH-7'',24,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemHoldings (StockItemID, QuantityOnHand, BinLocation, LastStocktakeQuantity, LastCostPrice, ReorderLevel, TargetStockLevel, LastEditedBy, LastEditedWhen) VALUES (227,48,''CH-8'',48,4.75,240,500,1,@CurrentDateTime);
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 226, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
INSERT Warehouse.StockItemStockGroups (StockItemID, StockGroupID, LastEditedBy, LastEditedWhen) SELECT 227, sg.StockGroupID, 1, @CurrentDateTime FROM Warehouse.StockGroups AS sg WHERE sg.StockGroupName IN (N''Novelty Items'', N''Edible Novelties'');
|
|
|
|
COMMIT;
|
|
END;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Adding '' + CAST(@NumberOfStockItems AS nvarchar(20)) + N'' stock items'';
|
|
END;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'ChangePasswords')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.ChangePasswords
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
-- 1 in 4 days will be 1 password change, 1 in 8 days will be 2 passwords changed
|
|
|
|
DECLARE @NumberOfPasswordsToChange int = (SELECT TOP(1) Quantity
|
|
FROM (VALUES (0), (0), (0), (0), (0), (1), (1), (2)) AS q(Quantity)
|
|
ORDER BY NEWID());
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Changing '' + CAST(@NumberOfPasswordsToChange AS nvarchar(20)) + N'' passwords'';
|
|
END;
|
|
|
|
DECLARE @Counter int = 0;
|
|
DECLARE @PersonID int;
|
|
DECLARE @EmailAddress nvarchar(256);
|
|
DECLARE @HashedPassword varbinary(max);
|
|
DECLARE @FullName nvarchar(50);
|
|
|
|
WHILE @Counter < @NumberOfPasswordsToChange
|
|
BEGIN
|
|
SELECT TOP(1) @PersonID = PersonID,
|
|
@EmailAddress = EmailAddress,
|
|
@FullName = FullName
|
|
FROM [Application].People
|
|
WHERE IsPermittedToLogon <> 0 AND PersonID <> 1
|
|
ORDER BY NEWID();
|
|
|
|
UPDATE [Application].People
|
|
SET HashedPassword = HASHBYTES(N''SHA2_256'', N''SQLRocks!00'' + @FullName),
|
|
[ValidFrom] = @StartingWhen
|
|
WHERE PersonID = @PersonID;
|
|
|
|
SET @Counter += 1;
|
|
END;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'CreateCustomerOrders')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.CreateCustomerOrders
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@NumberOfCustomerOrders int,
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Creating '' + CAST(@NumberOfCustomerOrders AS nvarchar(20)) + N'' customer orders'';
|
|
END;
|
|
|
|
DECLARE @OrderCounter int = 0;
|
|
DECLARE @OrderLineCounter int = 0;
|
|
DECLARE @CustomerID int;
|
|
DECLARE @OrderID int;
|
|
DECLARE @PrimaryContactPersonID int;
|
|
DECLARE @SalespersonPersonID int;
|
|
DECLARE @ExpectedDeliveryDate date = DATEADD(day, 1, @CurrentDateTime);
|
|
DECLARE @OrderDateTime datetime = @StartingWhen;
|
|
DECLARE @NumberOfOrderLines int;
|
|
DECLARE @StockItemID int;
|
|
DECLARE @StockItemName nvarchar(100);
|
|
DECLARE @UnitPackageID int;
|
|
DECLARE @QuantityPerOuter int;
|
|
DECLARE @Quantity int;
|
|
DECLARE @CustomerPrice decimal(18,2);
|
|
DECLARE @TaxRate decimal(18,3);
|
|
|
|
-- No deliveries on weekends
|
|
|
|
SET DATEFIRST 7;
|
|
|
|
WHILE DATEPART(weekday, @ExpectedDeliveryDate) IN (1, 7)
|
|
BEGIN
|
|
SET @ExpectedDeliveryDate = DATEADD(day, 1, @ExpectedDeliveryDate);
|
|
END;
|
|
|
|
-- Generate the required orders
|
|
|
|
WHILE @OrderCounter < @NumberOfCustomerOrders
|
|
BEGIN
|
|
|
|
BEGIN TRAN;
|
|
|
|
SET @OrderID = NEXT VALUE FOR Sequences.OrderID;
|
|
|
|
SELECT TOP(1) @CustomerID = c.CustomerID,
|
|
@PrimaryContactPersonID = c.PrimaryContactPersonID
|
|
FROM Sales.Customers AS c
|
|
WHERE c.IsOnCreditHold = 0
|
|
ORDER BY NEWID();
|
|
|
|
SET @SalespersonPersonID = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsSalesperson <> 0
|
|
ORDER BY NEWID());
|
|
|
|
INSERT Sales.Orders
|
|
(OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate,
|
|
ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments,
|
|
PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(@OrderID, @CustomerID, @SalespersonPersonID, NULL, @PrimaryContactPersonID, NULL, @CurrentDateTime,
|
|
@ExpectedDeliveryDate, CAST(CEILING(RAND() * 10000) + 10000 AS nvarchar(20)), 1, NULL, NULL, NULL,
|
|
NULL, 1, @OrderDateTime);
|
|
|
|
SET @NumberOfOrderLines = 1 + CEILING(RAND() * 4);
|
|
SET @OrderLineCounter = 0;
|
|
|
|
WHILE @OrderLineCounter < @NumberOfOrderLines
|
|
BEGIN
|
|
SELECT TOP(1) @StockItemID = si.StockItemID,
|
|
@StockItemName = si.StockItemName,
|
|
@UnitPackageID = si.UnitPackageID,
|
|
@QuantityPerOuter = si.QuantityPerOuter,
|
|
@TaxRate = si.TaxRate
|
|
FROM Warehouse.StockItems AS si
|
|
WHERE NOT EXISTS (SELECT 1 FROM Sales.OrderLines AS ol
|
|
WHERE ol.OrderID = @OrderID
|
|
AND ol.StockItemID = si.StockItemID)
|
|
ORDER BY NEWID();
|
|
|
|
SET @Quantity = @QuantityPerOuter * (1 + FLOOR(RAND() * 10));
|
|
SET @CustomerPrice = Website.CalculateCustomerPrice(@CustomerID, @StockItemID, @CurrentDateTime);
|
|
|
|
INSERT Sales.OrderLines
|
|
(OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice,
|
|
TaxRate, PickedQuantity, PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(@OrderID, @StockItemID, @StockItemName, @UnitPackageID, @Quantity, @CustomerPrice,
|
|
@TaxRate, 0, NULL, 1, @StartingWhen);
|
|
|
|
SET @OrderLineCounter += 1;
|
|
END;
|
|
|
|
COMMIT;
|
|
|
|
SET @OrderCounter += 1;
|
|
END;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'InvoicePickedOrders')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.InvoicePickedOrders
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Invoicing picked orders'';
|
|
END;
|
|
|
|
DECLARE @OrderID int;
|
|
DECLARE @InvoiceID int;
|
|
DECLARE @PickingCompletedWhen datetime;
|
|
DECLARE @BackorderOrderID int;
|
|
DECLARE @BillToCustomerID int;
|
|
DECLARE @InvoicingPersonID int = (SELECT TOP(1) PersonID FROM [Application].People WHERE IsEmployee <> 0 ORDER BY NEWID());
|
|
DECLARE @PackedByPersonID int = (SELECT TOP(1) PersonID FROM [Application].People WHERE IsEmployee <> 0 ORDER BY NEWID());
|
|
DECLARE @TotalDryItems int;
|
|
DECLARE @TotalChillerItems int;
|
|
DECLARE @TransactionAmount decimal(18,2);
|
|
DECLARE @TaxAmount decimal(18,2);
|
|
DECLARE @ReturnedDeliveryData nvarchar(max);
|
|
DECLARE @DeliveryEvent nvarchar(max);
|
|
|
|
DECLARE OrderList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT o.OrderID, o.PickingCompletedWhen, c.BillToCustomerID
|
|
FROM Sales.Orders AS o
|
|
INNER JOIN Sales.Customers AS c
|
|
ON o.CustomerID = c.CustomerID
|
|
WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i WHERE i.OrderID = o.OrderID) -- not already invoiced
|
|
AND c.IsOnCreditHold = 0 -- and customer not on credit hold
|
|
AND ((o.PickingCompletedWhen IS NOT NULL) -- order completely picked
|
|
OR (o.PickingCompletedWhen IS NULL -- order not picked but customer happy
|
|
AND o.IsUndersupplyBackordered <> 0 -- for part shipments and at least one
|
|
AND EXISTS (SELECT 1 FROM Sales.OrderLines AS ol -- order line has been picked
|
|
WHERE ol.OrderID = o.OrderID
|
|
AND ol.PickingCompletedWhen IS NOT NULL)));
|
|
|
|
OPEN OrderList;
|
|
FETCH NEXT FROM OrderList INTO @OrderID, @PickingCompletedWhen, @BillToCustomerID;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
IF @PickingCompletedWhen IS NULL
|
|
BEGIN -- need to reorder undersupplied items
|
|
|
|
BEGIN TRAN;
|
|
|
|
SET @BackorderOrderID = NEXT VALUE FOR Sequences.OrderID;
|
|
SET @PickingCompletedWhen = @StartingWhen;
|
|
|
|
-- create the backorder order
|
|
INSERT Sales.Orders
|
|
(OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID,
|
|
OrderDate, ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered,
|
|
Comments, DeliveryInstructions, InternalComments, PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
SELECT @BackorderOrderID, o.CustomerID, o.SalespersonPersonID, NULL, o.ContactPersonID, NULL,
|
|
o.OrderDate, o.ExpectedDeliveryDate, o.CustomerPurchaseOrderNumber, 1,
|
|
o.Comments, o.DeliveryInstructions, o.InternalComments, NULL, @InvoicingPersonID, @StartingWhen
|
|
FROM Sales.Orders AS o
|
|
WHERE o.OrderID = @OrderID;
|
|
|
|
-- move the items that haven''t been supplied to the new order
|
|
UPDATE Sales.OrderLines
|
|
SET OrderID = @BackorderOrderID,
|
|
LastEditedBy = @InvoicingPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE OrderID = @OrderID
|
|
AND PickingCompletedWhen IS NULL;
|
|
|
|
-- flag the original order as backordered and picking completed
|
|
UPDATE Sales.Orders
|
|
SET BackorderOrderID = @BackorderOrderID,
|
|
PickingCompletedWhen = @PickingCompletedWhen,
|
|
LastEditedBy = @InvoicingPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE OrderID = @OrderID;
|
|
|
|
COMMIT;
|
|
END;
|
|
|
|
SELECT @TotalDryItems = SUM(CASE WHEN si.IsChillerStock <> 0 THEN 0 ELSE 1 END),
|
|
@TotalChillerItems = SUM(CASE WHEN si.IsChillerStock <> 0 THEN 1 ELSE 0 END)
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
WHERE ol.OrderID = @OrderID;
|
|
|
|
-- now invoice whatever is left on the order
|
|
BEGIN TRAN;
|
|
|
|
SET @InvoiceID = NEXT VALUE FOR Sequences.InvoiceID;
|
|
|
|
SET @ReturnedDeliveryData = N''{"Events": []}'';
|
|
SET @DeliveryEvent = N''{ }'';
|
|
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Event'', N''Ready for collection'');
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.EventTime'', CONVERT(nvarchar(20), @StartingWhen, 126));
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.ConNote'', N''EAN-125-'' + CAST(@InvoiceID + 1050 AS nvarchar(20)));
|
|
|
|
SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''append $.Events'', JSON_QUERY(@DeliveryEvent));
|
|
|
|
INSERT Sales.Invoices
|
|
(InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID,
|
|
SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber,
|
|
IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments,
|
|
TotalDryItems, TotalChillerItems,
|
|
DeliveryRun, RunPosition, ReturnedDeliveryData, LastEditedBy, LastEditedWhen)
|
|
SELECT @InvoiceID, c.CustomerID, @BillToCustomerID, @OrderID, c.DeliveryMethodID, o.ContactPersonID, btc.PrimaryContactPersonID,
|
|
o.SalespersonPersonID, @PackedByPersonID, @StartingWhen, o.CustomerPurchaseOrderNumber,
|
|
0, NULL, NULL, c.DeliveryAddressLine1 + N'', '' + c.DeliveryAddressLine2, NULL,
|
|
@TotalDryItems, @TotalChillerItems,
|
|
c.DeliveryRun, c.RunPosition, @ReturnedDeliveryData, @InvoicingPersonID, @StartingWhen
|
|
FROM Sales.Orders AS o
|
|
INNER JOIN Sales.Customers AS c
|
|
ON o.CustomerID = c.CustomerID
|
|
INNER JOIN Sales.Customers AS btc
|
|
ON btc.CustomerID = c.BillToCustomerID
|
|
WHERE o.OrderID = @OrderID;
|
|
|
|
INSERT Sales.InvoiceLines
|
|
(InvoiceID, StockItemID, [Description], PackageTypeID,
|
|
Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice,
|
|
LastEditedBy, LastEditedWhen)
|
|
SELECT @InvoiceID, ol.StockItemID, ol.[Description], ol.PackageTypeID,
|
|
ol.PickedQuantity, ol.UnitPrice, ol.TaxRate,
|
|
ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2),
|
|
ROUND(ol.PickedQuantity * (ol.UnitPrice - sih.LastCostPrice), 2),
|
|
ROUND(ol.PickedQuantity * ol.UnitPrice, 2)
|
|
+ ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2),
|
|
@InvoicingPersonID, @StartingWhen
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
INNER JOIN Warehouse.StockItemHoldings AS sih
|
|
ON si.StockItemID = sih.StockItemID
|
|
WHERE ol.OrderID = @OrderID
|
|
ORDER BY ol.OrderLineID;
|
|
|
|
INSERT Warehouse.StockItemTransactions
|
|
(StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID,
|
|
TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen)
|
|
SELECT il.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Issue''),
|
|
i.CustomerID, i.InvoiceID, NULL, NULL,
|
|
@StartingWhen, 0 - il.Quantity, @InvoicingPersonID, @StartingWhen
|
|
FROM Sales.InvoiceLines AS il
|
|
INNER JOIN Sales.Invoices AS i
|
|
ON il.InvoiceID = i.InvoiceID
|
|
WHERE i.InvoiceID = @InvoiceID
|
|
ORDER BY il.InvoiceLineID;
|
|
|
|
WITH StockItemTotals
|
|
AS
|
|
(
|
|
SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity
|
|
FROM Sales.InvoiceLines aS il
|
|
WHERE il.InvoiceID = @InvoiceID
|
|
GROUP BY il.StockItemID
|
|
)
|
|
UPDATE sih
|
|
SET sih.QuantityOnHand -= sit.TotalQuantity,
|
|
sih.LastEditedBy = @InvoicingPersonID,
|
|
sih.LastEditedWhen = @StartingWhen
|
|
FROM Warehouse.StockItemHoldings AS sih
|
|
INNER JOIN StockItemTotals AS sit
|
|
ON sih.StockItemID = sit.StockItemID;
|
|
|
|
SELECT @TransactionAmount = SUM(il.ExtendedPrice),
|
|
@TaxAmount = SUM(il.TaxAmount)
|
|
FROM Sales.InvoiceLines AS il
|
|
WHERE il.InvoiceID = @InvoiceID;
|
|
|
|
INSERT Sales.CustomerTransactions
|
|
(CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID,
|
|
TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount,
|
|
OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(@BillToCustomerID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Customer Invoice''),
|
|
@InvoiceID, NULL,
|
|
@StartingWhen, @TransactionAmount - @TaxAmount, @TaxAmount, @TransactionAmount,
|
|
@TransactionAmount, NULL, @InvoicingPersonID, @StartingWhen);
|
|
|
|
COMMIT;
|
|
FETCH NEXT FROM OrderList INTO @OrderID, @PickingCompletedWhen, @BillToCustomerID;
|
|
END;
|
|
|
|
CLOSE OrderList;
|
|
DEALLOCATE OrderList;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'MakeTemporalChanges')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.MakeTemporalChanges
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @Counter int;
|
|
DECLARE @RowsToModify int;
|
|
DECLARE @StaffMember int = (SELECT TOP(1) PersonID FROM [Application].People WHERE IsEmployee <> 0 ORDER BY NEWID());
|
|
|
|
IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7
|
|
BEGIN
|
|
SET @Counter = 0;
|
|
SET @RowsToModify = CEILING(RAND() * 20);
|
|
|
|
WHILE @Counter < @RowsToModify
|
|
BEGIN
|
|
UPDATE [Application].Cities
|
|
SET LatestRecordedPopulation = LatestRecordedPopulation * 1.04,
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE CityID = (SELECT TOP(1) CityID FROM [Application].Cities ORDER BY NEWID());
|
|
SET @Counter += 1;
|
|
END;
|
|
END;
|
|
|
|
IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7
|
|
BEGIN
|
|
SET @Counter = 0;
|
|
SET @RowsToModify = CEILING(RAND() * 20);
|
|
|
|
WHILE @Counter < @RowsToModify
|
|
BEGIN
|
|
UPDATE [Application].StateProvinces
|
|
SET LatestRecordedPopulation = LatestRecordedPopulation * 1.04,
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE StateProvinceID = (SELECT TOP(1) StateProvinceID FROM [Application].StateProvinces ORDER BY NEWID());
|
|
SET @Counter += 1;
|
|
END;
|
|
END;
|
|
|
|
IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7
|
|
BEGIN
|
|
SET @Counter = 0;
|
|
SET @RowsToModify = CEILING(RAND() * 20);
|
|
|
|
WHILE @Counter < @RowsToModify
|
|
BEGIN
|
|
UPDATE [Application].Countries
|
|
SET LatestRecordedPopulation = LatestRecordedPopulation * 1.04,
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE CountryID = (SELECT TOP(1) CountryID FROM [Application].Countries ORDER BY NEWID());
|
|
SET @Counter += 1;
|
|
END;
|
|
END;
|
|
|
|
IF CAST(@StartingWhen AS date) = ''20150101''
|
|
BEGIN
|
|
UPDATE [Application].DeliveryMethods
|
|
SET DeliveryMethodName = N''Chilled Van'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE DeliveryMethodName = N''Van with Chiller'';
|
|
END;
|
|
|
|
IF CAST(@StartingWhen AS date) = ''20160101''
|
|
BEGIN
|
|
UPDATE [Application].PaymentMethods
|
|
SET PaymentMethodName = N''Credit-Card'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE PaymentMethodName = N''Credit Card'';
|
|
|
|
INSERT [Application].TransactionTypes
|
|
(TransactionTypeName, LastEditedBy, ValidFrom, ValidTo)
|
|
VALUES
|
|
(N''Contra'', @StaffMember, @StartingWhen, @EndOfTime);
|
|
|
|
UPDATE [Application].TransactionTypes
|
|
SET TransactionTypeName = N''Customer Contra'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = DATEADD(minute, 5, @StartingWhen)
|
|
WHERE TransactionTypeName = N''Contra'';
|
|
|
|
UPDATE Warehouse.Colors
|
|
SET ColorName = N''Steel Gray'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE ColorName = N''Gray'';
|
|
|
|
INSERT Warehouse.PackageTypes
|
|
(PackageTypeName, LastEditedBy, ValidFrom, ValidTo)
|
|
VALUES
|
|
(N''Bin'', @StaffMember, @StartingWhen, @EndOfTime);
|
|
|
|
DELETE Warehouse.PackageTypes WHERE PackageTypeName = N''Bin'';
|
|
|
|
UPDATE Warehouse.StockGroups
|
|
SET StockGroupName = N''Furry Footwear'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockGroupName = N''Footwear'';
|
|
END;
|
|
|
|
IF CAST(@StartingWhen AS date) = ''20150101''
|
|
BEGIN
|
|
UPDATE Purchasing.SupplierCategories
|
|
SET SupplierCategoryName = N''Courier Services Supplier'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE SupplierCategoryName = N''Courier'';
|
|
END;
|
|
|
|
IF CAST(@StartingWhen AS date) = ''20140101''
|
|
BEGIN
|
|
INSERT Sales.CustomerCategories
|
|
(CustomerCategoryName, LastEditedBy, ValidFrom, ValidTo)
|
|
VALUES
|
|
(N''Retailer'', 1, @StartingWhen, @EndOfTime);
|
|
|
|
UPDATE Sales.CustomerCategories
|
|
SET CustomerCategoryName = N''General Retailer'',
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = DATEADD(minute, 15, @StartingWhen)
|
|
WHERE CustomerCategoryName = N''Retailer'';
|
|
END;
|
|
|
|
IF DAY(@StartingWhen) = 1 AND MONTH(@StartingWhen) = 7
|
|
BEGIN
|
|
SET @Counter = 0;
|
|
SET @RowsToModify = CEILING(RAND() * 20);
|
|
|
|
WHILE @Counter < @RowsToModify
|
|
BEGIN
|
|
UPDATE Sales.Customers
|
|
SET CreditLimit = CreditLimit * 1.05,
|
|
LastEditedBy = @StaffMember,
|
|
ValidFrom = @StartingWhen
|
|
WHERE CustomerID = (SELECT TOP(1) CustomerID FROM Sales.Customers WHERE CreditLimit > 0 ORDER BY NEWID());
|
|
SET @Counter += 1;
|
|
END;
|
|
END;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Modifying a few temporal items '';
|
|
END;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'PaySuppliers')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.PaySuppliers
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Paying suppliers'';
|
|
END;
|
|
|
|
DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0
|
|
ORDER BY NEWID());
|
|
|
|
DECLARE @TransactionsToPay TABLE
|
|
(
|
|
SupplierTransactionID int,
|
|
SupplierID int,
|
|
PurchaseOrderID int NULL,
|
|
SupplierInvoiceNumber nvarchar(20) NULL,
|
|
OutstandingBalance decimal(18,2)
|
|
);
|
|
|
|
INSERT @TransactionsToPay
|
|
(SupplierTransactionID, SupplierID, PurchaseOrderID, SupplierInvoiceNumber, OutstandingBalance)
|
|
SELECT SupplierTransactionID, SupplierID, PurchaseOrderID, SupplierInvoiceNumber, OutstandingBalance
|
|
FROM Purchasing.SupplierTransactions
|
|
WHERE IsFinalized = 0;
|
|
|
|
BEGIN TRAN;
|
|
|
|
UPDATE Purchasing.SupplierTransactions
|
|
SET OutstandingBalance = 0,
|
|
FinalizationDate = @StartingWhen,
|
|
LastEditedBy = @StaffMemberPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE SupplierTransactionID IN (SELECT SupplierTransactionID FROM @TransactionsToPay);
|
|
|
|
INSERT Purchasing.SupplierTransactions
|
|
(SupplierID, TransactionTypeID, PurchaseOrderID, PaymentMethodID,
|
|
SupplierInvoiceNumber, TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount,
|
|
OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen)
|
|
SELECT ttp.SupplierID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Supplier Payment Issued''),
|
|
NULL, (SELECT PaymentMethodID FROM [Application].PaymentMethods WHERE PaymentMethodName = N''EFT''),
|
|
NULL, CAST(@StartingWhen AS date), 0, 0, 0 - SUM(ttp.OutstandingBalance),
|
|
0, CAST(@StartingWhen AS date), @StaffMemberPersonID, @StartingWhen
|
|
FROM @TransactionsToPay AS ttp
|
|
GROUP BY ttp.SupplierID;
|
|
|
|
COMMIT;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'PerformStocktake')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.PerformStocktake
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Performing stocktake'';
|
|
END;
|
|
|
|
DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0
|
|
ORDER BY NEWID());
|
|
|
|
DECLARE @Counter int = 0;
|
|
DECLARE @NumberOfAdjustedStockItems int = (SELECT CEILING(RAND() * 5));
|
|
DECLARE @StockItemIDToAdjust int;
|
|
DECLARE @QuantityToAdjust int;
|
|
|
|
BEGIN TRAN;
|
|
|
|
UPDATE Warehouse.StockItemHoldings
|
|
SET LastStocktakeQuantity = QuantityOnHand,
|
|
LastEditedBy = @StaffMemberPersonID,
|
|
LastEditedWhen = @StartingWhen;
|
|
|
|
WHILE @Counter < @NumberOfAdjustedStockItems
|
|
BEGIN
|
|
SET @QuantityToAdjust = 5 - CEILING(RAND() * 10);
|
|
SET @StockItemIDToAdjust = (SELECT TOP(1) StockItemID
|
|
FROM Warehouse.StockItemHoldings
|
|
WHERE (QuantityOnHand + @QuantityToAdjust) >= 0
|
|
ORDER BY NEWID());
|
|
|
|
IF @StockItemIDToAdjust IS NOT NULL
|
|
BEGIN
|
|
|
|
UPDATE Warehouse.StockItemHoldings
|
|
SET LastStocktakeQuantity += @QuantityToAdjust,
|
|
LastEditedBy = @StaffMemberPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE StockItemID = @StockItemIDToAdjust;
|
|
|
|
INSERT Warehouse.StockItemTransactions
|
|
(StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID,
|
|
TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(@StockItemIDToAdjust,
|
|
(SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Adjustment at Stocktake''),
|
|
NULL, NULL, NULL, NULL,
|
|
@StartingWhen, @QuantityToAdjust, @StaffMemberPersonID, @StartingWhen);
|
|
END;
|
|
SET @Counter += 1;
|
|
END;
|
|
|
|
COMMIT;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'PickStockForCustomerOrders')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.PickStockForCustomerOrders
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Picking stock for customer orders'';
|
|
END;
|
|
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @UninvoicedOrders TABLE
|
|
(
|
|
OrderID int PRIMARY KEY
|
|
);
|
|
|
|
INSERT @UninvoicedOrders
|
|
SELECT o.OrderID
|
|
FROM Sales.Orders AS o
|
|
WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i WHERE i.OrderID = o.OrderID);
|
|
|
|
DECLARE @StockAlreadyAllocated TABLE
|
|
(
|
|
StockItemID int PRIMARY KEY,
|
|
QuantityAllocated int
|
|
);
|
|
|
|
WITH StockAlreadyAllocated
|
|
AS
|
|
(
|
|
SELECT ol.StockItemID, SUM(ol.PickedQuantity) AS TotalPickedQuantity
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN @UninvoicedOrders AS uo
|
|
ON ol.OrderID = uo.OrderID
|
|
WHERE ol.PickingCompletedWhen IS NULL
|
|
GROUP BY ol.StockItemID
|
|
)
|
|
INSERT @StockAlreadyAllocated (StockItemID, QuantityAllocated)
|
|
SELECT sa.StockItemID, sa.TotalPickedQuantity
|
|
FROM StockAlreadyAllocated AS sa;
|
|
|
|
DECLARE OrderLineList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT ol.OrderID, ol.OrderLineID, ol.StockItemID, ol.Quantity
|
|
FROM Sales.OrderLines AS ol
|
|
WHERE ol.PickingCompletedWhen IS NULL
|
|
ORDER BY ol.OrderID, ol.OrderLineID;
|
|
|
|
DECLARE @OrderID int;
|
|
DECLARE @OrderLineID int;
|
|
DECLARE @StockItemID int;
|
|
DECLARE @Quantity int;
|
|
DECLARE @AvailableStock int;
|
|
DECLARE @PickingPersonID int = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0
|
|
ORDER BY NEWID());
|
|
|
|
OPEN OrderLineList;
|
|
FETCH NEXT FROM OrderLineList INTO @OrderID, @OrderLineID, @StockItemID, @Quantity;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
-- work out available stock for this stock item (on hand less allocated)
|
|
SET @AvailableStock = (SELECT QuantityOnHand FROM Warehouse.StockItemHoldings AS sih WHERE sih.StockItemID = @StockItemID);
|
|
SET @AvailableStock -= COALESCE((SELECT QuantityAllocated FROM @StockAlreadyAllocated AS saa WHERE saa.StockItemID = @StockItemID), 0);
|
|
|
|
IF @AvailableStock >= @Quantity
|
|
BEGIN
|
|
BEGIN TRAN;
|
|
|
|
MERGE @StockAlreadyAllocated AS saa
|
|
USING (VALUES (@StockItemID, @Quantity)) AS sa(StockItemID, Quantity)
|
|
ON saa.StockItemID = sa.StockItemID
|
|
WHEN MATCHED THEN
|
|
UPDATE SET saa.QuantityAllocated += sa.Quantity
|
|
WHEN NOT MATCHED THEN
|
|
INSERT (StockItemID, QuantityAllocated) VALUES (sa.StockItemID, sa.Quantity);
|
|
|
|
-- reserve the required stock
|
|
UPDATE Sales.OrderLines
|
|
SET PickedQuantity = @Quantity,
|
|
PickingCompletedWhen = @StartingWhen,
|
|
LastEditedBy = @PickingPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE OrderLineID = @OrderLineID;
|
|
|
|
-- mark the order as ready to invoice (picking complete) if all lines picked
|
|
IF NOT EXISTS (SELECT 1 FROM Sales.OrderLines AS ol
|
|
WHERE ol.OrderID = @OrderID
|
|
AND ol.PickingCompletedWhen IS NULL)
|
|
BEGIN
|
|
UPDATE Sales.Orders
|
|
SET PickingCompletedWhen = @StartingWhen,
|
|
PickedByPersonID = @PickingPersonID,
|
|
LastEditedBy = @PickingPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE OrderID = @OrderID;
|
|
END;
|
|
|
|
COMMIT;
|
|
END;
|
|
|
|
FETCH NEXT FROM OrderLineList INTO @OrderID, @OrderLineID, @StockItemID, @Quantity;
|
|
END;
|
|
|
|
CLOSE OrderLineList;
|
|
DEALLOCATE OrderLineList;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'PlaceSupplierOrders')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.PlaceSupplierOrders
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Placing supplier orders'';
|
|
END;
|
|
|
|
DECLARE @ContactPersonID int = (SELECT TOP(1) PersonID FROM [Application].People WHERE IsEmployee <> 0 ORDER BY NEWID());
|
|
|
|
DECLARE @Orders TABLE
|
|
(
|
|
SupplierID int,
|
|
PurchaseOrderID int NULL,
|
|
DeliveryMethodID int,
|
|
ContactPersonID int,
|
|
SupplierReference nvarchar(20) NULL
|
|
);
|
|
|
|
DECLARE @OrderLines TABLE
|
|
(
|
|
StockItemID int,
|
|
[Description] nvarchar(100),
|
|
SupplierID int,
|
|
QuantityOfOuters int,
|
|
LeadTimeDays int,
|
|
OuterPackageID int,
|
|
LastOuterCostPrice decimal(18,2)
|
|
);
|
|
|
|
BEGIN TRAN;
|
|
|
|
WITH StockItemsToCheck
|
|
AS
|
|
(
|
|
SELECT si.StockItemID,
|
|
si.StockItemName AS [Description],
|
|
si.SupplierID,
|
|
sih.TargetStockLevel,
|
|
sih.ReorderLevel,
|
|
si.QuantityPerOuter,
|
|
si.LeadTimeDays,
|
|
si.OuterPackageID,
|
|
sih.QuantityOnHand,
|
|
sih.LastCostPrice,
|
|
COALESCE((SELECT SUM(ol.Quantity)
|
|
FROM Sales.OrderLines AS ol
|
|
WHERE ol.StockItemID = si.StockItemID
|
|
AND ol.PickingCompletedWhen IS NULL), 0) AS StockNeededForOrders,
|
|
COALESCE((SELECT si.QuantityPerOuter * SUM(pol.OrderedOuters - pol.ReceivedOuters)
|
|
FROM Purchasing.PurchaseOrderLines AS pol
|
|
WHERE pol.StockItemID = si.StockItemID
|
|
AND pol.IsOrderLineFinalized = 0), 0) AS StockOnOrder
|
|
FROM Warehouse.StockItems AS si
|
|
INNER JOIN Warehouse.StockItemHoldings AS sih
|
|
ON si.StockItemID = sih.StockItemID
|
|
),
|
|
StockItemsToOrder
|
|
AS
|
|
(
|
|
SELECT sitc.StockItemID,
|
|
sitc.[Description],
|
|
sitc.SupplierID,
|
|
(sitc.QuantityOnHand + sitc.StockOnOrder - sitc.StockNeededForOrders) AS EffectiveStockLevel,
|
|
sitc.TargetStockLevel,
|
|
sitc.QuantityPerOuter,
|
|
sitc.LeadTimeDays,
|
|
sitc.OuterPackageID,
|
|
sitc.LastCostPrice
|
|
FROM StockItemsToCheck AS sitc
|
|
WHERE (sitc.QuantityOnHand + sitc.StockOnOrder - sitc.StockNeededForOrders) < sitc.ReorderLevel
|
|
AND sitc.QuantityPerOuter <> 0
|
|
)
|
|
INSERT @OrderLines (StockItemID, [Description], SupplierID, QuantityOfOuters, LeadTimeDays, OuterPackageID, LastOuterCostPrice)
|
|
SELECT sito.StockItemID,
|
|
sito.[Description],
|
|
sito.SupplierID,
|
|
CEILING((sito.TargetStockLevel - sito.EffectiveStockLevel) / sito.QuantityPerOuter) AS OutersRequired,
|
|
sito.LeadTimeDays,
|
|
sito.OuterPackageID,
|
|
ROUND(sito.LastCostPrice * sito.QuantityPerOuter, 2) AS LastOuterCostPrice
|
|
FROM StockItemsToOrder AS sito;
|
|
|
|
INSERT @Orders (SupplierID, PurchaseOrderID, DeliveryMethodID, ContactPersonID, SupplierReference)
|
|
|
|
SELECT s.SupplierID, NEXT VALUE FOR Sequences.PurchaseOrderID, s.DeliveryMethodID,
|
|
(SELECT TOP(1) PersonID FROM [Application].People WHERE IsEmployee <> 0),
|
|
s.SupplierReference
|
|
FROM Purchasing.Suppliers AS s
|
|
WHERE s.SupplierID IN (SELECT SupplierID FROM @OrderLines);
|
|
|
|
INSERT Purchasing.PurchaseOrders
|
|
(PurchaseOrderID, SupplierID, OrderDate, DeliveryMethodID, ContactPersonID,
|
|
ExpectedDeliveryDate, SupplierReference, IsOrderFinalized, Comments,
|
|
InternalComments, LastEditedBy, LastEditedWhen)
|
|
SELECT o.PurchaseOrderID, o.SupplierID, CAST(@StartingWhen AS date), o.DeliveryMethodID, o.ContactPersonID,
|
|
DATEADD(day, (SELECT MAX(LeadTimeDays) FROM @OrderLines), CAST(@StartingWhen AS date)),
|
|
o.SupplierReference, 0, NULL,
|
|
NULL, 1, @StartingWhen
|
|
FROM @Orders AS o;
|
|
|
|
INSERT Purchasing.PurchaseOrderLines
|
|
(PurchaseOrderID, StockItemID, OrderedOuters, [Description],
|
|
ReceivedOuters, PackageTypeID, ExpectedUnitPricePerOuter, LastReceiptDate,
|
|
IsOrderLineFinalized, LastEditedBy, LastEditedWhen)
|
|
SELECT o.PurchaseOrderID, ol.StockItemID, ol.QuantityOfOuters, ol.[Description],
|
|
0, ol.OuterPackageID, ol.LastOuterCostPrice, NULL,
|
|
0, @ContactPersonID, @StartingWhen
|
|
FROM @OrderLines AS ol
|
|
INNER JOIN @Orders AS o
|
|
ON ol.SupplierID = o.SupplierID;
|
|
|
|
COMMIT;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'ProcessCustomerPayments')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.ProcessCustomerPayments
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Processing customer payments'';
|
|
END;
|
|
|
|
DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0
|
|
ORDER BY NEWID());
|
|
|
|
DECLARE @TransactionsToReceive TABLE
|
|
(
|
|
CustomerTransactionID int,
|
|
CustomerID int,
|
|
InvoiceID int NULL,
|
|
OutstandingBalance decimal(18,2)
|
|
);
|
|
|
|
INSERT @TransactionsToReceive
|
|
(CustomerTransactionID, CustomerID, InvoiceID, OutstandingBalance)
|
|
SELECT CustomerTransactionID, CustomerID, InvoiceID, OutstandingBalance
|
|
FROM Sales.CustomerTransactions
|
|
WHERE IsFinalized = 0;
|
|
|
|
BEGIN TRAN;
|
|
|
|
UPDATE Sales.CustomerTransactions
|
|
SET OutstandingBalance = 0,
|
|
FinalizationDate = @StartingWhen,
|
|
LastEditedBy = @StaffMemberPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE CustomerTransactionID IN (SELECT CustomerTransactionID FROM @TransactionsToReceive);
|
|
|
|
INSERT Sales.CustomerTransactions
|
|
(CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID, TransactionDate,
|
|
AmountExcludingTax, TaxAmount, TransactionAmount, OutstandingBalance,
|
|
FinalizationDate, LastEditedBy, LastEditedWhen)
|
|
SELECT ttr.CustomerID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Customer Payment Received''),
|
|
NULL, (SELECT PaymentMethodID FROM [Application].PaymentMethods WHERE PaymentMethodName = N''EFT''),
|
|
CAST(@StartingWhen AS date), 0, 0, 0 - SUM(ttr.OutstandingBalance),
|
|
0, CAST(@StartingWhen AS date), @StaffMemberPersonID, @StartingWhen
|
|
FROM @TransactionsToReceive AS ttr
|
|
GROUP BY ttr.CustomerID;
|
|
|
|
COMMIT;
|
|
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'ReceivePurchaseOrders')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.ReceivePurchaseOrders
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Receiving stock from purchase orders'';
|
|
END;
|
|
|
|
DECLARE @StaffMemberPersonID int = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0
|
|
ORDER BY NEWID());
|
|
DECLARE @PurchaseOrderID int;
|
|
DECLARE @SupplierID int;
|
|
DECLARE @TotalExcludingTax decimal(18,2);
|
|
DECLARE @TotalIncludingTax decimal(18,2);
|
|
|
|
DECLARE PurchaseOrderList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT PurchaseOrderID, SupplierID
|
|
FROM Purchasing.PurchaseOrders AS po
|
|
WHERE po.IsOrderFinalized = 0
|
|
AND po.ExpectedDeliveryDate >= @StartingWhen;
|
|
|
|
OPEN PurchaseOrderList;
|
|
FETCH NEXT FROM PurchaseOrderList INTO @PurchaseOrderID, @SupplierID;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
|
|
BEGIN TRAN;
|
|
|
|
UPDATE Purchasing.PurchaseOrderLines
|
|
SET ReceivedOuters = OrderedOuters,
|
|
IsOrderLineFinalized = 1,
|
|
LastReceiptDate = CAST(@StartingWhen as date),
|
|
LastEditedBy = @StaffMemberPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE PurchaseOrderID = @PurchaseOrderID;
|
|
|
|
UPDATE sih
|
|
SET sih.QuantityOnHand += pol.ReceivedOuters * si.QuantityPerOuter,
|
|
sih.LastEditedBy = @StaffMemberPersonID,
|
|
sih.LastEditedWhen = @StartingWhen
|
|
FROM Warehouse.StockItemHoldings AS sih
|
|
INNER JOIN Purchasing.PurchaseOrderLines AS pol
|
|
ON sih.StockItemID = pol.StockItemID
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON sih.StockItemID = si.StockItemID;
|
|
|
|
INSERT Warehouse.StockItemTransactions
|
|
(StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID,
|
|
TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen)
|
|
SELECT pol.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Receipt''),
|
|
NULL, NULL, @SupplierID, pol.PurchaseOrderID,
|
|
@StartingWhen, pol.ReceivedOuters * si.QuantityPerOuter, @StaffMemberPersonID, @StartingWhen
|
|
FROM Purchasing.PurchaseOrderLines AS pol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON pol.StockItemID = si.StockItemID
|
|
WHERE pol.PurchaseOrderID = @PurchaseOrderID;
|
|
|
|
UPDATE Purchasing.PurchaseOrders
|
|
SET IsOrderFinalized = 1,
|
|
LastEditedBy = @StaffMemberPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE PurchaseOrderID = @PurchaseOrderID;
|
|
|
|
SELECT @TotalExcludingTax = SUM(ROUND(pol.OrderedOuters * pol.ExpectedUnitPricePerOuter,2)),
|
|
@TotalIncludingTax = SUM(ROUND(pol.OrderedOuters * pol.ExpectedUnitPricePerOuter,2))
|
|
+ SUM(ROUND(pol.OrderedOuters * pol.ExpectedUnitPricePerOuter * si.TaxRate / 100.0,2))
|
|
FROM Purchasing.PurchaseOrderLines AS pol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON pol.StockItemID = si.StockItemID
|
|
WHERE pol.PurchaseOrderID = @PurchaseOrderID;
|
|
|
|
INSERT Purchasing.SupplierTransactions
|
|
(SupplierID, TransactionTypeID, PurchaseOrderID, PaymentMethodID,
|
|
SupplierInvoiceNumber, TransactionDate, AmountExcludingTax,
|
|
TaxAmount, TransactionAmount, OutstandingBalance,
|
|
FinalizationDate, LastEditedBy, LastEditedWhen)
|
|
VALUES
|
|
(@SupplierID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Supplier Invoice''),
|
|
@PurchaseOrderID, (SELECT PaymentMethodID FROM [Application].PaymentMethods WHERE PaymentMethodName = N''EFT''),
|
|
CAST(CEILING(RAND() * 10000) AS nvarchar(20)), CAST(@StartingWhen AS date), @TotalExcludingTax,
|
|
@TotalIncludingTax - @TotalExcludingTax, @TotalIncludingTax, @TotalIncludingTax,
|
|
NULL, @StaffMemberPersonID, @StartingWhen);
|
|
|
|
COMMIT;
|
|
|
|
FETCH NEXT FROM PurchaseOrderList INTO @PurchaseOrderID, @SupplierID;
|
|
END;
|
|
|
|
CLOSE PurchaseOrderList;
|
|
DEALLOCATE PurchaseOrderList;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'RecordColdRoomTemperatures')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.RecordColdRoomTemperatures
|
|
@AverageSecondsBetweenReadings int,
|
|
@NumberOfSensors int,
|
|
@CurrentDateTime datetime2(7),
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Recording cold room temperatures'';
|
|
END;
|
|
|
|
DECLARE @TimeCounter datetime2(7) = CAST(@CurrentDateTime AS date);
|
|
DECLARE @SensorCounter int;
|
|
DECLARE @DelayInSeconds int;
|
|
DECLARE @TimeToFinishForTheDay datetime2(7) = DATEADD(second, -30, DATEADD(day, 1, @TimeCounter));
|
|
DECLARE @Temperature decimal(10,2);
|
|
|
|
WHILE @TimeCounter < @TimeToFinishForTheDay
|
|
BEGIN
|
|
SET @SensorCounter = 0;
|
|
WHILE @SensorCounter < @NumberOfSensors
|
|
BEGIN
|
|
SET @Temperature = 3 + RAND() * 2;
|
|
|
|
DELETE Warehouse.ColdRoomTemperatures
|
|
OUTPUT deleted.ColdRoomTemperatureID,
|
|
deleted.ColdRoomSensorNumber,
|
|
deleted.RecordedWhen,
|
|
deleted.Temperature,
|
|
deleted.ValidFrom,
|
|
@TimeCounter
|
|
INTO Warehouse.ColdRoomTemperatures_Archive
|
|
WHERE ColdRoomSensorNumber = @SensorCounter + 1;
|
|
|
|
INSERT Warehouse.ColdRoomTemperatures
|
|
(ColdRoomSensorNumber, RecordedWhen, Temperature, ValidFrom, ValidTo)
|
|
VALUES
|
|
(@SensorCounter + 1, @TimeCounter, @Temperature, @TimeCounter, @EndOfTime);
|
|
|
|
SET @SensorCounter += 1;
|
|
END;
|
|
SET @DelayInSeconds = CEILING(RAND() * @AverageSecondsBetweenReadings);
|
|
SET @TimeCounter = DATEADD(second, @DelayInSeconds, @TimeCounter);
|
|
END;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'RecordDeliveryVanTemperatures')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.RecordDeliveryVanTemperatures
|
|
@AverageSecondsBetweenReadings int,
|
|
@NumberOfSensors int,
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Recording delivery van temperatures'';
|
|
END;
|
|
|
|
DECLARE @VehicleRegistration nvarchar(20) = N''WWI-321-A'';
|
|
|
|
DECLARE @TimeCounter datetime2(7) = @StartingWhen;
|
|
DECLARE @SensorCounter int;
|
|
DECLARE @DelayInSeconds int;
|
|
DECLARE @MidnightToday datetime2(7) = CAST(@StartingWhen AS date);
|
|
DECLARE @TimeToFinishForTheDay datetime2(7) = DATEADD(hour, 16, @MidnightToday);
|
|
DECLARE @Temperature decimal(10,2);
|
|
DECLARE @FullSensorData nvarchar(1000);
|
|
DECLARE @Latitude decimal(18,7);
|
|
DECLARE @Longitude decimal(18,7);
|
|
DECLARE @IsCompressed bit;
|
|
|
|
WHILE @TimeCounter < @TimeToFinishForTheDay
|
|
BEGIN
|
|
SET @SensorCounter = 0;
|
|
WHILE @SensorCounter < @NumberOfSensors
|
|
BEGIN
|
|
SET @Temperature = 3 + RAND() * 2;
|
|
SET @Latitude = 37.78352 + RAND() * 30;
|
|
SET @Longitude = -122.4169 + RAND() * 40;
|
|
|
|
SET @IsCompressed = CASE WHEN @TimeCounter < ''20160101'' THEN 1 ELSE 0 END;
|
|
|
|
SET @FullSensorData = N''{"Recordings": ''
|
|
+ N''[''
|
|
+ N''{"type":"Feature", "geometry": {"type":"Point", "coordinates":[''
|
|
+ CAST(@Longitude AS nvarchar(20)) + N'','' + CAST(@Latitude AS nvarchar(20))
|
|
+ N''] }, "properties":{"rego":"'' + STRING_ESCAPE(@VehicleRegistration, N''json'')
|
|
+ N''","sensor":"'' + CAST(@SensorCounter + 1 AS nvarchar(20))
|
|
+ N'',"when":"'' + CONVERT(nvarchar(30), @TimeCounter, 126)
|
|
+ N''","temp":'' + CAST(@Temperature AS nvarchar(20))
|
|
+ N''}} ]'';
|
|
|
|
INSERT Warehouse.VehicleTemperatures
|
|
(VehicleRegistration, ChillerSensorNumber,
|
|
RecordedWhen, Temperature,
|
|
FullSensorData, IsCompressed, CompressedSensorData)
|
|
VALUES
|
|
(@VehicleRegistration, @SensorCounter + 1,
|
|
@TimeCounter, @Temperature,
|
|
CASE WHEN @IsCompressed = 0 THEN @FullSensorData END,
|
|
@IsCompressed,
|
|
CASE WHEN @IsCompressed <> 0 THEN COMPRESS(@FullSensorData) END);
|
|
|
|
SET @SensorCounter += 1;
|
|
END;
|
|
SET @DelayInSeconds = CEILING(RAND() * @AverageSecondsBetweenReadings);
|
|
SET @TimeCounter = DATEADD(second, @DelayInSeconds, @TimeCounter);
|
|
END;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'RecordInvoiceDeliveries')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.RecordInvoiceDeliveries
|
|
@CurrentDateTime datetime2(7),
|
|
@StartingWhen datetime,
|
|
@EndOfTime datetime2(7),
|
|
@IsSilentMode bit
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N''Recording invoice deliveries'';
|
|
END;
|
|
|
|
DECLARE @DeliveryDriverPersonID int = (SELECT TOP(1) PersonID
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0
|
|
ORDER BY NEWID());
|
|
|
|
DECLARE @ReturnedDeliveryData nvarchar(max);
|
|
DECLARE @InvoiceID int;
|
|
DECLARE @CustomerName nvarchar(100);
|
|
DECLARE @PrimaryContactFullName nvarchar(50);
|
|
DECLARE @Latitude decimal(18,7);
|
|
DECLARE @Longitude decimal(18,7);
|
|
DECLARE @DeliveryAttemptWhen datetime2(7);
|
|
DECLARE @Counter int = 0;
|
|
DECLARE @DeliveryEvent nvarchar(max);
|
|
DECLARE @IsDelivered bit;
|
|
|
|
DECLARE InvoiceList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT i.InvoiceID, i.ReturnedDeliveryData, c.CustomerName, p.FullName, ct.[Location].Lat, ct.[Location].Long
|
|
FROM Sales.Invoices AS i
|
|
INNER JOIN Sales.Customers AS c
|
|
ON i.CustomerID = c.CustomerID
|
|
INNER JOIN [Application].Cities AS ct
|
|
ON c.DeliveryCityID = ct.CityID
|
|
INNER JOIN [Application].People AS p
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
WHERE i.ConfirmedDeliveryTime IS NULL
|
|
AND i.InvoiceDate < CAST(@StartingWhen AS date)
|
|
ORDER BY i.InvoiceID;
|
|
|
|
OPEN InvoiceList;
|
|
FETCH NEXT FROM InvoiceList INTO @InvoiceID, @ReturnedDeliveryData, @CustomerName, @PrimaryContactFullName, @Latitude, @Longitude;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
SET @Counter += 1;
|
|
SET @DeliveryAttemptWhen = DATEADD(minute, @Counter * 5, @StartingWhen);
|
|
|
|
SET @DeliveryEvent = N''{ }'';
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Event'', N''DeliveryAttempt'');
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.EventTime'', CONVERT(nvarchar(20), @DeliveryAttemptWhen, 126));
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.ConNote'', N''EAN-125-'' + CAST(@InvoiceID + 1050 AS nvarchar(20)));
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.DriverID'', @DeliveryDriverPersonID);
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Latitude'', @Latitude);
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Longitude'', @Longitude);
|
|
|
|
SET @IsDelivered = 0;
|
|
|
|
IF RAND() < 0.1 -- 10 % chance of non-delivery on this attempt
|
|
BEGIN
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Comment'', N''Receiver not present'');
|
|
END ELSE BEGIN -- delivered
|
|
SET @DeliveryEvent = JSON_MODIFY(@DeliveryEvent, N''$.Status'', N''Delivered'');
|
|
SET @IsDelivered = 1;
|
|
END;
|
|
|
|
SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''append $.Events'', JSON_QUERY(@DeliveryEvent));
|
|
SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''$.DeliveredWhen'', CONVERT(nvarchar(20), @DeliveryAttemptWhen, 126));
|
|
SET @ReturnedDeliveryData = JSON_MODIFY(@ReturnedDeliveryData, N''$.ReceivedBy'', @PrimaryContactFullName);
|
|
|
|
UPDATE Sales.Invoices
|
|
SET ReturnedDeliveryData = @ReturnedDeliveryData,
|
|
LastEditedBy = @DeliveryDriverPersonID,
|
|
LastEditedWhen = @StartingWhen
|
|
WHERE InvoiceID = @InvoiceID;
|
|
|
|
FETCH NEXT FROM InvoiceList INTO @InvoiceID, @ReturnedDeliveryData, @CustomerName, @PrimaryContactFullName, @Latitude, @Longitude;
|
|
END;
|
|
|
|
CLOSE InvoiceList;
|
|
DEALLOCATE InvoiceList;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'UpdateCustomFields')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.UpdateCustomFields
|
|
@CurrentDateTime AS date
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
DECLARE @StartingWhen datetime2(7) = CAST(@CurrentDateTime AS date);
|
|
|
|
SET @StartingWhen = DATEADD(hour, 23, @StartingWhen);
|
|
|
|
-- Populate custom data for stock items
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = N''{ "CountryOfManufacture": ''
|
|
+ CASE WHEN IsChillerStock <> 0 THEN N''"USA", "ShelfLife": "7 days"''
|
|
WHEN StockItemName LIKE N''%USB food%'' THEN N''"Japan"''
|
|
ELSE N''"China"''
|
|
END
|
|
+ N'', "Tags": []''
|
|
+ CASE WHEN Size IN (N''S'', N''XS'', N''XXS'', N''3XS'') THEN N'', "Range": "Children"''
|
|
WHEN Size IN (N''M'') THEN N'', "Range": "Teens/Young Adult"''
|
|
WHEN Size IN (N''L'', N''XL'', N''XXL'', N''3XL'', N''4XL'', N''5XL'', N''6XL'', N''7XL'') THEN N'', "Range": "Adult"''
|
|
ELSE N''''
|
|
END
|
|
+ CASE WHEN StockItemName LIKE N''RC %'' THEN N'', "MinimumAge": "10"''
|
|
ELSE N''''
|
|
END
|
|
+ N'' }'',
|
|
ValidFrom = @StartingWhen;
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Radio Control''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''RC %'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Realistic Sound''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''RC %'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Vintage''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%vintage%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Halloween Fun''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%halloween%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Super Value''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%pack of%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''So Realistic''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%ride on%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Comfortable''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%slipper%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Long Battery Life''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%slipper%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', CASE WHEN StockItemID % 2 = 0 THEN N''32GB'' ELSE N''16GB'' END),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%USB food%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''Comedy''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%joke%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Warehouse.StockItems
|
|
SET CustomFields = JSON_MODIFY(CustomFields, N''append $.Tags'', N''USB Powered''),
|
|
ValidFrom = @StartingWhen
|
|
WHERE StockItemName LIKE N''%USB%'';
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE si
|
|
SET si.CustomFields = JSON_MODIFY(si.CustomFields, N''append $.Tags'', N''Limited Stock''),
|
|
ValidFrom = @StartingWhen
|
|
FROM Warehouse.StockItems AS si
|
|
WHERE EXISTS (SELECT 1
|
|
FROM Warehouse.StockItemStockGroups AS sisg
|
|
INNER JOIN Warehouse.StockGroups AS sg
|
|
ON sisg.StockGroupID = sg.StockGroupID
|
|
WHERE si.StockItemID = sisg.StockItemID
|
|
AND sg.StockGroupName LIKE N''%Packaging%'');
|
|
|
|
-- populate custom data for employees and salespeople
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
DECLARE EmployeeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT PersonID, IsSalesperson
|
|
FROM [Application].People
|
|
WHERE IsEmployee <> 0;
|
|
|
|
DECLARE @EmployeeID int;
|
|
DECLARE @IsSalesperson bit;
|
|
DECLARE @CustomFields nvarchar(max);
|
|
DECLARE @JobTitle nvarchar(max);
|
|
DECLARE @NumberOfAdditionalLanguages int;
|
|
DECLARE @LanguageCounter int;
|
|
DECLARE @OtherLanguages TABLE ( LanguageName nvarchar(50) );
|
|
DECLARE @LanguageName nvarchar(50);
|
|
|
|
OPEN EmployeeList;
|
|
FETCH NEXT FROM EmployeeList INTO @EmployeeID, @IsSalesperson;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
SET @CustomFields = N''{ "OtherLanguages": [] }'';
|
|
|
|
SET @NumberOfAdditionalLanguages = FLOOR(RAND() * 4);
|
|
DELETE @OtherLanguages;
|
|
SET @LanguageCounter = 0;
|
|
WHILE @LanguageCounter < @NumberOfAdditionalLanguages
|
|
BEGIN
|
|
SET @LanguageName = (SELECT TOP(1) alias
|
|
FROM sys.syslanguages
|
|
WHERE alias NOT LIKE N''%English%''
|
|
AND alias NOT LIKE N''%Brazil%''
|
|
ORDER BY NEWID());
|
|
IF @LanguageName LIKE N''%Chinese%'' SET @LanguageName = N''Chinese'';
|
|
IF NOT EXISTS (SELECT 1 FROM @OtherLanguages WHERE LanguageName = @LanguageName)
|
|
BEGIN
|
|
INSERT @OtherLanguages (LanguageName) VALUES(@LanguageName);
|
|
SET @CustomFields = JSON_MODIFY(@CustomFields, N''append $.OtherLanguages'', @LanguageName);
|
|
END;
|
|
SET @LanguageCounter += 1;
|
|
END;
|
|
|
|
SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.HireDate'',
|
|
CONVERT(nvarchar(20), DATEADD(day, 0 - CEILING(RAND() * 2000) - 100, ''20130101''), 126));
|
|
|
|
SET @JobTitle = N''Team Member'';
|
|
SET @JobTitle = CASE WHEN RAND() < 0.05 THEN N''General Manager''
|
|
WHEN RAND() < 0.1 THEN N''Manager''
|
|
WHEN RAND() < 0.15 THEN N''Accounts Controller''
|
|
WHEN RAND() < 0.2 THEN N''Warehouse Supervisor''
|
|
ELSE @JobTitle
|
|
END;
|
|
SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.Title'', @JobTitle);
|
|
|
|
IF @IsSalesperson <> 0
|
|
BEGIN
|
|
SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.PrimarySalesTerritory'',
|
|
(SELECT TOP(1) SalesTerritory FROM [Application].StateProvinces ORDER BY NEWID()));
|
|
SET @CustomFields = JSON_MODIFY(@CustomFields, N''$.CommissionRate'',
|
|
CAST(CAST(RAND() * 5 AS decimal(18,2)) AS nvarchar(20)));
|
|
END;
|
|
|
|
UPDATE [Application].People
|
|
SET CustomFields = @CustomFields,
|
|
ValidFrom = @StartingWhen
|
|
WHERE PersonID = @EmployeeID;
|
|
|
|
FETCH NEXT FROM EmployeeList INTO @EmployeeID, @IsSalesperson;
|
|
END;
|
|
|
|
CLOSE EmployeeList;
|
|
DEALLOCATE EmployeeList;
|
|
|
|
-- Set user preferences
|
|
|
|
SET @StartingWhen = DATEADD(minute, 1, @StartingWhen);
|
|
|
|
UPDATE Application.People
|
|
SET UserPreferences = N''{"theme":"''+ (CASE (PersonID % 7)
|
|
WHEN 0 THEN ''ui-darkness''
|
|
WHEN 1 THEN ''blitzer''
|
|
WHEN 2 THEN ''humanity''
|
|
WHEN 3 THEN ''dark-hive''
|
|
WHEN 4 THEN ''ui-darkness''
|
|
WHEN 5 THEN ''le-frog''
|
|
WHEN 6 THEN ''black-tie''
|
|
ELSE ''ui-lightness''
|
|
END)
|
|
+ N''","dateFormat":"'' + CASE (PersonID % 10)
|
|
WHEN 0 THEN ''mm/dd/yy''
|
|
WHEN 1 THEN ''yy-mm-dd''
|
|
WHEN 2 THEN ''dd/mm/yy''
|
|
WHEN 3 THEN ''DD, MM d, yy''
|
|
WHEN 4 THEN ''dd/mm/yy''
|
|
WHEN 5 THEN ''dd/mm/yy''
|
|
WHEN 6 THEN ''mm/dd/yy''
|
|
ELSE ''mm/dd/yy''
|
|
END
|
|
+ N''","timeZone": "PST"''
|
|
+ N'',"table":{"pagingType":"'' + CASE (PersonID % 5)
|
|
WHEN 0 THEN ''numbers''
|
|
WHEN 1 THEN ''full_numbers''
|
|
WHEN 2 THEN ''full''
|
|
WHEN 3 THEN ''simple_numbers''
|
|
ELSE ''simple''
|
|
END
|
|
+ N''","pageLength": '' + CASE (PersonID % 5)
|
|
WHEN 0 THEN ''10''
|
|
WHEN 1 THEN ''25''
|
|
WHEN 2 THEN ''50''
|
|
WHEN 3 THEN ''10''
|
|
ELSE ''10''
|
|
END + N''},"favoritesOnDashboard":true}'',
|
|
ValidFrom = @StartingWhen
|
|
WHERE UserPreferences IS NOT NULL;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.procedures WHERE SCHEMA_NAME(schema_id) = N'DataLoadSimulation'
|
|
AND name = N'DailyProcessToCreateHistory')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE DataLoadSimulation.DailyProcessToCreateHistory
|
|
@StartDate date,
|
|
@EndDate date,
|
|
@AverageNumberOfCustomerOrdersPerDay int,
|
|
@SaturdayPercentageOfNormalWorkDay int,
|
|
@SundayPercentageOfNormalWorkDay int,
|
|
@UpdateCustomFields bit,
|
|
@IsSilentMode bit,
|
|
@AreDatesPrinted bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
DECLARE @CurrentDateTime datetime2(7) = @StartDate;
|
|
DECLARE @EndOfTime datetime2(7) = ''99991231 23:59:59.9999999'';
|
|
DECLARE @StartingWhen datetime;
|
|
DECLARE @NumberOfCustomerOrders int;
|
|
DECLARE @IsWeekday bit;
|
|
DECLARE @IsSaturday bit;
|
|
DECLARE @IsSunday bit;
|
|
DECLARE @IsMonday bit;
|
|
DECLARE @Weekday int;
|
|
DECLARE @IsStaffOnly bit;
|
|
|
|
SET DATEFIRST 7; -- Week begins on Sunday
|
|
|
|
EXEC DataLoadSimulation.DeactivateTemporalTablesBeforeDataLoad;
|
|
|
|
WHILE @CurrentDateTime <= @EndDate
|
|
BEGIN
|
|
IF @AreDatesPrinted <> 0 OR @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT SUBSTRING(DATENAME(weekday, @CurrentDateTime), 1,3) + N'' '' + CONVERT(nvarchar(20), @CurrentDateTime, 107);
|
|
PRINT N'' '';
|
|
END;
|
|
|
|
-- Calculate the days of the week - different processing happens on each day
|
|
SET @Weekday = DATEPART(weekday, @CurrentDateTime);
|
|
SET @IsSaturday = 0;
|
|
SET @IsSunday = 0;
|
|
SET @IsMonday = 0;
|
|
SET @IsWeekday = 1;
|
|
|
|
IF @Weekday = 7
|
|
BEGIN
|
|
SET @IsSaturday = 1;
|
|
SET @IsWeekday = 0;
|
|
END;
|
|
IF @Weekday = 1
|
|
BEGIN
|
|
SET @IsSunday = 1;
|
|
SET @IsWeekday = 0;
|
|
END;
|
|
IF @Weekday = 2 SET @IsMonday = 1;
|
|
|
|
-- Purchase orders
|
|
IF @IsWeekday <> 0
|
|
BEGIN
|
|
-- Start receiving purchase orders at 7AM on weekdays
|
|
SET @StartingWhen = DATEADD(hour, 7, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.ReceivePurchaseOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
-- Password changes
|
|
SET @StartingWhen = DATEADD(hour, 8, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.ChangePasswords @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Activate new website users
|
|
SET @StartingWhen = DATEADD(minute, 10, DATEADD(hour, 8, @CurrentDateTime));
|
|
EXEC DataLoadSimulation.ActivateWebsiteLogons @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Payments to suppliers
|
|
IF DATEPART(weekday, @CurrentDateTime) = 2
|
|
BEGIN
|
|
SET @StartingWhen = DATEADD(hour, 9, @CurrentDateTime); -- Suppliers are paid on Monday mornings
|
|
EXEC DataLoadSimulation.PaySuppliers @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
-- Customer orders received
|
|
SET @StartingWhen = DATEADD(hour, 10, @CurrentDateTime);
|
|
SET @NumberOfCustomerOrders = @AverageNumberOfCustomerOrdersPerDay / 2
|
|
+ CEILING(RAND() * @AverageNumberOfCustomerOrdersPerDay);
|
|
SET @NumberOfCustomerOrders = CASE DATEPART(weekday, @CurrentDateTime)
|
|
WHEN 7
|
|
THEN FLOOR(@NumberOfCustomerOrders * @SaturdayPercentageOfNormalWorkDay / 100)
|
|
WHEN 1
|
|
THEN FLOOR(@NumberOfCustomerOrders * @SundayPercentageOfNormalWorkDay / 100)
|
|
ELSE @NumberOfCustomerOrders
|
|
END;
|
|
SET @NumberOfCustomerOrders = FLOOR(@NumberOfCustomerOrders * CASE WHEN YEAR(@StartingWhen) = 2013 THEN 1.0
|
|
WHEN YEAR(@StartingWhen) = 2014 THEN 1.12
|
|
WHEN YEAR(@StartingWhen) = 2015 THEN 1.21
|
|
WHEN YEAR(@StartingWhen) = 2016 THEN 1.23
|
|
ELSE 1.26
|
|
END);
|
|
EXEC DataLoadSimulation.CreateCustomerOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @NumberOfCustomerOrders, @IsSilentMode;
|
|
|
|
-- Pick any customer orders that can be picked
|
|
SET @StartingWhen = DATEADD(hour, 11, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.PickStockForCustomerOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Process any payments from customers
|
|
IF @Weekday <> 0
|
|
BEGIN
|
|
SET @StartingWhen = DATEADD(minute, 30, DATEADD(hour, 11, @CurrentDateTime));
|
|
EXEC DataLoadSimulation.ProcessCustomerPayments @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
-- Invoice orders that have been fully picked
|
|
SET @StartingWhen = DATEADD(hour, 12, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.InvoicePickedOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Place supplier orders
|
|
IF @Weekday <> 0
|
|
BEGIN
|
|
SET @StartingWhen = DATEADD(hour, 13, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.PlaceSupplierOrders @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
-- End of quarter stock take
|
|
IF (MONTH(@CurrentDateTime) = 1 AND DAY(@CurrentDateTime) = 31)
|
|
OR (MONTH(@CurrentDateTime) = 4 AND DAY(@CurrentDateTime) = 30)
|
|
OR (MONTH(@CurrentDateTime) = 7 AND DAY(@CurrentDateTime) = 31)
|
|
OR (MONTH(@CurrentDateTime) = 10 AND DAY(@CurrentDateTime) = 31)
|
|
BEGIN
|
|
SET @StartingWhen = DATEADD(hour, 14, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.PerformStocktake @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
-- Record invoice deliveries
|
|
SET @StartingWhen = DATEADD(hour, 7, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.RecordInvoiceDeliveries @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Add customers
|
|
IF @Weekday <> 0
|
|
BEGIN
|
|
SET @StartingWhen = DATEADD(hour, 15, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.AddCustomers @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
-- Add stock items
|
|
SET @StartingWhen = DATEADD(hour, 16, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.AddStockItems @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Add special deals
|
|
SET @StartingWhen = DATEADD(hour, 16, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.AddSpecialDeals @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Temporal changes
|
|
SET @StartingWhen = DATEADD(hour, 16, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.MakeTemporalChanges @CurrentDateTime, @StartingWhen, @EndOfTime, @IsSilentMode;
|
|
|
|
-- Record delivery van temperatures
|
|
IF @CurrentDateTime >= ''20160101''
|
|
BEGIN
|
|
SET @StartingWhen = DATEADD(hour, 7, @CurrentDateTime);
|
|
EXEC DataLoadSimulation.RecordDeliveryVanTemperatures 300, 2, @CurrentDateTime, @StartingWhen, @IsSilentMode;
|
|
END;
|
|
|
|
-- Record cold room temperatures
|
|
IF @CurrentDateTime >= ''20151220''
|
|
BEGIN
|
|
EXEC DataLoadSimulation.RecordColdRoomTemperatures 30, 4, @CurrentDateTime, @EndOfTime, @IsSilentMode;
|
|
END;
|
|
|
|
IF @IsSilentMode = 0
|
|
BEGIN
|
|
PRINT N'' '';
|
|
END;
|
|
|
|
SET @CurrentDateTime = DATEADD(day, 1, @CurrentDateTime);
|
|
END; -- of processing each day
|
|
|
|
IF @UpdateCustomFields <> 0
|
|
BEGIN
|
|
EXEC DataLoadSimulation.UpdateCustomFields @EndDate;
|
|
END;
|
|
|
|
EXEC DataLoadSimulation.ReactivateTemporalTablesAfterDataLoad;
|
|
|
|
EXEC Sequences.ReseedAllSequences;
|
|
|
|
-- Ensure RLS is applied
|
|
EXEC [Application].Configuration_ApplyRowLevelSecurity
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
EXEC DataLoadSimulation.ReactivateTemporalTablesAfterDataLoad;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures;
|
|
GO
|
|
|
|
CREATE PROCEDURE DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.ActivateWebsiteLogons;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.AddCustomers;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.AddSpecialDeals;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.AddStockItems;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.ChangePasswords;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.CreateCustomerOrders;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.DailyProcessToCreateHistory;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.InvoicePickedOrders;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.MakeTemporalChanges;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.PaySuppliers;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.PerformStocktake;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.PickStockForCustomerOrders;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.PlaceSupplierOrders;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.ProcessCustomerPayments;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.ReceivePurchaseOrders;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.RecordColdRoomTemperatures;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.RecordDeliveryVanTemperatures;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.RecordInvoiceDeliveries;
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.UpdateCustomFields;
|
|
DROP FUNCTION IF EXISTS DataLoadSimulation.GetAreaCode;
|
|
END;
|
|
GO
|
|
|
|
DROP FUNCTION IF EXISTS Website.CalculateCustomerPrice;
|
|
GO
|
|
|
|
CREATE FUNCTION Website.CalculateCustomerPrice
|
|
(
|
|
@CustomerID int,
|
|
@StockItemID int,
|
|
@PricingDate date
|
|
)
|
|
RETURNS decimal(18,2)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
DECLARE @CalculatedPrice decimal(18,2);
|
|
DECLARE @UnitPrice decimal(18,2);
|
|
DECLARE @LowestUnitPrice decimal(18,2);
|
|
DECLARE @HighestDiscountAmount decimal(18,2);
|
|
DECLARE @HighestDiscountPercentage decimal(18,3);
|
|
DECLARE @BuyingGroupID int;
|
|
DECLARE @CustomerCategoryID int;
|
|
DECLARE @DiscountedUnitPrice decimal(18,2);
|
|
|
|
SELECT @BuyingGroupID = BuyingGroupID,
|
|
@CustomerCategoryID = CustomerCategoryID
|
|
FROM Sales.Customers
|
|
WHERE CustomerID = @CustomerID;
|
|
|
|
SELECT @UnitPrice = si.UnitPrice
|
|
FROM Warehouse.StockItems AS si
|
|
WHERE si.StockItemID = @StockItemID;
|
|
|
|
SET @CalculatedPrice = @UnitPrice;
|
|
|
|
SET @LowestUnitPrice = (SELECT MIN(sd.UnitPrice)
|
|
FROM Sales.SpecialDeals AS sd
|
|
WHERE ((sd.StockItemID = @StockItemID) OR (sd.StockItemID IS NULL))
|
|
AND ((sd.CustomerID = @CustomerID) OR (sd.CustomerID IS NULL))
|
|
AND ((sd.BuyingGroupID = @BuyingGroupID) OR (sd.BuyingGroupID IS NULL))
|
|
AND ((sd.CustomerCategoryID = @CustomerCategoryID) OR (sd.CustomerCategoryID IS NULL))
|
|
AND ((sd.StockGroupID IS NULL) OR EXISTS (SELECT 1 FROM Warehouse.StockItemStockGroups AS sisg
|
|
WHERE sisg.StockItemID = @StockItemID
|
|
AND sisg.StockGroupID = sd.StockGroupID))
|
|
AND sd.UnitPrice IS NOT NULL
|
|
AND @PricingDate BETWEEN sd.StartDate AND sd.EndDate);
|
|
|
|
IF @LowestUnitPrice IS NOT NULL AND @LowestUnitPrice < @UnitPrice
|
|
BEGIN
|
|
SET @CalculatedPrice = @LowestUnitPrice;
|
|
END;
|
|
|
|
SET @HighestDiscountAmount = (SELECT MAX(sd.DiscountAmount)
|
|
FROM Sales.SpecialDeals AS sd
|
|
WHERE ((sd.StockItemID = @StockItemID) OR (sd.StockItemID IS NULL))
|
|
AND ((sd.CustomerID = @CustomerID) OR (sd.CustomerID IS NULL))
|
|
AND ((sd.BuyingGroupID = @BuyingGroupID) OR (sd.BuyingGroupID IS NULL))
|
|
AND ((sd.CustomerCategoryID = @CustomerCategoryID) OR (sd.CustomerCategoryID IS NULL))
|
|
AND ((sd.StockGroupID IS NULL) OR EXISTS (SELECT 1 FROM Warehouse.StockItemStockGroups AS sisg
|
|
WHERE sisg.StockItemID = @StockItemID
|
|
AND sisg.StockGroupID = sd.StockGroupID))
|
|
AND sd.DiscountAmount IS NOT NULL
|
|
AND @PricingDate BETWEEN sd.StartDate AND sd.EndDate);
|
|
|
|
IF @HighestDiscountAmount IS NOT NULL AND (@UnitPrice - @HighestDiscountAmount) < @CalculatedPrice
|
|
BEGIN
|
|
SET @CalculatedPrice = @UnitPrice - @HighestDiscountAmount;
|
|
END;
|
|
|
|
SET @HighestDiscountPercentage = (SELECT MAX(sd.DiscountPercentage)
|
|
FROM Sales.SpecialDeals AS sd
|
|
WHERE ((sd.StockItemID = @StockItemID) OR (sd.StockItemID IS NULL))
|
|
AND ((sd.CustomerID = @CustomerID) OR (sd.CustomerID IS NULL))
|
|
AND ((sd.BuyingGroupID = @BuyingGroupID) OR (sd.BuyingGroupID IS NULL))
|
|
AND ((sd.CustomerCategoryID = @CustomerCategoryID) OR (sd.CustomerCategoryID IS NULL))
|
|
AND ((sd.StockGroupID IS NULL) OR EXISTS (SELECT 1 FROM Warehouse.StockItemStockGroups AS sisg
|
|
WHERE sisg.StockItemID = @StockItemID
|
|
AND sisg.StockGroupID = sd.StockGroupID))
|
|
AND sd.DiscountPercentage IS NOT NULL
|
|
AND @PricingDate BETWEEN sd.StartDate AND sd.EndDate);
|
|
|
|
IF @HighestDiscountPercentage IS NOT NULL
|
|
BEGIN
|
|
SET @DiscountedUnitPrice = ROUND(@UnitPrice * @HighestDiscountPercentage / 100.0, 2);
|
|
IF @DiscountedUnitPrice < @CalculatedPrice SET @CalculatedPrice = @DiscountedUnitPrice;
|
|
END;
|
|
|
|
|
|
RETURN @CalculatedPrice;
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'OrderIDList')
|
|
BEGIN
|
|
CREATE TYPE Website.OrderIDList AS TABLE
|
|
(
|
|
OrderID int PRIMARY KEY
|
|
);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'OrderList')
|
|
BEGIN
|
|
CREATE TYPE Website.OrderList AS TABLE
|
|
(
|
|
OrderReference int PRIMARY KEY,
|
|
CustomerID int,
|
|
ContactPersonID int,
|
|
ExpectedDeliveryDate date,
|
|
CustomerPurchaseOrderNumber nvarchar(20),
|
|
IsUndersupplyBackordered bit,
|
|
Comments nvarchar(max),
|
|
DeliveryInstructions nvarchar(max)
|
|
);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'OrderLineList')
|
|
BEGIN
|
|
CREATE TYPE Website.OrderLineList AS TABLE
|
|
(
|
|
OrderReference int,
|
|
StockItemID int,
|
|
[Description] nvarchar(100),
|
|
Quantity int
|
|
);
|
|
END;
|
|
GO
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.table_types WHERE name = N'SensorDataList')
|
|
BEGIN
|
|
CREATE TYPE Website.SensorDataList AS TABLE
|
|
(
|
|
SensorDataListID int NOT NULL IDENTITY(1,1) PRIMARY KEY,
|
|
ColdRoomSensorNumber int NOT NULL,
|
|
RecordedWhen datetime2(7) NOT NULL,
|
|
Temperature decimal(18,2) NOT NULL
|
|
);
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Website.InvoiceCustomerOrders;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.InvoiceCustomerOrders
|
|
@OrdersToInvoice Website.OrderIDList READONLY,
|
|
@PackedByPersonID int,
|
|
@InvoicedByPersonID int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @InvoicesToGenerate TABLE
|
|
(
|
|
OrderID int PRIMARY KEY,
|
|
InvoiceID int NOT NULL,
|
|
TotalDryItems int NOT NULL,
|
|
TotalChillerItems int NOT NULL
|
|
);
|
|
|
|
BEGIN TRY;
|
|
|
|
-- Check that all orders exist, have been fully picked, and not already invoiced. Also allocate new invoice numbers.
|
|
INSERT @InvoicesToGenerate (OrderID, InvoiceID, TotalDryItems, TotalChillerItems)
|
|
SELECT oti.OrderID,
|
|
NEXT VALUE FOR Sequences.InvoiceID,
|
|
COALESCE((SELECT SUM(CASE WHEN si.IsChillerStock <> 0 THEN 0 ELSE 1 END)
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
WHERE ol.OrderID = oti.OrderID), 0),
|
|
COALESCE((SELECT SUM(CASE WHEN si.IsChillerStock <> 0 THEN 1 ELSE 0 END)
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
WHERE ol.OrderID = oti.OrderID), 0)
|
|
FROM @OrdersToInvoice AS oti
|
|
INNER JOIN Sales.Orders AS o
|
|
ON oti.OrderID = o.OrderID
|
|
WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i
|
|
WHERE i.OrderID = oti.OrderID)
|
|
AND o.PickingCompletedWhen IS NOT NULL;
|
|
|
|
IF EXISTS (SELECT 1 FROM @OrdersToInvoice AS oti WHERE NOT EXISTS (SELECT 1 FROM @InvoicesToGenerate AS itg WHERE itg.OrderID = oti.OrderID))
|
|
BEGIN
|
|
PRINT N'At least one order ID either does not exist, is not picked, or is already invoiced';
|
|
THROW 51000, N'At least one orderID either does not exist, is not picked, or is already invoiced', 1;
|
|
END;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Sales.Invoices
|
|
(InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID,
|
|
SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber,
|
|
IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments,
|
|
TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition,
|
|
ReturnedDeliveryData,
|
|
LastEditedBy, LastEditedWhen)
|
|
SELECT itg.InvoiceID, c.CustomerID, c.BillToCustomerID, itg.OrderID, c.DeliveryMethodID, o.ContactPersonID, btc.PrimaryContactPersonID,
|
|
o.SalespersonPersonID, @PackedByPersonID, SYSDATETIME(), o.CustomerPurchaseOrderNumber,
|
|
0, NULL, NULL, c.DeliveryAddressLine1 + N', ' + c.DeliveryAddressLine2, NULL,
|
|
itg.TotalDryItems, itg.TotalChillerItems, c.DeliveryRun, c.RunPosition,
|
|
JSON_MODIFY(N'{"Events": []}', N'append $.Events',
|
|
JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(N'{ }', N'$.Event', N'Ready for collection'),
|
|
N'$.EventTime', CONVERT(nvarchar(20), SYSDATETIME(), 126)),
|
|
N'$.ConNote', N'EAN-125-' + CAST(itg.InvoiceID + 1050 AS nvarchar(20)))),
|
|
@InvoicedByPersonID, SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.Orders AS o
|
|
ON itg.OrderID = o.OrderID
|
|
INNER JOIN Sales.Customers AS c
|
|
ON o.CustomerID = c.CustomerID
|
|
INNER JOIN Sales.Customers AS btc
|
|
ON btc.CustomerID = c.BillToCustomerID;
|
|
|
|
INSERT Sales.InvoiceLines
|
|
(InvoiceID, StockItemID, [Description], PackageTypeID,
|
|
Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice,
|
|
LastEditedBy, LastEditedWhen)
|
|
SELECT itg.InvoiceID, ol.StockItemID, ol.[Description], ol.PackageTypeID,
|
|
ol.PickedQuantity, ol.UnitPrice, ol.TaxRate,
|
|
ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2),
|
|
ROUND(ol.PickedQuantity * (ol.UnitPrice - sih.LastCostPrice), 2),
|
|
ROUND(ol.PickedQuantity * ol.UnitPrice, 2)
|
|
+ ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2),
|
|
@InvoicedByPersonID, SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.OrderLines AS ol
|
|
ON itg.OrderID = ol.OrderID
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
INNER JOIN Warehouse.StockItemHoldings AS sih
|
|
ON si.StockItemID = sih.StockItemID;
|
|
|
|
INSERT Warehouse.StockItemTransactions
|
|
(StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID,
|
|
TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen)
|
|
SELECT il.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N'Stock Issue'),
|
|
i.CustomerID, i.InvoiceID, NULL, NULL,
|
|
SYSDATETIME(), 0 - il.Quantity, @InvoicedByPersonID, SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.InvoiceLines AS il
|
|
ON itg.InvoiceID = il.InvoiceID
|
|
INNER JOIN Sales.Invoices AS i
|
|
ON il.InvoiceID = i.InvoiceID;
|
|
|
|
WITH StockItemTotals
|
|
AS
|
|
(
|
|
SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity
|
|
FROM Sales.InvoiceLines aS il
|
|
WHERE il.InvoiceID IN (SELECT InvoiceID FROM @InvoicesToGenerate)
|
|
GROUP BY il.StockItemID
|
|
)
|
|
UPDATE sih
|
|
SET sih.QuantityOnHand -= sit.TotalQuantity,
|
|
sih.LastEditedBy = @InvoicedByPersonID,
|
|
sih.LastEditedWhen = SYSDATETIME()
|
|
FROM Warehouse.StockItemHoldings AS sih
|
|
INNER JOIN StockItemTotals AS sit
|
|
ON sih.StockItemID = sit.StockItemID;
|
|
|
|
INSERT Sales.CustomerTransactions
|
|
(CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID,
|
|
TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount,
|
|
OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen)
|
|
SELECT i.BillToCustomerID,
|
|
(SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N'Customer Invoice'),
|
|
itg.InvoiceID,
|
|
NULL,
|
|
SYSDATETIME(),
|
|
(SELECT SUM(il.ExtendedPrice - il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
(SELECT SUM(il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
(SELECT SUM(il.ExtendedPrice) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
(SELECT SUM(il.ExtendedPrice) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
NULL,
|
|
@InvoicedByPersonID,
|
|
SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.Invoices AS i
|
|
ON itg.InvoiceID = i.InvoiceID;
|
|
|
|
COMMIT;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
IF XACT_STATE() <> 0 ROLLBACK;
|
|
PRINT N'Unable to invoice these orders';
|
|
THROW;
|
|
RETURN -1;
|
|
END CATCH;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Website.RecordColdRoomTemperatures;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.RecordColdRoomTemperatures
|
|
@SensorReadings Website.SensorDataList READONLY
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET XACT_ABORT ON;
|
|
|
|
BEGIN TRY
|
|
|
|
BEGIN TRAN;
|
|
|
|
DECLARE @NumberOfReadings int = (SELECT MAX(SensorDataListID) FROM @SensorReadings);
|
|
DECLARE @Counter int = (SELECT MIN(SensorDataListID) FROM @SensorReadings);
|
|
|
|
DECLARE @ColdRoomSensorNumber int;
|
|
DECLARE @RecordedWhen datetime2(7);
|
|
DECLARE @Temperature decimal(18,2);
|
|
|
|
-- note that we cannot use a merge here because multiple readings might exist for each sensor
|
|
|
|
WHILE @Counter <= @NumberOfReadings
|
|
BEGIN
|
|
SELECT @ColdRoomSensorNumber = ColdRoomSensorNumber,
|
|
@RecordedWhen = RecordedWhen,
|
|
@Temperature = Temperature
|
|
FROM @SensorReadings
|
|
WHERE SensorDataListID = @Counter;
|
|
|
|
UPDATE Warehouse.ColdRoomTemperatures
|
|
SET RecordedWhen = @RecordedWhen,
|
|
Temperature = @Temperature
|
|
WHERE ColdRoomSensorNumber = @ColdRoomSensorNumber;
|
|
|
|
IF @@ROWCOUNT = 0
|
|
BEGIN
|
|
INSERT Warehouse.ColdRoomTemperatures
|
|
(ColdRoomSensorNumber, RecordedWhen, Temperature)
|
|
VALUES (@ColdRoomSensorNumber, @RecordedWhen, @Temperature);
|
|
END;
|
|
|
|
SET @Counter += 1;
|
|
END;
|
|
|
|
COMMIT;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
THROW 51000, N'Unable to apply the sensor data', 2;
|
|
|
|
IF XACT_STATE() <> 0 ROLLBACK TRAN;
|
|
|
|
RETURN 1;
|
|
END CATCH;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Website.InsertCustomerOrders;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.InsertCustomerOrders
|
|
@Orders Website.OrderList READONLY,
|
|
@OrderLines Website.OrderLineList READONLY,
|
|
@OrdersCreatedByPersonID int,
|
|
@SalespersonPersonID int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @OrdersToGenerate AS TABLE
|
|
(
|
|
OrderReference int PRIMARY KEY, -- reference from the application
|
|
OrderID int
|
|
);
|
|
|
|
-- allocate the new order numbers
|
|
|
|
INSERT @OrdersToGenerate (OrderReference, OrderID)
|
|
SELECT OrderReference, NEXT VALUE FOR Sequences.OrderID
|
|
FROM @Orders;
|
|
|
|
BEGIN TRY
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Sales.Orders
|
|
(OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate,
|
|
ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments,
|
|
PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
SELECT otg.OrderID, o.CustomerID, @SalespersonPersonID, NULL, o.ContactPersonID, NULL, SYSDATETIME(),
|
|
o.ExpectedDeliveryDate, o.CustomerPurchaseOrderNumber, o.IsUndersupplyBackordered, o.Comments, o.DeliveryInstructions, NULL,
|
|
NULL, @OrdersCreatedByPersonID, SYSDATETIME()
|
|
FROM @OrdersToGenerate AS otg
|
|
INNER JOIN @Orders AS o
|
|
ON otg.OrderReference = o.OrderReference;
|
|
|
|
INSERT Sales.OrderLines
|
|
(OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice,
|
|
TaxRate, PickedQuantity, PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
SELECT otg.OrderID, ol.StockItemID, ol.[Description], si.UnitPackageID, ol.Quantity,
|
|
Website.CalculateCustomerPrice(o.CustomerID, ol.StockItemID, SYSDATETIME()),
|
|
si.TaxRate, 0, NULL, @OrdersCreatedByPersonID, SYSDATETIME()
|
|
FROM @OrdersToGenerate AS otg
|
|
INNER JOIN @Orders AS o
|
|
ON otg.OrderReference = o.OrderReference
|
|
INNER JOIN @OrderLines AS ol
|
|
ON otg.OrderReference = ol.OrderReference
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID;
|
|
|
|
COMMIT;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
IF XACT_STATE() <> 0 ROLLBACK;
|
|
PRINT N'Unable to create the customer orders.';
|
|
THROW;
|
|
RETURN -1;
|
|
END CATCH;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_ApplyRowLevelSecurity;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_ApplyRowLevelSecurity
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @SQL nvarchar(max);
|
|
|
|
BEGIN TRY;
|
|
|
|
SET @SQL = N'DROP SECURITY POLICY IF EXISTS [Application].FilterCustomersBySalesTerritoryRole;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP FUNCTION IF EXISTS [Application].DetermineCustomerAccess;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE FUNCTION [Application].DetermineCustomerAccess(@CityID int)
|
|
RETURNS TABLE
|
|
WITH SCHEMABINDING
|
|
AS
|
|
RETURN (SELECT 1 AS AccessResult
|
|
WHERE IS_ROLEMEMBER(N''db_owner'') <> 0
|
|
OR IS_ROLEMEMBER((SELECT sp.SalesTerritory
|
|
FROM [Application].Cities AS c
|
|
INNER JOIN [Application].StateProvinces AS sp
|
|
ON c.StateProvinceID = sp.StateProvinceID
|
|
WHERE c.CityID = @CityID) + N'' Sales'') <> 0
|
|
OR (ORIGINAL_LOGIN() = N''Website''
|
|
AND EXISTS (SELECT 1
|
|
FROM [Application].Cities AS c
|
|
INNER JOIN [Application].StateProvinces AS sp
|
|
ON c.StateProvinceID = sp.StateProvinceID
|
|
WHERE c.CityID = @CityID
|
|
AND sp.SalesTerritory = SESSION_CONTEXT(N''SalesTerritory''))));';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE SECURITY POLICY [Application].FilterCustomersBySalesTerritoryRole
|
|
ADD FILTER PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID)
|
|
ON Sales.Customers,
|
|
ADD BLOCK PREDICATE [Application].DetermineCustomerAccess(DeliveryCityID)
|
|
ON Sales.Customers AFTER UPDATE;';
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'Successfully applied row level security';
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to apply row level security';
|
|
PRINT ERROR_MESSAGE();
|
|
THROW 51000, N'Unable to apply row level security', 1;
|
|
END CATCH;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_ApplyAuditing;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_ApplyAuditing
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @AreDatabaseAuditSpecificationsSupported bit = 0;
|
|
DECLARE @SQL nvarchar(max);
|
|
|
|
-- TODO !! - currently no separate test for audit
|
|
-- but same editions with XTP support database audit specs
|
|
IF SERVERPROPERTY(N'IsXTPSupported') <> 0 SET @AreDatabaseAuditSpecificationsSupported = 1;
|
|
|
|
BEGIN TRY;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.server_audits WHERE name = N'WWI_Audit')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
USE master;
|
|
|
|
CREATE SERVER AUDIT [WWI_Audit]
|
|
TO APPLICATION_LOG
|
|
WITH
|
|
(
|
|
QUEUE_DELAY = 1000,
|
|
ON_FAILURE = CONTINUE
|
|
);';
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'Server audit WWI_Audit created with Application Log as a target.';
|
|
PRINT N'For stronger security, redirect the audit to the security log or a text file in a secure folder.';
|
|
PRINT N'Additional configuration is required when using the security log.';
|
|
PRINT N'For more information see: https://technet.microsoft.com/en-us/library/cc645889.aspx.';
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.server_audit_specifications WHERE name = N'WWI_ServerAuditSpecification')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
USE master;
|
|
|
|
CREATE SERVER AUDIT SPECIFICATION [WWI_ServerAuditSpecification]
|
|
FOR SERVER AUDIT [WWI_Audit]
|
|
ADD (AUDIT_CHANGE_GROUP),
|
|
ADD (DATABASE_CHANGE_GROUP),
|
|
ADD (DATABASE_OWNERSHIP_CHANGE_GROUP),
|
|
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
|
|
ADD (FAILED_LOGIN_GROUP),
|
|
ADD (TRACE_CHANGE_GROUP);';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF @AreDatabaseAuditSpecificationsSupported <> 0
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM sys.database_audit_specifications WHERE name = N'WWI_DatabaseAuditSpecification')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE DATABASE AUDIT SPECIFICATION [WWI_DatabaseAuditSpecification]
|
|
FOR SERVER AUDIT [WWI_Audit]
|
|
ADD (AUDIT_CHANGE_GROUP),
|
|
ADD (DATABASE_CHANGE_GROUP),
|
|
ADD (DATABASE_OWNERSHIP_CHANGE_GROUP),
|
|
ADD (DATABASE_PRINCIPAL_CHANGE_GROUP),
|
|
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP),
|
|
ADD (DATABASE_OBJECT_CHANGE_GROUP),
|
|
ADD (SELECT ON OBJECT::[Sales].[CustomerTransactions] BY [public]),
|
|
ADD (SELECT ON OBJECT::[Purchasing].[SupplierTransactions] BY [public]);';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
END;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to apply audit';
|
|
THROW;
|
|
END CATCH;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_RemoveAuditing;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_RemoveAuditing
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @AreDatabaseAuditSpecificationsSupported bit = 0;
|
|
DECLARE @SQL nvarchar(max);
|
|
|
|
-- TODO !! - currently no separate test for audit
|
|
-- but same editions with XTP support database audit specs
|
|
IF SERVERPROPERTY(N'IsXTPSupported') <> 0 SET @AreDatabaseAuditSpecificationsSupported = 1;
|
|
|
|
BEGIN TRY;
|
|
|
|
IF @AreDatabaseAuditSpecificationsSupported <> 0
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM sys.database_audit_specifications WHERE name = N'WWI_DatabaseAuditSpecification')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
DROP DATABASE AUDIT SPECIFICATION WWI_DatabaseAuditSpecification;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
END;
|
|
|
|
IF EXISTS (SELECT 1 FROM sys.server_audit_specifications WHERE name = N'WWI_ServerAuditSpecification')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
USE master;
|
|
|
|
DROP SERVER AUDIT SPECIFICATION WWI_ServerAuditSpecification;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF EXISTS (SELECT 1 FROM sys.server_audits WHERE name = N'WWI_Audit')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
USE master;
|
|
|
|
DROP SERVER AUDIT [WWI_Audit];';
|
|
EXECUTE (@SQL);
|
|
|
|
END;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to remove audit';
|
|
THROW;
|
|
END CATCH;
|
|
END;
|
|
GO
|
|
|
|
EXEC DataLoadSimulation.ReactivateTemporalTablesAfterDataLoad;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS DataLoadSimulation.PopulateDataToCurrentDate;
|
|
GO
|
|
|
|
CREATE PROCEDURE DataLoadSimulation.PopulateDataToCurrentDate
|
|
@AverageNumberOfCustomerOrdersPerDay int,
|
|
@SaturdayPercentageOfNormalWorkDay int,
|
|
@SundayPercentageOfNormalWorkDay int,
|
|
@IsSilentMode bit,
|
|
@AreDatesPrinted bit
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
|
|
EXEC DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures;
|
|
|
|
DECLARE @CurrentMaximumDate date = COALESCE((SELECT MAX(OrderDate) FROM Sales.Orders), '20121231');
|
|
DECLARE @StartingDate date = DATEADD(day, 1, @CurrentMaximumDate);
|
|
DECLARE @EndingDate date = CAST(DATEADD(day, -1, SYSDATETIME()) AS date);
|
|
|
|
EXEC DataLoadSimulation.DailyProcessToCreateHistory
|
|
@StartDate = @StartingDate,
|
|
@EndDate = @EndingDate,
|
|
@AverageNumberOfCustomerOrdersPerDay = @AverageNumberOfCustomerOrdersPerDay,
|
|
@SaturdayPercentageOfNormalWorkDay = @SaturdayPercentageOfNormalWorkDay,
|
|
@SundayPercentageOfNormalWorkDay = @SundayPercentageOfNormalWorkDay,
|
|
@UpdateCustomFields = 0, -- they were done in the initial load
|
|
@IsSilentMode = @IsSilentMode,
|
|
@AreDatesPrinted = @AreDatesPrinted;
|
|
|
|
EXEC DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_ApplyColumnstoreIndexing;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_ApplyColumnstoreIndexing
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF SERVERPROPERTY(N'IsXTPSupported') = 0 -- TODO !! - currently no separate test for columnstore
|
|
BEGIN -- but same editions with XTP support columnstore
|
|
PRINT N'Warning: Columnstore indexes cannot be created on this edition.';
|
|
END ELSE BEGIN -- if columnstore can be created
|
|
DECLARE @SQL nvarchar(max) = N'';
|
|
|
|
BEGIN TRY;
|
|
|
|
BEGIN TRAN;
|
|
|
|
-- enable page compression on archive tables
|
|
SET @SQL = N''
|
|
SELECT @SQL +=N'
|
|
ALTER INDEX [' + i.name + N'] ON [' + schema_name(o.schema_id) + N'].[' + o.name + N'] REBUILD PARTITION = ALL WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE); '
|
|
FROM sys.indexes i JOIN sys.tables o ON i.object_id=o.object_id
|
|
WHERE o.temporal_type = 1 AND i.type=1
|
|
EXECUTE (@SQL);
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'NCCX_Sales_OrderLines')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCX_Sales_OrderLines
|
|
ON Sales.OrderLines
|
|
(
|
|
OrderID,
|
|
StockItemID,
|
|
[Description],
|
|
Quantity,
|
|
UnitPrice,
|
|
PickedQuantity
|
|
)';
|
|
SET @SQL += N';';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'NCCX_Sales_InvoiceLines')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCX_Sales_InvoiceLines
|
|
ON Sales.InvoiceLines
|
|
(
|
|
InvoiceID,
|
|
StockItemID,
|
|
Quantity,
|
|
UnitPrice,
|
|
LineProfit,
|
|
LastEditedWhen
|
|
)';
|
|
SET @SQL += N';';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CCX_Warehouse_StockItemTransactions')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
ALTER TABLE Warehouse.StockItemTransactions
|
|
DROP CONSTRAINT PK_Warehouse_StockItemTransactions;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Warehouse.StockItemTransactions
|
|
ADD CONSTRAINT PK_Warehouse_StockItemTransactions PRIMARY KEY NONCLUSTERED (StockItemTransactionID);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE CLUSTERED COLUMNSTORE INDEX CCX_Warehouse_StockItemTransactions
|
|
ON Warehouse.StockItemTransactions;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER INDEX CCX_Warehouse_StockItemTransactions
|
|
ON Warehouse.StockItemTransactions
|
|
REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);';
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'Successfully applied columnstore indexing';
|
|
END; -- of if need to apply to stock item transactions
|
|
|
|
COMMIT;
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to apply columnstore indexing';
|
|
THROW;
|
|
END CATCH;
|
|
END; -- of columnstore is allowed
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_EnableInMemory;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_EnableInMemory
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF SERVERPROPERTY(N'IsXTPSupported') = 0
|
|
BEGIN
|
|
PRINT N'Warning: In-memory tables cannot be created on this edition.';
|
|
END ELSE BEGIN -- if in-memory can be created
|
|
|
|
DECLARE @SQL nvarchar(max) = N'';
|
|
|
|
BEGIN TRY
|
|
IF CAST(SERVERPROPERTY(N'EngineEdition') AS int) <> 5 -- Not an Azure SQL DB
|
|
BEGIN
|
|
DECLARE @SQLDataFolder nvarchar(max) = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS nvarchar(max));
|
|
DECLARE @MemoryOptimizedFilegroupFolder nvarchar(max) = @SQLDataFolder + N'WideWorldImporters_InMemory_Data_1';
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.filegroups WHERE name = N'WWI_InMemory_Data')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
ALTER DATABASE WideWorldImporters
|
|
ADD FILEGROUP WWI_InMemory_Data CONTAINS MEMORY_OPTIMIZED_DATA;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER DATABASE WideWorldImporters
|
|
ADD FILE (name = N''WWI_InMemory_Data_1'', filename = '''
|
|
+ @MemoryOptimizedFilegroupFolder + N''')
|
|
TO FILEGROUP WWI_InMemory_Data;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER DATABASE WideWorldImporters
|
|
SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = N'ColdRoomTemperatures' AND is_memory_optimized <> 0)
|
|
BEGIN
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Warehouse.ColdRoomTemperatures SET (SYSTEM_VERSIONING = OFF);
|
|
ALTER TABLE Warehouse.ColdRoomTemperatures DROP PERIOD FOR SYSTEM_TIME;
|
|
ALTER TABLE Warehouse.ColdRoomTemperatures DROP CONSTRAINT PK_Warehouse_ColdRoomTemperatures;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
EXEC dbo.sp_rename @objname = N''Warehouse.ColdRoomTemperatures'',
|
|
@newname = N''ColdRoomTemperatures_Backup'',
|
|
@objtype = N''OBJECT'';';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE TABLE Warehouse.ColdRoomTemperatures
|
|
(
|
|
ColdRoomTemperatureID bigint IDENTITY(1,1) NOT NULL,
|
|
ColdRoomSensorNumber int NOT NULL,
|
|
RecordedWhen datetime2(7) NOT NULL,
|
|
Temperature decimal(10, 2) NOT NULL,
|
|
ValidFrom datetime2(7) NOT NULL,
|
|
ValidTo datetime2(7) NOT NULL,
|
|
CONSTRAINT PK_Warehouse_ColdRoomTemperatures PRIMARY KEY NONCLUSTERED (ColdRoomTemperatureID)
|
|
) WITH (MEMORY_OPTIMIZED = ON ,DURABILITY = SCHEMA_AND_DATA);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
SET IDENTITY_INSERT Warehouse.ColdRoomTemperatures ON;
|
|
|
|
INSERT Warehouse.ColdRoomTemperatures (ColdRoomTemperatureID, ColdRoomSensorNumber, RecordedWhen, Temperature,
|
|
ValidFrom, ValidTo)
|
|
SELECT ColdRoomTemperatureID, ColdRoomSensorNumber, RecordedWhen, Temperature, ValidFrom, ValidTo
|
|
FROM Warehouse.ColdRoomTemperatures_Backup;
|
|
|
|
SET IDENTITY_INSERT Warehouse.ColdRoomTemperatures OFF;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP TABLE Warehouse.ColdRoomTemperatures_Backup;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Warehouse.ColdRoomTemperatures
|
|
ADD PERIOD FOR SYSTEM_TIME(ValidFrom, ValidTo);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Warehouse.ColdRoomTemperatures
|
|
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = Warehouse.ColdRoomTemperatures_Archive, DATA_CONSISTENCY_CHECK = ON));';
|
|
EXECUTE (@SQL);
|
|
|
|
END; -- of if we need to move ColdRoomTemperatures
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = N'VehicleTemperatures' AND is_memory_optimized <> 0)
|
|
BEGIN
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Warehouse.VehicleTemperatures DROP CONSTRAINT PK_Warehouse_VehicleTemperatures;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
EXEC dbo.sp_rename @objname = N''Warehouse.VehicleTemperatures'',
|
|
@newname = N''VehicleTemperatures_Backup'',
|
|
@objtype = N''OBJECT'';';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE TABLE Warehouse.VehicleTemperatures
|
|
(
|
|
VehicleTemperatureID bigint IDENTITY(1,1) NOT NULL,
|
|
VehicleRegistration nvarchar(20) COLLATE Latin1_General_CI_AS NOT NULL,
|
|
ChillerSensorNumber int NOT NULL,
|
|
RecordedWhen datetime2(7) NOT NULL,
|
|
Temperature decimal(10, 2) NOT NULL,
|
|
FullSensorData nvarchar(1000) COLLATE Latin1_General_CI_AS NULL,
|
|
IsCompressed bit NOT NULL,
|
|
CompressedSensorData varbinary(max) NULL,
|
|
CONSTRAINT PK_Warehouse_VehicleTemperatures PRIMARY KEY NONCLUSTERED (VehicleTemperatureID)
|
|
) WITH (MEMORY_OPTIMIZED = ON , DURABILITY = SCHEMA_AND_DATA);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
SET IDENTITY_INSERT Warehouse.VehicleTemperatures ON;
|
|
|
|
INSERT Warehouse.VehicleTemperatures
|
|
(VehicleTemperatureID, VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData)
|
|
SELECT VehicleTemperatureID, VehicleRegistration, ChillerSensorNumber, RecordedWhen, Temperature, FullSensorData, IsCompressed, CompressedSensorData
|
|
FROM Warehouse.VehicleTemperatures_Backup;
|
|
|
|
SET IDENTITY_INSERT Warehouse.VehicleTemperatures OFF;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP TABLE Warehouse.VehicleTemperatures_Backup;';
|
|
EXECUTE (@SQL);
|
|
|
|
END; -- of if we need to move VehicleTemperatures
|
|
|
|
-- Drop the procedures that are used by the table types
|
|
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.InvoiceCustomerOrders;';
|
|
EXECUTE (@SQL);
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.InsertCustomerOrders;';
|
|
EXECUTE (@SQL);
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.RecordColdRoomTemperatures;';
|
|
EXECUTE (@SQL);
|
|
|
|
-- Drop the table types
|
|
|
|
SET @SQL = N'DROP TYPE IF EXISTS Website.OrderIDList;';
|
|
EXECUTE (@SQL);
|
|
SET @SQL = N'DROP TYPE IF EXISTS Website.OrderLineList;';
|
|
EXECUTE (@SQL);
|
|
SET @SQL = N'DROP TYPE IF EXISTS Website.OrderList;';
|
|
EXECUTE (@SQL);
|
|
SET @SQL = N'DROP TYPE IF EXISTS Website.SensorDataList;';
|
|
EXECUTE (@SQL);
|
|
|
|
-- Create the new table types
|
|
|
|
SET @SQL = N'
|
|
CREATE TYPE Website.OrderIDList AS TABLE
|
|
(
|
|
OrderID int PRIMARY KEY NONCLUSTERED
|
|
)
|
|
WITH (MEMORY_OPTIMIZED = ON);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE TYPE Website.OrderList AS TABLE
|
|
(
|
|
OrderReference int PRIMARY KEY NONCLUSTERED,
|
|
CustomerID int,
|
|
ContactPersonID int,
|
|
ExpectedDeliveryDate date,
|
|
CustomerPurchaseOrderNumber nvarchar(20),
|
|
IsUndersupplyBackordered bit,
|
|
Comments nvarchar(max),
|
|
DeliveryInstructions nvarchar(max)
|
|
)
|
|
WITH (MEMORY_OPTIMIZED = ON);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE TYPE Website.OrderLineList AS TABLE
|
|
(
|
|
OrderReference int,
|
|
StockItemID int,
|
|
[Description] nvarchar(100),
|
|
Quantity int,
|
|
INDEX IX_Website_OrderLineList NONCLUSTERED (OrderReference)
|
|
)
|
|
WITH (MEMORY_OPTIMIZED = ON);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE TYPE Website.SensorDataList AS TABLE
|
|
(
|
|
SensorDataListID int IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
|
|
ColdRoomSensorNumber int,
|
|
RecordedWhen datetime2(7),
|
|
Temperature decimal(18,2)
|
|
)
|
|
WITH (MEMORY_OPTIMIZED = ON);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.InvoiceCustomerOrders
|
|
@OrdersToInvoice Website.OrderIDList READONLY,
|
|
@PackedByPersonID int,
|
|
@InvoicedByPersonID int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @InvoicesToGenerate TABLE
|
|
(
|
|
OrderID int PRIMARY KEY,
|
|
InvoiceID int NOT NULL,
|
|
TotalDryItems int NOT NULL,
|
|
TotalChillerItems int NOT NULL
|
|
);
|
|
|
|
BEGIN TRY;
|
|
|
|
-- Check that all orders exist, have been fully picked, and not already invoiced. Also allocate new invoice numbers.
|
|
INSERT @InvoicesToGenerate (OrderID, InvoiceID, TotalDryItems, TotalChillerItems)
|
|
SELECT oti.OrderID,
|
|
NEXT VALUE FOR Sequences.InvoiceID,
|
|
COALESCE((SELECT SUM(CASE WHEN si.IsChillerStock <> 0 THEN 0 ELSE 1 END)
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
WHERE ol.OrderID = oti.OrderID), 0),
|
|
COALESCE((SELECT SUM(CASE WHEN si.IsChillerStock <> 0 THEN 1 ELSE 0 END)
|
|
FROM Sales.OrderLines AS ol
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
WHERE ol.OrderID = oti.OrderID), 0)
|
|
FROM @OrdersToInvoice AS oti
|
|
INNER JOIN Sales.Orders AS o
|
|
ON oti.OrderID = o.OrderID
|
|
WHERE NOT EXISTS (SELECT 1 FROM Sales.Invoices AS i
|
|
WHERE i.OrderID = oti.OrderID)
|
|
AND o.PickingCompletedWhen IS NOT NULL;
|
|
|
|
IF EXISTS (SELECT 1 FROM @OrdersToInvoice AS oti WHERE NOT EXISTS (SELECT 1 FROM @InvoicesToGenerate AS itg WHERE itg.OrderID = oti.OrderID))
|
|
BEGIN
|
|
PRINT N''At least one order ID either does not exist, is not picked, or is already invoiced'';
|
|
THROW 51000, N''At least one orderID either does not exist, is not picked, or is already invoiced'', 1;
|
|
END;
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Sales.Invoices
|
|
(InvoiceID, CustomerID, BillToCustomerID, OrderID, DeliveryMethodID, ContactPersonID, AccountsPersonID,
|
|
SalespersonPersonID, PackedByPersonID, InvoiceDate, CustomerPurchaseOrderNumber,
|
|
IsCreditNote, CreditNoteReason, Comments, DeliveryInstructions, InternalComments,
|
|
TotalDryItems, TotalChillerItems, DeliveryRun, RunPosition,
|
|
ReturnedDeliveryData,
|
|
LastEditedBy, LastEditedWhen)
|
|
SELECT itg.InvoiceID, c.CustomerID, c.BillToCustomerID, itg.OrderID, c.DeliveryMethodID, o.ContactPersonID, btc.PrimaryContactPersonID,
|
|
o.SalespersonPersonID, @PackedByPersonID, SYSDATETIME(), o.CustomerPurchaseOrderNumber,
|
|
0, NULL, NULL, c.DeliveryAddressLine1 + N'', '' + c.DeliveryAddressLine2, NULL,
|
|
itg.TotalDryItems, itg.TotalChillerItems, c.DeliveryRun, c.RunPosition,
|
|
JSON_MODIFY(N''{"Events": []}'', N''append $.Events'',
|
|
JSON_MODIFY(JSON_MODIFY(JSON_MODIFY(N''{ }'', N''$.Event'', N''Ready for collection''),
|
|
N''$.EventTime'', CONVERT(nvarchar(20), SYSDATETIME(), 126)),
|
|
N''$.ConNote'', N''EAN-125-'' + CAST(itg.InvoiceID + 1050 AS nvarchar(20)))),
|
|
@InvoicedByPersonID, SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.Orders AS o
|
|
ON itg.OrderID = o.OrderID
|
|
INNER JOIN Sales.Customers AS c
|
|
ON o.CustomerID = c.CustomerID
|
|
INNER JOIN Sales.Customers AS btc
|
|
ON btc.CustomerID = c.BillToCustomerID;
|
|
|
|
INSERT Sales.InvoiceLines
|
|
(InvoiceID, StockItemID, [Description], PackageTypeID,
|
|
Quantity, UnitPrice, TaxRate, TaxAmount, LineProfit, ExtendedPrice,
|
|
LastEditedBy, LastEditedWhen)
|
|
SELECT itg.InvoiceID, ol.StockItemID, ol.[Description], ol.PackageTypeID,
|
|
ol.PickedQuantity, ol.UnitPrice, ol.TaxRate,
|
|
ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2),
|
|
ROUND(ol.PickedQuantity * (ol.UnitPrice - sih.LastCostPrice), 2),
|
|
ROUND(ol.PickedQuantity * ol.UnitPrice, 2)
|
|
+ ROUND(ol.PickedQuantity * ol.UnitPrice * ol.TaxRate / 100.0, 2),
|
|
@InvoicedByPersonID, SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.OrderLines AS ol
|
|
ON itg.OrderID = ol.OrderID
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID
|
|
INNER JOIN Warehouse.StockItemHoldings AS sih
|
|
ON si.StockItemID = sih.StockItemID
|
|
ORDER BY ol.OrderID, ol.OrderLineID;
|
|
|
|
INSERT Warehouse.StockItemTransactions
|
|
(StockItemID, TransactionTypeID, CustomerID, InvoiceID, SupplierID, PurchaseOrderID,
|
|
TransactionOccurredWhen, Quantity, LastEditedBy, LastEditedWhen)
|
|
SELECT il.StockItemID, (SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Stock Issue''),
|
|
i.CustomerID, i.InvoiceID, NULL, NULL,
|
|
SYSDATETIME(), 0 - il.Quantity, @InvoicedByPersonID, SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.InvoiceLines AS il
|
|
ON itg.InvoiceID = il.InvoiceID
|
|
INNER JOIN Sales.Invoices AS i
|
|
ON il.InvoiceID = i.InvoiceID
|
|
ORDER BY il.InvoiceID, il.InvoiceLineID;
|
|
|
|
WITH StockItemTotals
|
|
AS
|
|
(
|
|
SELECT il.StockItemID, SUM(il.Quantity) AS TotalQuantity
|
|
FROM Sales.InvoiceLines aS il
|
|
WHERE il.InvoiceID IN (SELECT InvoiceID FROM @InvoicesToGenerate)
|
|
GROUP BY il.StockItemID
|
|
)
|
|
UPDATE sih
|
|
SET sih.QuantityOnHand -= sit.TotalQuantity,
|
|
sih.LastEditedBy = @InvoicedByPersonID,
|
|
sih.LastEditedWhen = SYSDATETIME()
|
|
FROM Warehouse.StockItemHoldings AS sih
|
|
INNER JOIN StockItemTotals AS sit
|
|
ON sih.StockItemID = sit.StockItemID;
|
|
|
|
INSERT Sales.CustomerTransactions
|
|
(CustomerID, TransactionTypeID, InvoiceID, PaymentMethodID,
|
|
TransactionDate, AmountExcludingTax, TaxAmount, TransactionAmount,
|
|
OutstandingBalance, FinalizationDate, LastEditedBy, LastEditedWhen)
|
|
SELECT i.BillToCustomerID,
|
|
(SELECT TransactionTypeID FROM [Application].TransactionTypes WHERE TransactionTypeName = N''Customer Invoice''),
|
|
itg.InvoiceID,
|
|
NULL,
|
|
SYSDATETIME(),
|
|
(SELECT SUM(il.ExtendedPrice - il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
(SELECT SUM(il.TaxAmount) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
(SELECT SUM(il.ExtendedPrice) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
(SELECT SUM(il.ExtendedPrice) FROM Sales.InvoiceLines AS il WHERE il.InvoiceID = itg.InvoiceID),
|
|
NULL,
|
|
@InvoicedByPersonID,
|
|
SYSDATETIME()
|
|
FROM @InvoicesToGenerate AS itg
|
|
INNER JOIN Sales.Invoices AS i
|
|
ON itg.InvoiceID = i.InvoiceID;
|
|
|
|
COMMIT;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
IF XACT_STATE() <> 0 ROLLBACK;
|
|
PRINT N''Unable to invoice these orders'';
|
|
THROW;
|
|
RETURN -1;
|
|
END CATCH;
|
|
|
|
RETURN 0;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.RecordColdRoomTemperatures
|
|
@SensorReadings Website.SensorDataList READONLY
|
|
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
|
|
AS
|
|
BEGIN ATOMIC WITH
|
|
(
|
|
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
|
|
LANGUAGE = N''English''
|
|
)
|
|
BEGIN TRY
|
|
|
|
DECLARE @NumberOfReadings int = (SELECT MAX(SensorDataListID) FROM @SensorReadings);
|
|
DECLARE @Counter int = (SELECT MIN(SensorDataListID) FROM @SensorReadings);
|
|
|
|
DECLARE @ColdRoomSensorNumber int;
|
|
DECLARE @RecordedWhen datetime2(7);
|
|
DECLARE @Temperature decimal(18,2);
|
|
|
|
-- note that we cannot use a merge here because multiple readings might exist for each sensor
|
|
|
|
WHILE @Counter <= @NumberOfReadings
|
|
BEGIN
|
|
SELECT @ColdRoomSensorNumber = ColdRoomSensorNumber,
|
|
@RecordedWhen = RecordedWhen,
|
|
@Temperature = Temperature
|
|
FROM @SensorReadings
|
|
WHERE SensorDataListID = @Counter;
|
|
|
|
UPDATE Warehouse.ColdRoomTemperatures
|
|
SET RecordedWhen = @RecordedWhen,
|
|
Temperature = @Temperature
|
|
WHERE ColdRoomSensorNumber = @ColdRoomSensorNumber;
|
|
|
|
IF @@ROWCOUNT = 0
|
|
BEGIN
|
|
INSERT Warehouse.ColdRoomTemperatures
|
|
(ColdRoomSensorNumber, RecordedWhen, Temperature)
|
|
VALUES (@ColdRoomSensorNumber, @RecordedWhen, @Temperature);
|
|
END;
|
|
|
|
SET @Counter += 1;
|
|
END;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
THROW 51000, N''Unable to apply the sensor data'', 2;
|
|
|
|
RETURN 1;
|
|
END CATCH;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.InsertCustomerOrders
|
|
@Orders Website.OrderList READONLY,
|
|
@OrderLines Website.OrderLineList READONLY,
|
|
@OrdersCreatedByPersonID int,
|
|
@SalespersonPersonID int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @OrdersToGenerate AS TABLE
|
|
(
|
|
OrderReference int PRIMARY KEY, -- reference from the application
|
|
OrderID int
|
|
);
|
|
|
|
-- allocate the new order numbers
|
|
|
|
INSERT @OrdersToGenerate (OrderReference, OrderID)
|
|
SELECT OrderReference, NEXT VALUE FOR Sequences.OrderID
|
|
FROM @Orders;
|
|
|
|
BEGIN TRY
|
|
|
|
BEGIN TRAN;
|
|
|
|
INSERT Sales.Orders
|
|
(OrderID, CustomerID, SalespersonPersonID, PickedByPersonID, ContactPersonID, BackorderOrderID, OrderDate,
|
|
ExpectedDeliveryDate, CustomerPurchaseOrderNumber, IsUndersupplyBackordered, Comments, DeliveryInstructions, InternalComments,
|
|
PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
SELECT otg.OrderID, o.CustomerID, @SalespersonPersonID, NULL, o.ContactPersonID, NULL, SYSDATETIME(),
|
|
o.ExpectedDeliveryDate, o.CustomerPurchaseOrderNumber, o.IsUndersupplyBackordered, o.Comments, o.DeliveryInstructions, NULL,
|
|
NULL, @OrdersCreatedByPersonID, SYSDATETIME()
|
|
FROM @OrdersToGenerate AS otg
|
|
INNER JOIN @Orders AS o
|
|
ON otg.OrderReference = o.OrderReference;
|
|
|
|
INSERT Sales.OrderLines
|
|
(OrderID, StockItemID, [Description], PackageTypeID, Quantity, UnitPrice,
|
|
TaxRate, PickedQuantity, PickingCompletedWhen, LastEditedBy, LastEditedWhen)
|
|
SELECT otg.OrderID, ol.StockItemID, ol.[Description], si.UnitPackageID, ol.Quantity,
|
|
Website.CalculateCustomerPrice(o.CustomerID, ol.StockItemID, SYSDATETIME()),
|
|
si.TaxRate, 0, NULL, @OrdersCreatedByPersonID, SYSDATETIME()
|
|
FROM @OrdersToGenerate AS otg
|
|
INNER JOIN @OrderLines AS ol
|
|
ON otg.OrderReference = ol.OrderReference
|
|
INNER JOIN @Orders AS o
|
|
ON ol.OrderReference = o.OrderReference
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON ol.StockItemID = si.StockItemID;
|
|
|
|
COMMIT;
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
IF XACT_STATE() <> 0 ROLLBACK;
|
|
PRINT N''Unable to create the customer orders.'';
|
|
THROW;
|
|
RETURN -1;
|
|
END CATCH;
|
|
|
|
RETURN 0;
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to apply in-memory tables';
|
|
THROW;
|
|
END CATCH;
|
|
END; -- of in-memory is allowed
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_ApplyFullTextIndexing;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_ApplyFullTextIndexing
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
IF SERVERPROPERTY(N'IsFullTextInstalled') = 0
|
|
BEGIN
|
|
PRINT N'Warning: Full text options cannot be configured because full text indexing is not installed.';
|
|
END ELSE BEGIN -- if full text is installed
|
|
DECLARE @SQL nvarchar(max) = N'';
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_catalogs WHERE name = N'FTCatalog')
|
|
BEGIN
|
|
SET @SQL = N'CREATE FULLTEXT CATALOG FTCatalog AS DEFAULT;'
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes AS fti WHERE fti.object_id = OBJECT_ID(N'[Application].People'))
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE FULLTEXT INDEX
|
|
ON [Application].People (SearchName, CustomFields, OtherLanguages)
|
|
KEY INDEX PK_Application_People
|
|
WITH CHANGE_TRACKING AUTO;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes AS fti WHERE fti.object_id = OBJECT_ID(N'Sales.Customers'))
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE FULLTEXT INDEX
|
|
ON Sales.Customers (CustomerName)
|
|
KEY INDEX PK_Sales_Customers
|
|
WITH CHANGE_TRACKING AUTO;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes AS fti WHERE fti.object_id = OBJECT_ID(N'Purchasing.Suppliers'))
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE FULLTEXT INDEX
|
|
ON Purchasing.Suppliers (SupplierName)
|
|
KEY INDEX PK_Purchasing_Suppliers
|
|
WITH CHANGE_TRACKING AUTO;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes AS fti WHERE fti.object_id = OBJECT_ID(N'Warehouse.StockItems'))
|
|
BEGIN
|
|
SET @SQL = N'CREATE FULLTEXT INDEX
|
|
ON Warehouse.StockItems (SearchDetails, CustomFields, Tags)
|
|
KEY INDEX PK_Warehouse_StockItems
|
|
WITH CHANGE_TRACKING AUTO;';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.SearchForPeople;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.SearchForPeople
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
AS
|
|
BEGIN
|
|
SELECT p.PersonID,
|
|
p.FullName,
|
|
p.PreferredName,
|
|
CASE WHEN p.IsSalesperson <> 0 THEN N''Salesperson''
|
|
WHEN p.IsEmployee <> 0 THEN N''Employee''
|
|
WHEN c.CustomerID IS NOT NULL THEN N''Customer''
|
|
WHEN sp.SupplierID IS NOT NULL THEN N''Supplier''
|
|
WHEN sa.SupplierID IS NOT NULL THEN N''Supplier''
|
|
END AS Relationship,
|
|
COALESCE(c.CustomerName, sp.SupplierName, sa.SupplierName, N''WWI'') AS Company
|
|
FROM [Application].People AS p
|
|
INNER JOIN FREETEXTTABLE([Application].People, SearchName, @SearchText, @MaximumRowsToReturn) AS ft
|
|
ON p.PersonID = ft.[KEY]
|
|
LEFT OUTER JOIN Sales.Customers AS c
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
LEFT OUTER JOIN Purchasing.Suppliers AS sp
|
|
ON sp.PrimaryContactPersonID = p.PersonID
|
|
LEFT OUTER JOIN Purchasing.Suppliers AS sa
|
|
ON sa.AlternateContactPersonID = p.PersonID
|
|
ORDER BY ft.[RANK]
|
|
FOR JSON AUTO, ROOT(N''People'');
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.SearchForSuppliers;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.SearchForSuppliers
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
AS
|
|
BEGIN
|
|
SELECT s.SupplierID,
|
|
s.SupplierName,
|
|
c.CityName,
|
|
s.PhoneNumber,
|
|
s.FaxNumber ,
|
|
p.FullName AS PrimaryContactFullName,
|
|
p.PreferredName AS PrimaryContactPreferredName
|
|
FROM Purchasing.Suppliers AS s
|
|
INNER JOIN FREETEXTTABLE(Purchasing.Suppliers, SupplierName, @SearchText, @MaximumRowsToReturn) AS ft
|
|
ON s.SupplierID = ft.[KEY]
|
|
INNER JOIN [Application].Cities AS c
|
|
ON s.DeliveryCityID = c.CityID
|
|
LEFT OUTER JOIN [Application].People AS p
|
|
ON s.PrimaryContactPersonID = p.PersonID
|
|
ORDER BY ft.[RANK]
|
|
FOR JSON AUTO, ROOT(N''Suppliers'');
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.SearchForCustomers;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.SearchForCustomers
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT c.CustomerID,
|
|
c.CustomerName,
|
|
ct.CityName,
|
|
c.PhoneNumber,
|
|
c.FaxNumber,
|
|
p.FullName AS PrimaryContactFullName,
|
|
p.PreferredName AS PrimaryContactPreferredName
|
|
FROM Sales.Customers AS c
|
|
INNER JOIN FREETEXTTABLE(Sales.Customers, CustomerName, @SearchText, @MaximumRowsToReturn) AS ft
|
|
ON c.CustomerID = ft.[KEY]
|
|
INNER JOIN [Application].Cities AS ct
|
|
ON c.DeliveryCityID = ct.CityID
|
|
LEFT OUTER JOIN [Application].People AS p
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
ORDER BY ft.[RANK]
|
|
FOR JSON AUTO, ROOT(N''Customers'');
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.SearchForStockItems;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.SearchForStockItems
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT si.StockItemID,
|
|
si.StockItemName
|
|
FROM Warehouse.StockItems AS si
|
|
INNER JOIN FREETEXTTABLE(Warehouse.StockItems, SearchDetails, @SearchText, @MaximumRowsToReturn) AS ft
|
|
ON si.StockItemID = ft.[KEY]
|
|
ORDER BY ft.[RANK]
|
|
FOR JSON AUTO, ROOT(N''StockItems'');
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP PROCEDURE IF EXISTS Website.SearchForStockItemsByTags;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE PROCEDURE Website.SearchForStockItemsByTags
|
|
@SearchText nvarchar(1000),
|
|
@MaximumRowsToReturn int
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SELECT si.StockItemID,
|
|
si.StockItemName
|
|
FROM Warehouse.StockItems AS si
|
|
INNER JOIN FREETEXTTABLE(Warehouse.StockItems, Tags, @SearchText, @MaximumRowsToReturn) AS ft
|
|
ON si.StockItemID = ft.[KEY]
|
|
ORDER BY ft.[RANK]
|
|
FOR JSON AUTO, ROOT(N''StockItems'');
|
|
END;';
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'Full text successfully enabled';
|
|
END;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_ApplyPartitioning;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_ApplyPartitioning
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
IF SERVERPROPERTY(N'IsXTPSupported') = 0 -- TODO Check for a better way to check for partitioning
|
|
BEGIN -- Currently versions that support in-memory OLTP also support partitions
|
|
PRINT N'Warning: Partitions are not supported in this edition.';
|
|
END ELSE BEGIN -- if partitions are permitted
|
|
|
|
BEGIN TRAN;
|
|
|
|
DECLARE @SQL nvarchar(max) = N'';
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.partition_functions WHERE name = N'PF_TransactionDateTime')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PARTITION FUNCTION PF_TransactionDateTime(datetime)
|
|
AS RANGE RIGHT
|
|
FOR VALUES (N''20140101'', N''20150101'', N''20160101'', N''20170101'');';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.partition_functions WHERE name = N'PF_TransactionDate')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PARTITION FUNCTION PF_TransactionDate(date)
|
|
AS RANGE RIGHT
|
|
FOR VALUES (N''20140101'', N''20150101'', N''20160101'', N''20170101'');';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT * FROM sys.partition_schemes WHERE name = N'PS_TransactionDateTime')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PARTITION SCHEME PS_TransactionDateTime
|
|
AS PARTITION PF_TransactionDateTime
|
|
ALL TO ([USERDATA]);';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.partition_schemes WHERE name = N'PS_TransactionDate')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
CREATE PARTITION SCHEME PS_TransactionDate
|
|
AS PARTITION PF_TransactionDate
|
|
ALL TO ([USERDATA]]);';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CX_Sales_CustomerTransactions')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
ALTER TABLE Sales.CustomerTransactions
|
|
DROP CONSTRAINT PK_Sales_CustomerTransactions;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Sales.CustomerTransactions
|
|
ADD CONSTRAINT PK_Sales_CustomerTransactions PRIMARY KEY NONCLUSTERED
|
|
(
|
|
CustomerTransactionID
|
|
);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE CLUSTERED INDEX CX_Sales_CustomerTransactions
|
|
ON Sales.CustomerTransactions
|
|
(
|
|
TransactionDate
|
|
)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Sales_CustomerTransactions_CustomerID
|
|
ON Sales.CustomerTransactions
|
|
(
|
|
CustomerID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Sales_CustomerTransactions_InvoiceID
|
|
ON Sales.CustomerTransactions
|
|
(
|
|
InvoiceID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Sales_CustomerTransactions_PaymentMethodID
|
|
ON Sales.CustomerTransactions
|
|
(
|
|
PaymentMethodID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Sales_CustomerTransactions_TransactionTypeID
|
|
ON Sales.CustomerTransactions
|
|
(
|
|
TransactionTypeID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX IX_Sales_CustomerTransactions_IsFinalized
|
|
ON Sales.CustomerTransactions
|
|
(
|
|
IsFinalized
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'CX_Purchasing_SupplierTransactions')
|
|
BEGIN
|
|
SET @SQL = N'
|
|
ALTER TABLE Purchasing.SupplierTransactions
|
|
DROP CONSTRAINT PK_Purchasing_SupplierTransactions;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
ALTER TABLE Purchasing.SupplierTransactions
|
|
ADD CONSTRAINT PK_Purchasing_SupplierTransactions PRIMARY KEY NONCLUSTERED
|
|
(
|
|
SupplierTransactionID
|
|
);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE CLUSTERED INDEX CX_Purchasing_SupplierTransactions
|
|
ON Purchasing.SupplierTransactions
|
|
(
|
|
TransactionDate
|
|
)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Purchasing_SupplierTransactions_PaymentMethodID
|
|
ON Purchasing.SupplierTransactions
|
|
(
|
|
PaymentMethodID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Purchasing_SupplierTransactions_PurchaseOrderID
|
|
ON Purchasing.SupplierTransactions
|
|
(
|
|
PurchaseOrderID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Purchasing_SupplierTransactions_SupplierID
|
|
ON Purchasing.SupplierTransactions
|
|
(
|
|
SupplierID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX FK_Purchasing_SupplierTransactions_TransactionTypeID
|
|
ON Purchasing.SupplierTransactions
|
|
(
|
|
TransactionTypeID
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'
|
|
CREATE INDEX IX_Purchasing_SupplierTransactions_IsFinalized
|
|
ON Purchasing.SupplierTransactions
|
|
(
|
|
IsFinalized
|
|
)
|
|
WITH (DROP_EXISTING = ON)
|
|
ON PS_TransactionDate(TransactionDate);';
|
|
EXECUTE (@SQL);
|
|
END;
|
|
|
|
COMMIT;
|
|
|
|
PRINT N'Partitioning successfully enabled';
|
|
END;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Website.ActivateWebsiteLogon;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.ActivateWebsiteLogon
|
|
@PersonID int,
|
|
@LogonName nvarchar(50),
|
|
@InitialPassword nvarchar(40)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
UPDATE [Application].People
|
|
SET IsPermittedToLogon = 1,
|
|
LogonName = @LogonName,
|
|
HashedPassword = HASHBYTES(N'SHA2_256', @InitialPassword + FullName),
|
|
UserPreferences = (SELECT UserPreferences FROM [Application].People WHERE PersonID = 1) -- Person 1 has User Preferences template
|
|
WHERE PersonID = @PersonID
|
|
AND PersonID <> 1
|
|
AND IsPermittedToLogon = 0;
|
|
|
|
IF @@ROWCOUNT = 0
|
|
BEGIN
|
|
PRINT N'The PersonID must be valid, must not be person 1, and must not already be enabled';
|
|
THROW 51000, N'Invalid PersonID', 1;
|
|
RETURN -1;
|
|
END;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Website.ChangePassword;
|
|
GO
|
|
|
|
CREATE PROCEDURE Website.ChangePassword
|
|
@PersonID int,
|
|
@OldPassword nvarchar(40),
|
|
@NewPassword nvarchar(40)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
UPDATE [Application].People
|
|
SET IsPermittedToLogon = 1,
|
|
HashedPassword = HASHBYTES(N'SHA2_256', @NewPassword + FullName)
|
|
WHERE PersonID = @PersonID
|
|
AND PersonID <> 1
|
|
AND HashedPassword = HASHBYTES(N'SHA2_256', @OldPassword + FullName);
|
|
|
|
IF @@ROWCOUNT = 0
|
|
BEGIN
|
|
PRINT N'The PersonID must be valid, and the old password must be valid.';
|
|
PRINT N'If the user has also changed name, please contact the IT staff to assist.';
|
|
THROW 51000, N'Invalid Password Change', 1;
|
|
RETURN -1;
|
|
END;
|
|
END;
|
|
GO
|
|
|
|
DROP VIEW IF EXISTS Website.Suppliers;
|
|
GO
|
|
|
|
CREATE VIEW Website.Suppliers
|
|
AS
|
|
SELECT s.SupplierID,
|
|
s.SupplierName,
|
|
sc.SupplierCategoryName,
|
|
pp.FullName AS PrimaryContact,
|
|
ap.FullName AS AlternateContact,
|
|
s.PhoneNumber,
|
|
s.FaxNumber,
|
|
s.WebsiteURL,
|
|
dm.DeliveryMethodName AS DeliveryMethod,
|
|
c.CityName AS CityName,
|
|
s.DeliveryLocation AS DeliveryLocation,
|
|
s.SupplierReference
|
|
FROM Purchasing.Suppliers AS s
|
|
LEFT OUTER JOIN Purchasing.SupplierCategories AS sc
|
|
ON s.SupplierCategoryID = sc.SupplierCategoryID
|
|
LEFT OUTER JOIN [Application].People AS pp
|
|
ON s.PrimaryContactPersonID = pp.PersonID
|
|
LEFT OUTER JOIN [Application].People AS ap
|
|
ON s.AlternateContactPersonID = ap.PersonID
|
|
LEFT OUTER JOIN [Application].DeliveryMethods AS dm
|
|
ON s.DeliveryMethodID = dm.DeliveryMethodID
|
|
LEFT OUTER JOIN [Application].Cities AS c
|
|
ON s.DeliveryCityID = c.CityID
|
|
GO
|
|
|
|
DROP VIEW IF EXISTS Website.Customers;
|
|
GO
|
|
|
|
CREATE VIEW Website.Customers
|
|
AS
|
|
SELECT s.CustomerID,
|
|
s.CustomerName,
|
|
sc.CustomerCategoryName,
|
|
pp.FullName AS PrimaryContact,
|
|
ap.FullName AS AlternateContact,
|
|
s.PhoneNumber,
|
|
s.FaxNumber,
|
|
bg.BuyingGroupName,
|
|
s.WebsiteURL,
|
|
dm.DeliveryMethodName AS DeliveryMethod,
|
|
c.CityName AS CityName,
|
|
s.DeliveryLocation AS DeliveryLocation,
|
|
s.DeliveryRun,
|
|
s.RunPosition
|
|
FROM Sales.Customers AS s
|
|
LEFT OUTER JOIN Sales.CustomerCategories AS sc
|
|
ON s.CustomerCategoryID = sc.CustomerCategoryID
|
|
LEFT OUTER JOIN [Application].People AS pp
|
|
ON s.PrimaryContactPersonID = pp.PersonID
|
|
LEFT OUTER JOIN [Application].People AS ap
|
|
ON s.AlternateContactPersonID = ap.PersonID
|
|
LEFT OUTER JOIN Sales.BuyingGroups AS bg
|
|
ON s.BuyingGroupID = bg.BuyingGroupID
|
|
LEFT OUTER JOIN [Application].DeliveryMethods AS dm
|
|
ON s.DeliveryMethodID = dm.DeliveryMethodID
|
|
LEFT OUTER JOIN [Application].Cities AS c
|
|
ON s.DeliveryCityID = c.CityID
|
|
GO
|
|
|
|
DROP VIEW IF EXISTS Website.VehicleTemperatures;
|
|
GO
|
|
|
|
CREATE VIEW Website.VehicleTemperatures
|
|
AS
|
|
SELECT vt.VehicleTemperatureID,
|
|
vt.VehicleRegistration,
|
|
vt.ChillerSensorNumber,
|
|
vt.RecordedWhen,
|
|
vt.Temperature,
|
|
CASE WHEN vt.IsCompressed <> 0
|
|
THEN CAST(DECOMPRESS(vt.CompressedSensorData) AS nvarchar(1000))
|
|
ELSE vt.FullSensorData
|
|
END AS FullSensorData
|
|
FROM Warehouse.VehicleTemperatures AS vt;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_RemoveRowLevelSecurity;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].Configuration_RemoveRowLevelSecurity
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @SQL nvarchar(max);
|
|
|
|
BEGIN TRY;
|
|
|
|
SET @SQL = N'DROP SECURITY POLICY IF EXISTS [Application].FilterCustomersBySalesTerritoryRole;';
|
|
EXECUTE (@SQL);
|
|
|
|
SET @SQL = N'DROP FUNCTION IF EXISTS [Application].DetermineCustomerAccess;';
|
|
EXECUTE (@SQL);
|
|
|
|
PRINT N'Successfully removed row level security';
|
|
END TRY
|
|
BEGIN CATCH
|
|
PRINT N'Unable to remove row level security';
|
|
THROW 51000, N'Unable to remove row level security', 1;
|
|
END CATCH;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS [Application].Configuration_ConfigureForEnterpriseEdition;
|
|
GO
|
|
|
|
CREATE PROCEDURE [Application].[Configuration_ConfigureForEnterpriseEdition]
|
|
AS
|
|
BEGIN
|
|
|
|
EXEC [Application].[Configuration_ApplyColumnstoreIndexing];
|
|
|
|
IF SERVERPROPERTY(N'IsFullTextInstalled') = 0
|
|
BEGIN
|
|
EXEC [Application].[Configuration_ApplyFullTextIndexing];
|
|
END;
|
|
|
|
EXEC [Application].[Configuration_EnableInMemory];
|
|
|
|
EXEC [Application].[Configuration_ApplyPartitioning];
|
|
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetCityUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetCityUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
DECLARE @InitialLoadDate date = '20130101';
|
|
|
|
CREATE TABLE #CityChanges
|
|
(
|
|
[WWI City ID] int,
|
|
City nvarchar(50),
|
|
[State Province] nvarchar(50),
|
|
Country nvarchar(50),
|
|
Continent nvarchar(30),
|
|
[Sales Territory] nvarchar(50),
|
|
Region nvarchar(30),
|
|
Subregion nvarchar(30),
|
|
[Location] geography,
|
|
[Latest Recorded Population] bigint,
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7) NULL
|
|
);
|
|
|
|
DECLARE @CountryID int;
|
|
DECLARE @StateProvinceID int;
|
|
DECLARE @CityID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- first need to find any country changes that have occurred since initial load
|
|
|
|
DECLARE CountryChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT co.CountryID,
|
|
co.ValidFrom
|
|
FROM [Application].Countries_Archive AS co
|
|
WHERE co.ValidFrom > @LastCutoff
|
|
AND co.ValidFrom <= @NewCutoff
|
|
AND co.ValidFrom <> @InitialLoadDate
|
|
UNION ALL
|
|
SELECT co.CountryID,
|
|
co.ValidFrom
|
|
FROM [Application].Countries AS co
|
|
WHERE co.ValidFrom > @LastCutoff
|
|
AND co.ValidFrom <= @NewCutoff
|
|
AND co.ValidFrom <> @InitialLoadDate
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN CountryChangeList;
|
|
FETCH NEXT FROM CountryChangeList INTO @CountryID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #CityChanges
|
|
([WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion,
|
|
[Location], [Latest Recorded Population], [Valid From], [Valid To])
|
|
SELECT c.CityID, c.CityName, sp.StateProvinceName, co.CountryName, co.Continent, sp.SalesTerritory, co.Region, co.Subregion,
|
|
c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL
|
|
FROM [Application].Cities FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
INNER JOIN [Application].StateProvinces FOR SYSTEM_TIME AS OF @ValidFrom AS sp
|
|
ON c.StateProvinceID = sp.StateProvinceID
|
|
INNER JOIN [Application].Countries FOR SYSTEM_TIME AS OF @ValidFrom AS co
|
|
ON sp.CountryID = co.CountryID
|
|
WHERE co.CountryID = @CountryID;
|
|
|
|
FETCH NEXT FROM CountryChangeList INTO @CountryID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE CountryChangeList;
|
|
DEALLOCATE CountryChangeList;
|
|
|
|
-- next need to find any stateprovince changes that have occurred since initial load
|
|
|
|
DECLARE StateProvinceChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT sp.StateProvinceID,
|
|
sp.ValidFrom
|
|
FROM [Application].StateProvinces_Archive AS sp
|
|
WHERE sp.ValidFrom > @LastCutoff
|
|
AND sp.ValidFrom <= @NewCutoff
|
|
AND sp.ValidFrom <> @InitialLoadDate
|
|
UNION ALL
|
|
SELECT sp.StateProvinceID,
|
|
sp.ValidFrom
|
|
FROM [Application].StateProvinces AS sp
|
|
WHERE sp.ValidFrom > @LastCutoff
|
|
AND sp.ValidFrom <= @NewCutoff
|
|
AND sp.ValidFrom <> @InitialLoadDate
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN StateProvinceChangeList;
|
|
FETCH NEXT FROM StateProvinceChangeList INTO @StateProvinceID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #CityChanges
|
|
([WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion,
|
|
[Location], [Latest Recorded Population], [Valid From], [Valid To])
|
|
SELECT c.CityID, c.CityName, sp.StateProvinceName, co.CountryName, co.Continent, sp.SalesTerritory, co.Region, co.Subregion,
|
|
c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL
|
|
FROM [Application].Cities FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
INNER JOIN [Application].StateProvinces FOR SYSTEM_TIME AS OF @ValidFrom AS sp
|
|
ON c.StateProvinceID = sp.StateProvinceID
|
|
INNER JOIN [Application].Countries FOR SYSTEM_TIME AS OF @ValidFrom AS co
|
|
ON sp.CountryID = co.CountryID
|
|
WHERE sp.StateProvinceID = @StateProvinceID;
|
|
|
|
FETCH NEXT FROM StateProvinceChangeList INTO @StateProvinceID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE StateProvinceChangeList;
|
|
DEALLOCATE StateProvinceChangeList;
|
|
|
|
-- finally need to find any city changes that have occurred, including during the initial load
|
|
|
|
DECLARE CityChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT c.CityID,
|
|
c.ValidFrom
|
|
FROM [Application].Cities_Archive AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
UNION ALL
|
|
SELECT c.CityID,
|
|
c.ValidFrom
|
|
FROM [Application].Cities AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN CityChangeList;
|
|
FETCH NEXT FROM CityChangeList INTO @CityID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #CityChanges
|
|
([WWI City ID], City, [State Province], Country, Continent, [Sales Territory], Region, Subregion,
|
|
[Location], [Latest Recorded Population], [Valid From], [Valid To])
|
|
SELECT c.CityID, c.CityName, sp.StateProvinceName, co.CountryName, co.Continent, sp.SalesTerritory, co.Region, co.Subregion,
|
|
c.[Location], COALESCE(c.LatestRecordedPopulation, 0), @ValidFrom, NULL
|
|
FROM [Application].Cities FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
INNER JOIN [Application].StateProvinces FOR SYSTEM_TIME AS OF @ValidFrom AS sp
|
|
ON c.StateProvinceID = sp.StateProvinceID
|
|
INNER JOIN [Application].Countries FOR SYSTEM_TIME AS OF @ValidFrom AS co
|
|
ON sp.CountryID = co.CountryID
|
|
WHERE c.CityID = @CityID;
|
|
|
|
FETCH NEXT FROM CityChangeList INTO @CityID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE CityChangeList;
|
|
DEALLOCATE CityChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_CityChanges ON #CityChanges ([WWI City ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same city but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #CityChanges AS cc2
|
|
WHERE cc2.[WWI City ID] = cc.[WWI City ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #CityChanges AS cc;
|
|
|
|
SELECT [WWI City ID], City, [State Province], Country, Continent, [Sales Territory],
|
|
Region, Subregion, [Location] geography, [Latest Recorded Population], [Valid From],
|
|
[Valid To]
|
|
FROM #CityChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #CityChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetCustomerUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetCustomerUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
DECLARE @InitialLoadDate date = '20130101';
|
|
|
|
CREATE TABLE #CustomerChanges
|
|
(
|
|
[WWI Customer ID] int,
|
|
Customer nvarchar(100),
|
|
[Bill To Customer] nvarchar(100),
|
|
Category nvarchar(50),
|
|
[Buying Group] nvarchar(50),
|
|
[Primary Contact] nvarchar(50),
|
|
[Postal Code] nvarchar(10),
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7) NULL
|
|
);
|
|
|
|
DECLARE @BuyingGroupID int;
|
|
DECLARE @CustomerCategoryID int;
|
|
DECLARE @CustomerID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- first need to find any buying group changes that have occurred since initial load
|
|
|
|
DECLARE BuyingGroupChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT bg.BuyingGroupID,
|
|
bg.ValidFrom
|
|
FROM Sales.BuyingGroups_Archive AS bg
|
|
WHERE bg.ValidFrom > @LastCutoff
|
|
AND bg.ValidFrom <= @NewCutoff
|
|
AND bg.ValidFrom <> @InitialLoadDate
|
|
UNION ALL
|
|
SELECT bg.BuyingGroupID,
|
|
bg.ValidFrom
|
|
FROM Sales.BuyingGroups AS bg
|
|
WHERE bg.ValidFrom > @LastCutoff
|
|
AND bg.ValidFrom <= @NewCutoff
|
|
AND bg.ValidFrom <> @InitialLoadDate
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN BuyingGroupChangeList;
|
|
FETCH NEXT FROM BuyingGroupChangeList INTO @BuyingGroupID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #CustomerChanges
|
|
([WWI Customer ID], Customer, [Bill To Customer], Category,
|
|
[Buying Group], [Primary Contact], [Postal Code],
|
|
[Valid From], [Valid To])
|
|
SELECT c.CustomerID, c.CustomerName, bt.CustomerName, cc.CustomerCategoryName,
|
|
bg.BuyingGroupName, p.FullName, c.DeliveryPostalCode,
|
|
c.ValidFrom, c.ValidTo
|
|
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
INNER JOIN Sales.BuyingGroups FOR SYSTEM_TIME AS OF @ValidFrom AS bg
|
|
ON c.BuyingGroupID = bg.BuyingGroupID
|
|
INNER JOIN Sales.CustomerCategories FOR SYSTEM_TIME AS OF @ValidFrom AS cc
|
|
ON c.CustomerCategoryID = cc.CustomerCategoryID
|
|
INNER JOIN Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS bt
|
|
ON c.BillToCustomerID = bt.CustomerID
|
|
INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
WHERE c.BuyingGroupID = @BuyingGroupID;
|
|
|
|
FETCH NEXT FROM BuyingGroupChangeList INTO @BuyingGroupID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE BuyingGroupChangeList;
|
|
DEALLOCATE BuyingGroupChangeList;
|
|
|
|
-- next need to find any customer category changes that have occurred since initial load
|
|
|
|
DECLARE CustomerCategoryChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT cc.CustomerCategoryID,
|
|
cc.ValidFrom
|
|
FROM Sales.CustomerCategories_Archive AS cc
|
|
WHERE cc.ValidFrom > @LastCutoff
|
|
AND cc.ValidFrom <= @NewCutoff
|
|
AND cc.ValidFrom <> @InitialLoadDate
|
|
UNION ALL
|
|
SELECT cc.CustomerCategoryID,
|
|
cc.ValidFrom
|
|
FROM Sales.CustomerCategories AS cc
|
|
WHERE cc.ValidFrom > @LastCutoff
|
|
AND cc.ValidFrom <= @NewCutoff
|
|
AND cc.ValidFrom <> @InitialLoadDate
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN CustomerCategoryChangeList;
|
|
FETCH NEXT FROM CustomerCategoryChangeList INTO @CustomerCategoryID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #CustomerChanges
|
|
([WWI Customer ID], Customer, [Bill To Customer], Category,
|
|
[Buying Group], [Primary Contact], [Postal Code],
|
|
[Valid From], [Valid To])
|
|
SELECT c.CustomerID, c.CustomerName, bt.CustomerName, cc.CustomerCategoryName,
|
|
bg.BuyingGroupName, p.FullName, c.DeliveryPostalCode,
|
|
c.ValidFrom, c.ValidTo
|
|
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
INNER JOIN Sales.BuyingGroups FOR SYSTEM_TIME AS OF @ValidFrom AS bg
|
|
ON c.BuyingGroupID = bg.BuyingGroupID
|
|
INNER JOIN Sales.CustomerCategories FOR SYSTEM_TIME AS OF @ValidFrom AS cc
|
|
ON c.CustomerCategoryID = cc.CustomerCategoryID
|
|
INNER JOIN Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS bt
|
|
ON c.BillToCustomerID = bt.CustomerID
|
|
INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
WHERE cc.CustomerCategoryID = @CustomerCategoryID;
|
|
|
|
FETCH NEXT FROM CustomerCategoryChangeList INTO @CustomerCategoryID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE CustomerCategoryChangeList;
|
|
DEALLOCATE CustomerCategoryChangeList;
|
|
|
|
-- finally need to find any customer changes that have occurred, including during the initial load
|
|
|
|
DECLARE CustomerChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT c.CustomerID,
|
|
c.ValidFrom
|
|
FROM Sales.Customers_Archive AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
UNION ALL
|
|
SELECT c.CustomerID,
|
|
c.ValidFrom
|
|
FROM Sales.Customers AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN CustomerChangeList;
|
|
FETCH NEXT FROM CustomerChangeList INTO @CustomerID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #CustomerChanges
|
|
([WWI Customer ID], Customer, [Bill To Customer], Category,
|
|
[Buying Group], [Primary Contact], [Postal Code],
|
|
[Valid From], [Valid To])
|
|
SELECT c.CustomerID, c.CustomerName, bt.CustomerName, cc.CustomerCategoryName,
|
|
bg.BuyingGroupName, p.FullName, c.DeliveryPostalCode,
|
|
c.ValidFrom, c.ValidTo
|
|
FROM Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
INNER JOIN Sales.BuyingGroups FOR SYSTEM_TIME AS OF @ValidFrom AS bg
|
|
ON c.BuyingGroupID = bg.BuyingGroupID
|
|
INNER JOIN Sales.CustomerCategories FOR SYSTEM_TIME AS OF @ValidFrom AS cc
|
|
ON c.CustomerCategoryID = cc.CustomerCategoryID
|
|
INNER JOIN Sales.Customers FOR SYSTEM_TIME AS OF @ValidFrom AS bt
|
|
ON c.BillToCustomerID = bt.CustomerID
|
|
INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
ON c.PrimaryContactPersonID = p.PersonID
|
|
WHERE c.CustomerID = @CustomerID;
|
|
|
|
FETCH NEXT FROM CustomerChangeList INTO @CustomerID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE CustomerChangeList;
|
|
DEALLOCATE CustomerChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_CustomerChanges ON #CustomerChanges ([WWI Customer ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same customer but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #CustomerChanges AS cc2
|
|
WHERE cc2.[WWI Customer ID] = cc.[WWI Customer ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #CustomerChanges AS cc;
|
|
|
|
SELECT [WWI Customer ID], Customer, [Bill To Customer], Category,
|
|
[Buying Group], [Primary Contact], [Postal Code],
|
|
[Valid From], [Valid To]
|
|
FROM #CustomerChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #CustomerChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetEmployeeUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetEmployeeUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
|
|
CREATE TABLE #EmployeeChanges
|
|
(
|
|
[WWI Employee ID] int,
|
|
Employee nvarchar(50),
|
|
[Preferred Name] nvarchar(50),
|
|
[Is Salesperson] bit,
|
|
Photo varbinary(max),
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7)
|
|
);
|
|
|
|
DECLARE @PersonID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- need to find any employee changes that have occurred, including during the initial load
|
|
|
|
DECLARE EmployeeChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT p.PersonID,
|
|
p.ValidFrom
|
|
FROM [Application].People_Archive AS p
|
|
WHERE p.ValidFrom > @LastCutoff
|
|
AND p.ValidFrom <= @NewCutoff
|
|
AND p.IsEmployee <> 0
|
|
UNION ALL
|
|
SELECT p.PersonID,
|
|
p.ValidFrom
|
|
FROM [Application].People AS p
|
|
WHERE p.ValidFrom > @LastCutoff
|
|
AND p.ValidFrom <= @NewCutoff
|
|
AND p.IsEmployee <> 0
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN EmployeeChangeList;
|
|
FETCH NEXT FROM EmployeeChangeList INTO @PersonID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #EmployeeChanges
|
|
([WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo,
|
|
[Valid From], [Valid To])
|
|
SELECT p.PersonID, p.FullName, p.PreferredName, p.IsSalesperson, p.Photo,
|
|
p.ValidFrom, p.ValidTo
|
|
FROM [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
WHERE p.PersonID = @PersonID;
|
|
|
|
FETCH NEXT FROM EmployeeChangeList INTO @PersonID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE EmployeeChangeList;
|
|
DEALLOCATE EmployeeChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_EmployeeChanges ON #EmployeeChanges ([WWI Employee ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same entry but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #EmployeeChanges AS cc2
|
|
WHERE cc2.[WWI Employee ID] = cc.[WWI Employee ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #EmployeeChanges AS cc;
|
|
|
|
SELECT [WWI Employee ID], Employee, [Preferred Name], [Is Salesperson], Photo,
|
|
[Valid From], [Valid To]
|
|
FROM #EmployeeChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #EmployeeChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetPaymentMethodUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetPaymentMethodUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
|
|
CREATE TABLE #PaymentMethodChanges
|
|
(
|
|
[WWI Payment Method ID] int,
|
|
[Payment Method] nvarchar(50),
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7)
|
|
);
|
|
|
|
DECLARE @PaymentMethodID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- need to find any payment method changes that have occurred, including during the initial load
|
|
|
|
DECLARE ChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT p.PaymentMethodID,
|
|
p.ValidFrom
|
|
FROM [Application].PaymentMethods_Archive AS p
|
|
WHERE p.ValidFrom > @LastCutoff
|
|
AND p.ValidFrom <= @NewCutoff
|
|
UNION ALL
|
|
SELECT p.PaymentMethodID,
|
|
p.ValidFrom
|
|
FROM [Application].PaymentMethods AS p
|
|
WHERE p.ValidFrom > @LastCutoff
|
|
AND p.ValidFrom <= @NewCutoff
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN ChangeList;
|
|
FETCH NEXT FROM ChangeList INTO @PaymentMethodID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #PaymentMethodChanges
|
|
([WWI Payment Method ID], [Payment Method], [Valid From], [Valid To])
|
|
SELECT p.PaymentMethodID, p.PaymentMethodName, p.ValidFrom, p.ValidTo
|
|
FROM [Application].PaymentMethods FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
WHERE p.PaymentMethodID = @PaymentMethodID;
|
|
|
|
FETCH NEXT FROM ChangeList INTO @PaymentMethodID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE ChangeList;
|
|
DEALLOCATE ChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_PaymentMethodChanges ON #PaymentMethodChanges ([WWI Payment Method ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same entry but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #PaymentMethodChanges AS cc2
|
|
WHERE cc2.[WWI Payment Method ID] = cc.[WWI Payment Method ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #PaymentMethodChanges AS cc;
|
|
|
|
SELECT [WWI Payment Method ID], [Payment Method], [Valid From], [Valid To]
|
|
FROM #PaymentMethodChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #PaymentMethodChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetStockItemUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetStockItemUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
|
|
CREATE TABLE #StockItemChanges
|
|
(
|
|
[WWI Stock Item ID] int,
|
|
[Stock Item] nvarchar(100),
|
|
Color nvarchar(20),
|
|
[Selling Package] nvarchar(50),
|
|
[Buying Package] nvarchar(50),
|
|
Brand nvarchar(50),
|
|
Size nvarchar(20),
|
|
[Lead Time Days] int,
|
|
[Quantity Per Outer] int,
|
|
[Is Chiller Stock] bit,
|
|
Barcode nvarchar(50),
|
|
[Tax Rate] decimal(18,3),
|
|
[Unit Price] decimal(18,2),
|
|
[Recommended Retail Price] decimal(18,2),
|
|
[Typical Weight Per Unit] decimal(18,3),
|
|
Photo varbinary(max),
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7)
|
|
);
|
|
|
|
DECLARE @StockItemID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- need to find any StockItem changes that have occurred, including during the initial load
|
|
|
|
DECLARE StockItemChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT c.StockItemID,
|
|
c.ValidFrom
|
|
FROM Warehouse.StockItems_Archive AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
UNION ALL
|
|
SELECT c.StockItemID,
|
|
c.ValidFrom
|
|
FROM Warehouse.StockItems AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN StockItemChangeList;
|
|
FETCH NEXT FROM StockItemChangeList INTO @StockItemID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #StockItemChanges
|
|
([WWI Stock Item ID], [Stock Item], Color, [Selling Package],
|
|
[Buying Package], Brand, Size, [Lead Time Days], [Quantity Per Outer],
|
|
[Is Chiller Stock], Barcode, [Tax Rate], [Unit Price], [Recommended Retail Price],
|
|
[Typical Weight Per Unit], Photo, [Valid From], [Valid To])
|
|
SELECT si.StockItemID, si.StockItemName, c.ColorName, spt.PackageTypeName,
|
|
bpt.PackageTypeName, si.Brand, si.Size, si.LeadTimeDays, si.QuantityPerOuter,
|
|
si.IsChillerStock, si.Barcode, si.LeadTimeDays, si.UnitPrice, si.RecommendedRetailPrice,
|
|
si.TypicalWeightPerUnit, si.Photo, si.ValidFrom, si.ValidTo
|
|
FROM Warehouse.StockItems FOR SYSTEM_TIME AS OF @ValidFrom AS si
|
|
INNER JOIN Warehouse.PackageTypes FOR SYSTEM_TIME AS OF @ValidFrom AS spt
|
|
ON si.UnitPackageID = spt.PackageTypeID
|
|
INNER JOIN Warehouse.PackageTypes FOR SYSTEM_TIME AS OF @ValidFrom AS bpt
|
|
ON si.OuterPackageID = bpt.PackageTypeID
|
|
LEFT OUTER JOIN Warehouse.Colors FOR SYSTEM_TIME AS OF @ValidFrom AS c
|
|
ON si.ColorID = c.ColorID
|
|
WHERE si.StockItemID = @StockItemID;
|
|
|
|
FETCH NEXT FROM StockItemChangeList INTO @StockItemID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE StockItemChangeList;
|
|
DEALLOCATE StockItemChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_StockItemChanges ON #StockItemChanges ([WWI Stock Item ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same StockItem but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #StockItemChanges AS cc2
|
|
WHERE cc2.[WWI Stock Item ID] = cc.[WWI Stock Item ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #StockItemChanges AS cc;
|
|
|
|
SELECT [WWI Stock Item ID], [Stock Item],
|
|
ISNULL(Color, N'N/A') AS Color,
|
|
[Selling Package], [Buying Package],
|
|
ISNULL(Brand, N'N/A') AS Brand,
|
|
ISNULL(Size, N'N/A') AS Size,
|
|
[Lead Time Days], [Quantity Per Outer], [Is Chiller Stock],
|
|
ISNULL(Barcode, N'N/A') AS Barcode,
|
|
[Tax Rate], [Unit Price], [Recommended Retail Price], [Typical Weight Per Unit],
|
|
Photo, [Valid From], [Valid To]
|
|
FROM #StockItemChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #StockItemChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetSupplierUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetSupplierUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
DECLARE @InitialLoadDate date = '20130101';
|
|
|
|
CREATE TABLE #SupplierChanges
|
|
(
|
|
[WWI Supplier ID] int,
|
|
Supplier nvarchar(100),
|
|
Category nvarchar(50),
|
|
[Primary Contact] nvarchar(50),
|
|
[Supplier Reference] nvarchar(20),
|
|
[Payment Days] int,
|
|
[Postal Code] nvarchar(10),
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7)
|
|
);
|
|
|
|
DECLARE @SupplierCategoryID int;
|
|
DECLARE @SupplierID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- need to find any Supplier category changes that have occurred since initial load
|
|
|
|
DECLARE SupplierCategoryChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT cc.SupplierCategoryID,
|
|
cc.ValidFrom
|
|
FROM Purchasing.SupplierCategories_Archive AS cc
|
|
WHERE cc.ValidFrom > @LastCutoff
|
|
AND cc.ValidFrom <= @NewCutoff
|
|
AND cc.ValidFrom <> @InitialLoadDate
|
|
UNION ALL
|
|
SELECT cc.SupplierCategoryID,
|
|
cc.ValidFrom
|
|
FROM Purchasing.SupplierCategories AS cc
|
|
WHERE cc.ValidFrom > @LastCutoff
|
|
AND cc.ValidFrom <= @NewCutoff
|
|
AND cc.ValidFrom <> @InitialLoadDate
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN SupplierCategoryChangeList;
|
|
FETCH NEXT FROM SupplierCategoryChangeList INTO @SupplierCategoryID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #SupplierChanges
|
|
([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference],
|
|
[Payment Days], [Postal Code], [Valid From], [Valid To])
|
|
SELECT s.SupplierID, s.SupplierName, sc.SupplierCategoryName, p.FullName, s.SupplierReference,
|
|
s.PaymentDays, s.DeliveryPostalCode, s.ValidFrom, s.ValidTo
|
|
FROM Purchasing.Suppliers FOR SYSTEM_TIME AS OF @ValidFrom AS s
|
|
INNER JOIN Purchasing.SupplierCategories FOR SYSTEM_TIME AS OF @ValidFrom AS sc
|
|
ON s.SupplierCategoryID = sc.SupplierCategoryID
|
|
INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
ON s.PrimaryContactPersonID = p.PersonID
|
|
WHERE sc.SupplierCategoryID = @SupplierCategoryID;
|
|
|
|
FETCH NEXT FROM SupplierCategoryChangeList INTO @SupplierCategoryID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE SupplierCategoryChangeList;
|
|
DEALLOCATE SupplierCategoryChangeList;
|
|
|
|
-- finally need to find any Supplier changes that have occurred, including during the initial load
|
|
|
|
DECLARE SupplierChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT c.SupplierID,
|
|
c.ValidFrom
|
|
FROM Purchasing.Suppliers_Archive AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
UNION ALL
|
|
SELECT c.SupplierID,
|
|
c.ValidFrom
|
|
FROM Purchasing.Suppliers AS c
|
|
WHERE c.ValidFrom > @LastCutoff
|
|
AND c.ValidFrom <= @NewCutoff
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN SupplierChangeList;
|
|
FETCH NEXT FROM SupplierChangeList INTO @SupplierID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #SupplierChanges
|
|
([WWI Supplier ID], Supplier, Category, [Primary Contact], [Supplier Reference],
|
|
[Payment Days], [Postal Code], [Valid From], [Valid To])
|
|
SELECT s.SupplierID, s.SupplierName, sc.SupplierCategoryName, p.FullName, s.SupplierReference,
|
|
s.PaymentDays, s.DeliveryPostalCode, s.ValidFrom, s.ValidTo
|
|
FROM Purchasing.Suppliers FOR SYSTEM_TIME AS OF @ValidFrom AS s
|
|
INNER JOIN Purchasing.SupplierCategories FOR SYSTEM_TIME AS OF @ValidFrom AS sc
|
|
ON s.SupplierCategoryID = sc.SupplierCategoryID
|
|
INNER JOIN [Application].People FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
ON s.PrimaryContactPersonID = p.PersonID
|
|
WHERE s.SupplierID = @SupplierID;
|
|
|
|
FETCH NEXT FROM SupplierChangeList INTO @SupplierID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE SupplierChangeList;
|
|
DEALLOCATE SupplierChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_SupplierChanges ON #SupplierChanges ([WWI Supplier ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same Supplier but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #SupplierChanges AS cc2
|
|
WHERE cc2.[WWI Supplier ID] = cc.[WWI Supplier ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #SupplierChanges AS cc;
|
|
|
|
SELECT [WWI Supplier ID], Supplier, Category, [Primary Contact],
|
|
[Supplier Reference], [Payment Days], [Postal Code],
|
|
[Valid From], [Valid To]
|
|
FROM #SupplierChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #SupplierChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetTransactionTypeUpdates
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetTransactionTypeUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
DECLARE @EndOfTime datetime2(7) = '99991231 23:59:59.9999999';
|
|
|
|
CREATE TABLE #TransactionTypeChanges
|
|
(
|
|
[WWI Transaction Type ID] int,
|
|
[Transaction Type] nvarchar(50),
|
|
[Valid From] datetime2(7),
|
|
[Valid To] datetime2(7)
|
|
);
|
|
|
|
DECLARE @TransactionTypeID int;
|
|
DECLARE @ValidFrom datetime2(7);
|
|
|
|
-- need to find any Transaction Type changes that have occurred, including during the initial load
|
|
|
|
DECLARE ChangeList CURSOR FAST_FORWARD READ_ONLY
|
|
FOR
|
|
SELECT tt.TransactionTypeID,
|
|
tt.ValidFrom
|
|
FROM [Application].TransactionTypes_Archive AS tt
|
|
WHERE tt.ValidFrom > @LastCutoff
|
|
AND tt.ValidFrom <= @NewCutoff
|
|
UNION ALL
|
|
SELECT tt.TransactionTypeID,
|
|
tt.ValidFrom
|
|
FROM [Application].TransactionTypes AS tt
|
|
WHERE tt.ValidFrom > @LastCutoff
|
|
AND tt.ValidFrom <= @NewCutoff
|
|
ORDER BY ValidFrom;
|
|
|
|
OPEN ChangeList;
|
|
FETCH NEXT FROM ChangeList INTO @TransactionTypeID, @ValidFrom;
|
|
|
|
WHILE @@FETCH_STATUS = 0
|
|
BEGIN
|
|
INSERT #TransactionTypeChanges
|
|
([WWI Transaction Type ID], [Transaction Type], [Valid From], [Valid To])
|
|
SELECT p.TransactionTypeID, p.TransactionTypeName, p.ValidFrom, p.ValidTo
|
|
FROM [Application].TransactionTypes FOR SYSTEM_TIME AS OF @ValidFrom AS p
|
|
WHERE p.TransactionTypeID = @TransactionTypeID;
|
|
|
|
FETCH NEXT FROM ChangeList INTO @TransactionTypeID, @ValidFrom;
|
|
END;
|
|
|
|
CLOSE ChangeList;
|
|
DEALLOCATE ChangeList;
|
|
|
|
-- add an index to make lookups faster
|
|
|
|
CREATE INDEX IX_TransactionTypeChanges ON #TransactionTypeChanges ([WWI Transaction Type ID], [Valid From]);
|
|
|
|
-- work out the [Valid To] value by taking the [Valid From] of any row that's for the same entry but later
|
|
-- otherwise take the end of time
|
|
|
|
UPDATE cc
|
|
SET [Valid To] = COALESCE((SELECT MIN([Valid From]) FROM #TransactionTypeChanges AS cc2
|
|
WHERE cc2.[WWI Transaction Type ID] = cc.[WWI Transaction Type ID]
|
|
AND cc2.[Valid From] > cc.[Valid From]), @EndOfTime)
|
|
FROM #TransactionTypeChanges AS cc;
|
|
|
|
SELECT [WWI Transaction Type ID], [Transaction Type], [Valid From], [Valid To]
|
|
FROM #TransactionTypeChanges
|
|
ORDER BY [Valid From];
|
|
|
|
DROP TABLE #TransactionTypeChanges;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetMovementUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetMovementUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
SELECT CAST(sit.TransactionOccurredWhen AS date) AS [Date Key],
|
|
sit.StockItemTransactionID AS [WWI Stock Item Transaction ID],
|
|
sit.InvoiceID AS [WWI Invoice ID],
|
|
sit.PurchaseOrderID AS [WWI Purchase Order ID],
|
|
CAST(sit.Quantity AS int) AS Quantity,
|
|
sit.StockItemID AS [WWI Stock Item ID],
|
|
sit.CustomerID AS [WWI Customer ID],
|
|
sit.SupplierID AS [WWI Supplier ID],
|
|
sit.TransactionTypeID AS [WWI Transaction Type ID],
|
|
sit.TransactionOccurredWhen AS [Transaction Occurred When]
|
|
FROM Warehouse.StockItemTransactions AS sit
|
|
WHERE sit.LastEditedWhen > @LastCutoff
|
|
AND sit.LastEditedWhen <= @NewCutoff
|
|
ORDER BY sit.StockItemTransactionID;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetOrderUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetOrderUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
|
|
SELECT CAST(o.OrderDate AS date) AS [Order Date Key],
|
|
CAST(ol.PickingCompletedWhen AS date) AS [Picked Date Key],
|
|
o.OrderID AS [WWI Order ID],
|
|
o.BackorderOrderID AS [WWI Backorder ID],
|
|
ol.[Description],
|
|
pt.PackageTypeName AS Package,
|
|
ol.Quantity AS Quantity,
|
|
ol.UnitPrice AS [Unit Price],
|
|
ol.TaxRate AS [Tax Rate],
|
|
ROUND(ol.Quantity * ol.UnitPrice, 2) AS [Total Excluding Tax],
|
|
ROUND(ol.Quantity * ol.UnitPrice * ol.TaxRate / 100.0, 2) AS [Tax Amount],
|
|
ROUND(ol.Quantity * ol.UnitPrice, 2) + ROUND(ol.Quantity * ol.UnitPrice * ol.TaxRate / 100.0, 2) AS [Total Including Tax],
|
|
c.DeliveryCityID AS [WWI City ID],
|
|
c.CustomerID AS [WWI Customer ID],
|
|
ol.StockItemID AS [WWI Stock Item ID],
|
|
o.SalespersonPersonID AS [WWI Salesperson ID],
|
|
o.PickedByPersonID AS [WWI Picker ID],
|
|
CASE WHEN ol.LastEditedWhen > o.LastEditedWhen THEN ol.LastEditedWhen ELSE o.LastEditedWhen END AS [Last Modified When]
|
|
FROM Sales.Orders AS o
|
|
INNER JOIN Sales.OrderLines AS ol
|
|
ON o.OrderID = ol.OrderID
|
|
INNER JOIN Warehouse.PackageTypes AS pt
|
|
ON ol.PackageTypeID = pt.PackageTypeID
|
|
INNER JOIN Sales.Customers AS c
|
|
ON c.CustomerID = o.CustomerID
|
|
WHERE CASE WHEN ol.LastEditedWhen > o.LastEditedWhen THEN ol.LastEditedWhen ELSE o.LastEditedWhen END > @LastCutoff
|
|
AND CASE WHEN ol.LastEditedWhen > o.LastEditedWhen THEN ol.LastEditedWhen ELSE o.LastEditedWhen END <= @NewCutoff
|
|
ORDER BY o.OrderID;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetPurchaseUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetPurchaseUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
|
|
SELECT CAST(po.OrderDate AS date) AS [Date Key],
|
|
po.PurchaseOrderID AS [WWI Purchase Order ID],
|
|
pol.OrderedOuters AS [Ordered Outers],
|
|
pol.OrderedOuters * si.QuantityPerOuter AS [Ordered Quantity],
|
|
pol.ReceivedOuters AS [Received Outers],
|
|
pt.PackageTypeName AS Package,
|
|
pol.IsOrderLineFinalized AS [Is Order Finalized],
|
|
po.SupplierID AS [WWI Supplier ID],
|
|
pol.StockItemID AS [WWI Stock Item ID],
|
|
CASE WHEN pol.LastEditedWhen > po.LastEditedWhen THEN pol.LastEditedWhen ELSE po.LastEditedWhen END AS [Last Modified When]
|
|
FROM Purchasing.PurchaseOrders AS po
|
|
INNER JOIN Purchasing.PurchaseOrderLines AS pol
|
|
ON po.PurchaseOrderID = pol.PurchaseOrderID
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON pol.StockItemID = si.StockItemID
|
|
INNER JOIN Warehouse.PackageTypes AS pt
|
|
ON pol.PackageTypeID = pt.PackageTypeID
|
|
WHERE CASE WHEN pol.LastEditedWhen > po.LastEditedWhen THEN pol.LastEditedWhen ELSE po.LastEditedWhen END > @LastCutoff
|
|
AND CASE WHEN pol.LastEditedWhen > po.LastEditedWhen THEN pol.LastEditedWhen ELSE po.LastEditedWhen END <= @NewCutoff
|
|
ORDER BY po.PurchaseOrderID;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetSaleUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetSaleUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
SELECT CAST(i.InvoiceDate AS date) AS [Invoice Date Key],
|
|
CAST(i.ConfirmedDeliveryTime AS date) AS [Delivery Date Key],
|
|
i.InvoiceID AS [WWI Invoice ID],
|
|
il.[Description],
|
|
pt.PackageTypeName AS Package,
|
|
il.Quantity,
|
|
il.UnitPrice AS [Unit Price],
|
|
il.TaxRate AS [Tax Rate],
|
|
il.ExtendedPrice - il.TaxAmount AS [Total Excluding Tax],
|
|
il.TaxAmount AS [Tax Amount],
|
|
il.LineProfit AS Profit,
|
|
il.ExtendedPrice AS [Total Including Tax],
|
|
CASE WHEN si.IsChillerStock = 0 THEN il.Quantity ELSE 0 END AS [Total Dry Items],
|
|
CASE WHEN si.IsChillerStock <> 0 THEN il.Quantity ELSE 0 END AS [Total Chiller Items],
|
|
c.DeliveryCityID AS [WWI City ID],
|
|
i.CustomerID AS [WWI Customer ID],
|
|
i.BillToCustomerID AS [WWI Bill To Customer ID],
|
|
il.StockItemID AS [WWI Stock Item ID],
|
|
i.SalespersonPersonID AS [WWI Saleperson ID],
|
|
CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END AS [Last Modified When]
|
|
FROM Sales.Invoices AS i
|
|
INNER JOIN Sales.InvoiceLines AS il
|
|
ON i.InvoiceID = il.InvoiceID
|
|
INNER JOIN Warehouse.StockItems AS si
|
|
ON il.StockItemID = si.StockItemID
|
|
INNER JOIN Warehouse.PackageTypes AS pt
|
|
ON il.PackageTypeID = pt.PackageTypeID
|
|
INNER JOIN Sales.Customers AS c
|
|
ON i.CustomerID = c.CustomerID
|
|
INNER JOIN Sales.Customers AS bt
|
|
ON i.BillToCustomerID = bt.CustomerID
|
|
WHERE CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END > @LastCutoff
|
|
AND CASE WHEN il.LastEditedWhen > i.LastEditedWhen THEN il.LastEditedWhen ELSE i.LastEditedWhen END <= @NewCutoff
|
|
ORDER BY i.InvoiceID, il.InvoiceLineID;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetStockHoldingUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetStockHoldingUpdates
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
SELECT sih.QuantityOnHand AS [Quantity On Hand],
|
|
sih.BinLocation AS [Bin Location],
|
|
sih.LastStocktakeQuantity AS [Last Stocktake Quantity],
|
|
sih.LastCostPrice AS [Last Cost Price],
|
|
sih.ReorderLevel AS [Reorder Level],
|
|
sih.TargetStockLevel AS [Target Stock Level],
|
|
sih.StockItemID AS [WWI Stock Item ID]
|
|
FROM Warehouse.StockItemHoldings AS sih
|
|
ORDER BY sih.StockItemID;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
DROP PROCEDURE IF EXISTS Integration.GetTransactionUpdates;
|
|
GO
|
|
|
|
CREATE PROCEDURE Integration.GetTransactionUpdates
|
|
@LastCutoff datetime2(7),
|
|
@NewCutoff datetime2(7)
|
|
WITH EXECUTE AS OWNER
|
|
AS
|
|
BEGIN
|
|
SET NOCOUNT ON;
|
|
SET XACT_ABORT ON;
|
|
|
|
SELECT CAST(ct.TransactionDate AS date) AS [Date Key],
|
|
ct.CustomerTransactionID AS [WWI Customer Transaction ID],
|
|
CAST(NULL AS int) AS [WWI Supplier Transaction ID],
|
|
ct.InvoiceID AS [WWI Invoice ID],
|
|
CAST(NULL AS int) AS [WWI Purchase Order ID],
|
|
CAST(NULL AS nvarchar(20)) AS [Supplier Invoice Number],
|
|
ct.AmountExcludingTax AS [Total Excluding Tax],
|
|
ct.TaxAmount AS [Tax Amount],
|
|
ct.TransactionAmount AS [Total Including Tax],
|
|
ct.OutstandingBalance AS [Outstanding Balance],
|
|
ct.IsFinalized AS [Is Finalized],
|
|
COALESCE(i.CustomerID, ct.CustomerID) AS [WWI Customer ID],
|
|
ct.CustomerID AS [WWI Bill To Customer ID],
|
|
CAST(NULL AS int) AS [WWI Supplier ID],
|
|
ct.TransactionTypeID AS [WWI Transaction Type ID],
|
|
ct.PaymentMethodID AS [WWI Payment Method ID],
|
|
ct.LastEditedWhen AS [Last Modified When]
|
|
FROM Sales.CustomerTransactions AS ct
|
|
LEFT OUTER JOIN Sales.Invoices AS i
|
|
ON ct.InvoiceID = i.InvoiceID
|
|
WHERE ct.LastEditedWhen > @LastCutoff
|
|
AND ct.LastEditedWhen <= @NewCutoff
|
|
|
|
UNION ALL
|
|
|
|
SELECT CAST(st.TransactionDate AS date) AS [Date Key],
|
|
CAST(NULL AS int) AS [WWI Customer Transaction ID],
|
|
st.SupplierTransactionID AS [WWI Supplier Transaction ID],
|
|
CAST(NULL AS int) AS [WWI Invoice ID],
|
|
st.PurchaseOrderID AS [WWI Purchase Order ID],
|
|
st.SupplierInvoiceNumber AS [Supplier Invoice Number],
|
|
st.AmountExcludingTax AS [Total Excluding Tax],
|
|
st.TaxAmount AS [Tax Amount],
|
|
st.TransactionAmount AS [Total Including Tax],
|
|
st.OutstandingBalance AS [Outstanding Balance],
|
|
st.IsFinalized AS [Is Finalized],
|
|
CAST(NULL AS int) AS [WWI Customer ID],
|
|
CAST(NULL AS int) AS [WWI Bill To Customer ID],
|
|
st.SupplierID AS [WWI Supplier ID],
|
|
st.TransactionTypeID AS [WWI Transaction Type ID],
|
|
st.PaymentMethodID AS [WWI Payment Method ID],
|
|
st.LastEditedWhen AS [Last Modified When]
|
|
FROM Purchasing.SupplierTransactions AS st
|
|
WHERE st.LastEditedWhen > @LastCutoff
|
|
AND st.LastEditedWhen <= @NewCutoff;
|
|
|
|
RETURN 0;
|
|
END;
|
|
GO
|
|
|
|
/*
|
|
|
|
-- initial data population to ship date
|
|
|
|
EXEC WideWorldImporters.DataLoadSimulation.Configuration_ApplyDataLoadSimulationProcedures;
|
|
EXEC WideWorldImporters.DataLoadSimulation.DailyProcessToCreateHistory
|
|
@StartDate = '20130101',
|
|
@EndDate = '20160331',
|
|
@AverageNumberOfCustomerOrdersPerDay = 60,
|
|
@SaturdayPercentageOfNormalWorkDay = 50,
|
|
@SundayPercentageOfNormalWorkDay = 0,
|
|
@UpdateCustomFields = 1,
|
|
@IsSilentMode = 1,
|
|
@AreDatesPrinted = 1;
|
|
EXEC WideWorldImporters.DataLoadSimulation.Configuration_RemoveDataLoadSimulationProcedures;
|
|
|
|
-- roll data up to current date
|
|
|
|
EXEC WideWorldImporters.DataLoadSimulation.PopulateDataToCurrentDate
|
|
@AverageNumberOfCustomerOrdersPerDay = 60,
|
|
@SaturdayPercentageOfNormalWorkDay = 50,
|
|
@SundayPercentageOfNormalWorkDay = 0,
|
|
@IsSilentMode = 1,
|
|
@AreDatesPrinted = 1;
|
|
|
|
*/
|