mdan-cli 2.5.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +76 -1
- package/README.md +274 -4
- package/agents/auto-orchestrator.md +343 -0
- package/agents/devops.md +511 -94
- package/cli/mdan.py +111 -6
- package/cli/mdan_crewai.py +539 -0
- package/core/crewai_orchestrator.md +419 -0
- package/core/debate-protocol.md +454 -0
- package/core/universal-envelope.md +113 -0
- package/integrations/__init__.py +33 -0
- package/integrations/crewai/__init__.py +27 -0
- package/integrations/crewai/agents/__init__.py +21 -0
- package/integrations/crewai/agents/architect_agent.py +264 -0
- package/integrations/crewai/agents/dev_agent.py +271 -0
- package/integrations/crewai/agents/devops_agent.py +421 -0
- package/integrations/crewai/agents/doc_agent.py +388 -0
- package/integrations/crewai/agents/product_agent.py +203 -0
- package/integrations/crewai/agents/security_agent.py +386 -0
- package/integrations/crewai/agents/test_agent.py +358 -0
- package/integrations/crewai/agents/ux_agent.py +257 -0
- package/integrations/crewai/flows/__init__.py +13 -0
- package/integrations/crewai/flows/auto_flow.py +451 -0
- package/integrations/crewai/flows/build_flow.py +297 -0
- package/integrations/crewai/flows/debate_flow.py +422 -0
- package/integrations/crewai/flows/discovery_flow.py +267 -0
- package/integrations/crewai/orchestrator.py +558 -0
- package/integrations/crewai/skills/__init__.py +8 -0
- package/integrations/crewai/skills/skill_router.py +534 -0
- package/integrations/crewai/tools/__init__.py +11 -0
- package/integrations/crewai/tools/file_tool.py +355 -0
- package/integrations/crewai/tools/serper_tool.py +169 -0
- package/integrations/crewai/tools/sql_tool.py +435 -0
- package/memory/CONTEXT-SAVE-FORMAT.md +328 -0
- package/memory/MEMORY-AUTO.json +66 -0
- package/memory/RESUME-PROTOCOL.md +379 -0
- package/package.json +1 -1
- package/phases/auto-01-load.md +165 -0
- package/phases/auto-02-discover.md +207 -0
- package/phases/auto-03-plan.md +509 -0
- package/phases/auto-04-architect.md +567 -0
- package/phases/auto-05-implement.md +713 -0
- package/phases/auto-06-test.md +559 -0
- package/phases/auto-07-deploy.md +510 -0
- package/phases/auto-08-doc.md +970 -0
- package/skills/azure-devops/skill.md +1757 -0
- package/templates/dotnet-blazor/README.md +415 -0
- package/templates/external-services/ExampleService.cs +361 -0
- package/templates/external-services/IService.cs +113 -0
- package/templates/external-services/README.md +325 -0
- package/templates/external-services/ServiceBase.cs +492 -0
- package/templates/external-services/ServiceProvider.cs +243 -0
- package/templates/prompts/devops-agent.yaml +327 -0
- package/templates/prompts.json +15 -1
- package/templates/sql-server/README.md +37 -0
- package/templates/sql-server/functions.sql +158 -0
- package/templates/sql-server/schema.sql +188 -0
- package/templates/sql-server/stored-procedures.sql +284 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
-- =============================================
|
|
2
|
+
-- SQL Server Functions Template
|
|
3
|
+
-- Version: 1.0.0
|
|
4
|
+
-- =============================================
|
|
5
|
+
|
|
6
|
+
USE YourDatabaseName;
|
|
7
|
+
GO
|
|
8
|
+
|
|
9
|
+
-- =============================================
|
|
10
|
+
-- Scalar Functions
|
|
11
|
+
-- =============================================
|
|
12
|
+
|
|
13
|
+
-- Get User Full Name
|
|
14
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_GetUserFullName]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
15
|
+
DROP FUNCTION [dbo].[fn_GetUserFullName];
|
|
16
|
+
GO
|
|
17
|
+
|
|
18
|
+
CREATE FUNCTION [dbo].[fn_GetUserFullName](@UserId UNIQUEIDENTIFIER)
|
|
19
|
+
RETURNS NVARCHAR(250)
|
|
20
|
+
AS
|
|
21
|
+
BEGIN
|
|
22
|
+
DECLARE @FullName NVARCHAR(250);
|
|
23
|
+
|
|
24
|
+
SELECT @FullName = ISNULL([FirstName], '') + ' ' + ISNULL([LastName], '')
|
|
25
|
+
FROM [dbo].[Users]
|
|
26
|
+
WHERE [Id] = @UserId;
|
|
27
|
+
|
|
28
|
+
RETURN LTRIM(RTRIM(@FullName));
|
|
29
|
+
END
|
|
30
|
+
GO
|
|
31
|
+
|
|
32
|
+
-- Format Currency Amount
|
|
33
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_FormatCurrency]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
34
|
+
DROP FUNCTION [dbo].[fn_FormatCurrency];
|
|
35
|
+
GO
|
|
36
|
+
|
|
37
|
+
CREATE FUNCTION [dbo].[fn_FormatCurrency](@Amount DECIMAL(18, 2), @Currency NVARCHAR(3))
|
|
38
|
+
RETURNS NVARCHAR(50)
|
|
39
|
+
AS
|
|
40
|
+
BEGIN
|
|
41
|
+
RETURN @Currency + ' ' + CONVERT(NVARCHAR(50), @Amount, 1);
|
|
42
|
+
END
|
|
43
|
+
GO
|
|
44
|
+
|
|
45
|
+
-- Calculate Age from Date of Birth
|
|
46
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_CalculateAge]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
47
|
+
DROP FUNCTION [dbo].[fn_CalculateAge];
|
|
48
|
+
GO
|
|
49
|
+
|
|
50
|
+
CREATE FUNCTION [dbo].[fn_CalculateAge](@DateOfBirth DATE)
|
|
51
|
+
RETURNS INT
|
|
52
|
+
AS
|
|
53
|
+
BEGIN
|
|
54
|
+
DECLARE @Age INT;
|
|
55
|
+
|
|
56
|
+
SET @Age = DATEDIFF(YEAR, @DateOfBirth, GETDATE()) -
|
|
57
|
+
CASE WHEN DATEADD(YEAR, DATEDIFF(YEAR, @DateOfBirth, GETDATE()), @DateOfBirth) > GETDATE()
|
|
58
|
+
THEN 1 ELSE 0 END;
|
|
59
|
+
|
|
60
|
+
RETURN @Age;
|
|
61
|
+
END
|
|
62
|
+
GO
|
|
63
|
+
|
|
64
|
+
-- =============================================
|
|
65
|
+
-- Table-Valued Functions
|
|
66
|
+
-- =============================================
|
|
67
|
+
|
|
68
|
+
-- Get User Transactions
|
|
69
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_GetUserTransactions]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
70
|
+
DROP FUNCTION [dbo].[fn_GetUserTransactions];
|
|
71
|
+
GO
|
|
72
|
+
|
|
73
|
+
CREATE FUNCTION [dbo].[fn_GetUserTransactions](@UserId UNIQUEIDENTIFIER)
|
|
74
|
+
RETURNS TABLE
|
|
75
|
+
AS
|
|
76
|
+
RETURN
|
|
77
|
+
(
|
|
78
|
+
SELECT
|
|
79
|
+
[Id], [TransactionNumber], [Type], [Amount], [Currency],
|
|
80
|
+
[Status], [Description], [Reference], [Provider],
|
|
81
|
+
[ProcessedAt], [CreatedAt]
|
|
82
|
+
FROM [dbo].[Transactions]
|
|
83
|
+
WHERE [UserId] = @UserId
|
|
84
|
+
ORDER BY [CreatedAt] DESC
|
|
85
|
+
);
|
|
86
|
+
GO
|
|
87
|
+
|
|
88
|
+
-- Get User Roles
|
|
89
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_GetUserRoles]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
90
|
+
DROP FUNCTION [dbo].[fn_GetUserRoles];
|
|
91
|
+
GO
|
|
92
|
+
|
|
93
|
+
CREATE FUNCTION [dbo].[fn_GetUserRoles](@UserId UNIQUEIDENTIFIER)
|
|
94
|
+
RETURNS TABLE
|
|
95
|
+
AS
|
|
96
|
+
RETURN
|
|
97
|
+
(
|
|
98
|
+
SELECT
|
|
99
|
+
r.[Id], r.[Name], r.[Description], ur.[AssignedAt]
|
|
100
|
+
FROM [dbo].[UserRoles] ur
|
|
101
|
+
INNER JOIN [dbo].[Roles] r ON ur.[RoleId] = r.[Id]
|
|
102
|
+
WHERE ur.[UserId] = @UserId
|
|
103
|
+
);
|
|
104
|
+
GO
|
|
105
|
+
|
|
106
|
+
-- =============================================
|
|
107
|
+
-- Inline Table-Valued Functions
|
|
108
|
+
-- =============================================
|
|
109
|
+
|
|
110
|
+
-- Search Users
|
|
111
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_SearchUsers]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
112
|
+
DROP FUNCTION [dbo].[fn_SearchUsers];
|
|
113
|
+
GO
|
|
114
|
+
|
|
115
|
+
CREATE FUNCTION [dbo].[fn_SearchUsers](@SearchTerm NVARCHAR(100))
|
|
116
|
+
RETURNS TABLE
|
|
117
|
+
AS
|
|
118
|
+
RETURN
|
|
119
|
+
(
|
|
120
|
+
SELECT
|
|
121
|
+
[Id], [Username], [Email], [FirstName], [LastName],
|
|
122
|
+
[IsActive], [EmailVerified], [CreatedAt]
|
|
123
|
+
FROM [dbo].[Users]
|
|
124
|
+
WHERE
|
|
125
|
+
[Username] LIKE '%' + @SearchTerm + '%' OR
|
|
126
|
+
[Email] LIKE '%' + @SearchTerm + '%' OR
|
|
127
|
+
[FirstName] LIKE '%' + @SearchTerm + '%' OR
|
|
128
|
+
[LastName] LIKE '%' + @SearchTerm + '%'
|
|
129
|
+
);
|
|
130
|
+
GO
|
|
131
|
+
|
|
132
|
+
-- Get Transactions by Date Range
|
|
133
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_GetTransactionsByDateRange]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
|
|
134
|
+
DROP FUNCTION [dbo].[fn_GetTransactionsByDateRange];
|
|
135
|
+
GO
|
|
136
|
+
|
|
137
|
+
CREATE FUNCTION [dbo].[fn_GetTransactionsByDateRange](
|
|
138
|
+
@StartDate DATETIME,
|
|
139
|
+
@EndDate DATETIME,
|
|
140
|
+
@UserId UNIQUEIDENTIFIER = NULL
|
|
141
|
+
)
|
|
142
|
+
RETURNS TABLE
|
|
143
|
+
AS
|
|
144
|
+
RETURN
|
|
145
|
+
(
|
|
146
|
+
SELECT
|
|
147
|
+
[Id], [TransactionNumber], [UserId], [Type], [Amount], [Currency],
|
|
148
|
+
[Status], [Description], [Provider], [ProcessedAt], [CreatedAt]
|
|
149
|
+
FROM [dbo].[Transactions]
|
|
150
|
+
WHERE
|
|
151
|
+
[CreatedAt] >= @StartDate AND
|
|
152
|
+
[CreatedAt] <= @EndDate AND
|
|
153
|
+
(@UserId IS NULL OR [UserId] = @UserId)
|
|
154
|
+
ORDER BY [CreatedAt] DESC
|
|
155
|
+
);
|
|
156
|
+
GO
|
|
157
|
+
|
|
158
|
+
PRINT 'Functions created successfully.';
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
-- =============================================
|
|
2
|
+
-- SQL Server Database Schema Template
|
|
3
|
+
-- Version: 1.0.0
|
|
4
|
+
-- =============================================
|
|
5
|
+
|
|
6
|
+
-- Enable required features
|
|
7
|
+
SET ANSI_NULLS ON;
|
|
8
|
+
GO
|
|
9
|
+
SET QUOTED_IDENTIFIER ON;
|
|
10
|
+
GO
|
|
11
|
+
|
|
12
|
+
-- =============================================
|
|
13
|
+
-- Create Database (if not exists)
|
|
14
|
+
-- =============================================
|
|
15
|
+
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'YourDatabaseName')
|
|
16
|
+
BEGIN
|
|
17
|
+
CREATE DATABASE YourDatabaseName;
|
|
18
|
+
END
|
|
19
|
+
GO
|
|
20
|
+
|
|
21
|
+
USE YourDatabaseName;
|
|
22
|
+
GO
|
|
23
|
+
|
|
24
|
+
-- =============================================
|
|
25
|
+
-- Schema Versioning Table
|
|
26
|
+
-- =============================================
|
|
27
|
+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SchemaVersion]') AND type in (N'U'))
|
|
28
|
+
BEGIN
|
|
29
|
+
CREATE TABLE [dbo].[SchemaVersion](
|
|
30
|
+
[Id] [int] IDENTITY(1,1) NOT NULL,
|
|
31
|
+
[Version] [nvarchar](50) NOT NULL,
|
|
32
|
+
[Description] [nvarchar](500) NULL,
|
|
33
|
+
[AppliedOn] [datetime] NOT NULL CONSTRAINT [DF_SchemaVersion_AppliedOn] DEFAULT (GETUTCDATE()),
|
|
34
|
+
[AppliedBy] [nvarchar](100) NULL,
|
|
35
|
+
CONSTRAINT [PK_SchemaVersion] PRIMARY KEY CLUSTERED ([Id] ASC)
|
|
36
|
+
);
|
|
37
|
+
END
|
|
38
|
+
GO
|
|
39
|
+
|
|
40
|
+
-- =============================================
|
|
41
|
+
-- Audit Log Table
|
|
42
|
+
-- =============================================
|
|
43
|
+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[AuditLog]') AND type in (N'U'))
|
|
44
|
+
BEGIN
|
|
45
|
+
CREATE TABLE [dbo].[AuditLog](
|
|
46
|
+
[Id] [bigint] IDENTITY(1,1) NOT NULL,
|
|
47
|
+
[TableName] [nvarchar](100) NOT NULL,
|
|
48
|
+
[RecordId] [nvarchar](100) NOT NULL,
|
|
49
|
+
[Action] [nvarchar](20) NOT NULL,
|
|
50
|
+
[OldValue] [nvarchar](max) NULL,
|
|
51
|
+
[NewValue] [nvarchar](max) NULL,
|
|
52
|
+
[ChangedBy] [nvarchar](100) NOT NULL,
|
|
53
|
+
[ChangedOn] [datetime] NOT NULL CONSTRAINT [DF_AuditLog_ChangedOn] DEFAULT (GETUTCDATE()),
|
|
54
|
+
[IpAddress] [nvarchar](50) NULL,
|
|
55
|
+
CONSTRAINT [PK_AuditLog] PRIMARY KEY CLUSTERED ([Id] ASC)
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
CREATE INDEX [IX_AuditLog_TableName] ON [dbo].[AuditLog]([TableName]);
|
|
59
|
+
CREATE INDEX [IX_AuditLog_ChangedOn] ON [dbo].[AuditLog]([ChangedOn]);
|
|
60
|
+
END
|
|
61
|
+
GO
|
|
62
|
+
|
|
63
|
+
-- =============================================
|
|
64
|
+
-- Example: Users Table
|
|
65
|
+
-- =============================================
|
|
66
|
+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Users]') AND type in (N'U'))
|
|
67
|
+
BEGIN
|
|
68
|
+
CREATE TABLE [dbo].[Users](
|
|
69
|
+
[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Users_Id] DEFAULT (NEWID()),
|
|
70
|
+
[Username] [nvarchar](100) NOT NULL,
|
|
71
|
+
[Email] [nvarchar](255) NOT NULL,
|
|
72
|
+
[PasswordHash] [nvarchar](255) NOT NULL,
|
|
73
|
+
[FirstName] [nvarchar](100) NULL,
|
|
74
|
+
[LastName] [nvarchar](100) NULL,
|
|
75
|
+
[IsActive] [bit] NOT NULL CONSTRAINT [DF_Users_IsActive] DEFAULT (1),
|
|
76
|
+
[EmailVerified] [bit] NOT NULL CONSTRAINT [DF_Users_EmailVerified] DEFAULT (0),
|
|
77
|
+
[LastLogin] [datetime] NULL,
|
|
78
|
+
[FailedLoginAttempts] [int] NOT NULL CONSTRAINT [DF_Users_FailedLoginAttempts] DEFAULT (0),
|
|
79
|
+
[LockedUntil] [datetime] NULL,
|
|
80
|
+
[CreatedAt] [datetime] NOT NULL CONSTRAINT [DF_Users_CreatedAt] DEFAULT (GETUTCDATE()),
|
|
81
|
+
[UpdatedAt] [datetime] NOT NULL CONSTRAINT [DF_Users_UpdatedAt] DEFAULT (GETUTCDATE()),
|
|
82
|
+
[CreatedBy] [uniqueidentifier] NULL,
|
|
83
|
+
[UpdatedBy] [uniqueidentifier] NULL,
|
|
84
|
+
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED ([Id] ASC),
|
|
85
|
+
CONSTRAINT [UQ_Users_Username] UNIQUE NONCLUSTERED ([Username] ASC),
|
|
86
|
+
CONSTRAINT [UQ_Users_Email] UNIQUE NONCLUSTERED ([Email] ASC)
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
CREATE INDEX [IX_Users_Email] ON [dbo].[Users]([Email]);
|
|
90
|
+
CREATE INDEX [IX_Users_IsActive] ON [dbo].[Users]([IsActive]);
|
|
91
|
+
END
|
|
92
|
+
GO
|
|
93
|
+
|
|
94
|
+
-- =============================================
|
|
95
|
+
-- Example: Roles Table
|
|
96
|
+
-- =============================================
|
|
97
|
+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Roles]') AND type in (N'U'))
|
|
98
|
+
BEGIN
|
|
99
|
+
CREATE TABLE [dbo].[Roles](
|
|
100
|
+
[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Roles_Id] DEFAULT (NEWID()),
|
|
101
|
+
[Name] [nvarchar](50) NOT NULL,
|
|
102
|
+
[Description] [nvarchar](255) NULL,
|
|
103
|
+
[IsSystem] [bit] NOT NULL CONSTRAINT [DF_Roles_IsSystem] DEFAULT (0),
|
|
104
|
+
[CreatedAt] [datetime] NOT NULL CONSTRAINT [DF_Roles_CreatedAt] DEFAULT (GETUTCDATE()),
|
|
105
|
+
CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED ([Id] ASC),
|
|
106
|
+
CONSTRAINT [UQ_Roles_Name] UNIQUE NONCLUSTERED ([Name] ASC)
|
|
107
|
+
);
|
|
108
|
+
END
|
|
109
|
+
GO
|
|
110
|
+
|
|
111
|
+
-- =============================================
|
|
112
|
+
-- Example: UserRoles Junction Table
|
|
113
|
+
-- =============================================
|
|
114
|
+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[UserRoles]') AND type in (N'U'))
|
|
115
|
+
BEGIN
|
|
116
|
+
CREATE TABLE [dbo].[UserRoles](
|
|
117
|
+
[UserId] [uniqueidentifier] NOT NULL,
|
|
118
|
+
[RoleId] [uniqueidentifier] NOT NULL,
|
|
119
|
+
[AssignedAt] [datetime] NOT NULL CONSTRAINT [DF_UserRoles_AssignedAt] DEFAULT (GETUTCDATE()),
|
|
120
|
+
[AssignedBy] [uniqueidentifier] NULL,
|
|
121
|
+
CONSTRAINT [PK_UserRoles] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
|
|
122
|
+
CONSTRAINT [FK_UserRoles_Users] FOREIGN KEY([UserId]) REFERENCES [dbo].[Users]([Id]) ON DELETE CASCADE,
|
|
123
|
+
CONSTRAINT [FK_UserRoles_Roles] FOREIGN KEY([RoleId]) REFERENCES [dbo].[Roles]([Id]) ON DELETE CASCADE
|
|
124
|
+
);
|
|
125
|
+
END
|
|
126
|
+
GO
|
|
127
|
+
|
|
128
|
+
-- =============================================
|
|
129
|
+
-- Example: Transactions Table (Financial)
|
|
130
|
+
-- =============================================
|
|
131
|
+
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Transactions]') AND type in (N'U'))
|
|
132
|
+
BEGIN
|
|
133
|
+
CREATE TABLE [dbo].[Transactions](
|
|
134
|
+
[Id] [uniqueidentifier] NOT NULL CONSTRAINT [DF_Transactions_Id] DEFAULT (NEWID()),
|
|
135
|
+
[TransactionNumber] [nvarchar](50) NOT NULL,
|
|
136
|
+
[UserId] [uniqueidentifier] NOT NULL,
|
|
137
|
+
[Type] [nvarchar](20) NOT NULL,
|
|
138
|
+
[Amount] [decimal](18, 2) NOT NULL,
|
|
139
|
+
[Currency] [nvarchar](3) NOT NULL CONSTRAINT [DF_Transactions_Currency] DEFAULT ('MAD'),
|
|
140
|
+
[Status] [nvarchar](20) NOT NULL CONSTRAINT [DF_Transactions_Status] DEFAULT ('Pending'),
|
|
141
|
+
[Description] [nvarchar](500) NULL,
|
|
142
|
+
[Reference] [nvarchar](100) NULL,
|
|
143
|
+
[Provider] [nvarchar](50) NULL,
|
|
144
|
+
[ProviderTransactionId] [nvarchar](100) NULL,
|
|
145
|
+
[Metadata] [nvarchar](max) NULL,
|
|
146
|
+
[ProcessedAt] [datetime] NULL,
|
|
147
|
+
[CreatedAt] [datetime] NOT NULL CONSTRAINT [DF_Transactions_CreatedAt] DEFAULT (GETUTCDATE()),
|
|
148
|
+
CONSTRAINT [PK_Transactions] PRIMARY KEY CLUSTERED ([Id] ASC),
|
|
149
|
+
CONSTRAINT [UQ_Transactions_TransactionNumber] UNIQUE NONCLUSTERED ([TransactionNumber] ASC),
|
|
150
|
+
CONSTRAINT [FK_Transactions_Users] FOREIGN KEY([UserId]) REFERENCES [dbo].[Users]([Id]),
|
|
151
|
+
CONSTRAINT [CK_Transactions_Amount] CHECK ([Amount] > 0)
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
CREATE INDEX [IX_Transactions_UserId] ON [dbo].[Transactions]([UserId]);
|
|
155
|
+
CREATE INDEX [IX_Transactions_Status] ON [dbo].[Transactions]([Status]);
|
|
156
|
+
CREATE INDEX [IX_Transactions_CreatedAt] ON [dbo].[Transactions]([CreatedAt] DESC);
|
|
157
|
+
CREATE INDEX [IX_Transactions_TransactionNumber] ON [dbo].[Transactions]([TransactionNumber]);
|
|
158
|
+
END
|
|
159
|
+
GO
|
|
160
|
+
|
|
161
|
+
-- =============================================
|
|
162
|
+
-- Insert Initial Data
|
|
163
|
+
-- =============================================
|
|
164
|
+
|
|
165
|
+
-- Insert default roles
|
|
166
|
+
IF NOT EXISTS (SELECT * FROM [dbo].[Roles] WHERE [Name] = 'Admin')
|
|
167
|
+
BEGIN
|
|
168
|
+
INSERT INTO [dbo].[Roles] ([Name], [Description], [IsSystem])
|
|
169
|
+
VALUES ('Admin', 'System administrator with full access', 1);
|
|
170
|
+
END
|
|
171
|
+
GO
|
|
172
|
+
|
|
173
|
+
IF NOT EXISTS (SELECT * FROM [dbo].[Roles] WHERE [Name] = 'User')
|
|
174
|
+
BEGIN
|
|
175
|
+
INSERT INTO [dbo].[Roles] ([Name], [Description], [IsSystem])
|
|
176
|
+
VALUES ('User', 'Standard user with limited access', 1);
|
|
177
|
+
END
|
|
178
|
+
GO
|
|
179
|
+
|
|
180
|
+
-- Record schema version
|
|
181
|
+
IF NOT EXISTS (SELECT * FROM [dbo].[SchemaVersion] WHERE [Version] = '1.0.0')
|
|
182
|
+
BEGIN
|
|
183
|
+
INSERT INTO [dbo].[SchemaVersion] ([Version], [Description], [AppliedBy])
|
|
184
|
+
VALUES ('1.0.0', 'Initial database schema', 'MDAN-AUTO');
|
|
185
|
+
END
|
|
186
|
+
GO
|
|
187
|
+
|
|
188
|
+
PRINT 'Database schema created successfully.';
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
-- =============================================
|
|
2
|
+
-- SQL Server Stored Procedures Template
|
|
3
|
+
-- Version: 1.0.0
|
|
4
|
+
-- =============================================
|
|
5
|
+
|
|
6
|
+
USE YourDatabaseName;
|
|
7
|
+
GO
|
|
8
|
+
|
|
9
|
+
-- =============================================
|
|
10
|
+
-- User Management Procedures
|
|
11
|
+
-- =============================================
|
|
12
|
+
|
|
13
|
+
-- Create User
|
|
14
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_CreateUser]') AND type in (N'P', N'PC'))
|
|
15
|
+
DROP PROCEDURE [dbo].[sp_CreateUser];
|
|
16
|
+
GO
|
|
17
|
+
|
|
18
|
+
CREATE PROCEDURE [dbo].[sp_CreateUser]
|
|
19
|
+
@Username NVARCHAR(100),
|
|
20
|
+
@Email NVARCHAR(255),
|
|
21
|
+
@PasswordHash NVARCHAR(255),
|
|
22
|
+
@FirstName NVARCHAR(100) = NULL,
|
|
23
|
+
@LastName NVARCHAR(100) = NULL,
|
|
24
|
+
@CreatedBy UNIQUEIDENTIFIER = NULL,
|
|
25
|
+
@UserId UNIQUEIDENTIFIER OUTPUT,
|
|
26
|
+
@ErrorMessage NVARCHAR(500) OUTPUT
|
|
27
|
+
AS
|
|
28
|
+
BEGIN
|
|
29
|
+
SET NOCOUNT ON;
|
|
30
|
+
|
|
31
|
+
BEGIN TRY
|
|
32
|
+
BEGIN TRANSACTION;
|
|
33
|
+
|
|
34
|
+
-- Check if username exists
|
|
35
|
+
IF EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [Username] = @Username)
|
|
36
|
+
BEGIN
|
|
37
|
+
SET @ErrorMessage = 'Username already exists';
|
|
38
|
+
ROLLBACK TRANSACTION;
|
|
39
|
+
RETURN;
|
|
40
|
+
END
|
|
41
|
+
|
|
42
|
+
-- Check if email exists
|
|
43
|
+
IF EXISTS (SELECT 1 FROM [dbo].[Users] WHERE [Email] = @Email)
|
|
44
|
+
BEGIN
|
|
45
|
+
SET @ErrorMessage = 'Email already exists';
|
|
46
|
+
ROLLBACK TRANSACTION;
|
|
47
|
+
RETURN;
|
|
48
|
+
END
|
|
49
|
+
|
|
50
|
+
-- Create user
|
|
51
|
+
INSERT INTO [dbo].[Users] (
|
|
52
|
+
[Username], [Email], [PasswordHash], [FirstName], [LastName],
|
|
53
|
+
[CreatedBy], [UpdatedBy]
|
|
54
|
+
)
|
|
55
|
+
VALUES (
|
|
56
|
+
@Username, @Email, @PasswordHash, @FirstName, @LastName,
|
|
57
|
+
@CreatedBy, @CreatedBy
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
SET @UserId = SCOPE_IDENTITY();
|
|
61
|
+
|
|
62
|
+
-- Log audit
|
|
63
|
+
INSERT INTO [dbo].[AuditLog] (
|
|
64
|
+
[TableName], [RecordId], [Action], [NewValue], [ChangedBy]
|
|
65
|
+
)
|
|
66
|
+
VALUES (
|
|
67
|
+
'Users', CAST(@UserId AS NVARCHAR(100)), 'INSERT',
|
|
68
|
+
'User created: ' + @Username, COALESCE(CAST(@CreatedBy AS NVARCHAR(100)), 'System')
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
COMMIT TRANSACTION;
|
|
72
|
+
END TRY
|
|
73
|
+
BEGIN CATCH
|
|
74
|
+
IF @@TRANCOUNT > 0
|
|
75
|
+
ROLLBACK TRANSACTION;
|
|
76
|
+
|
|
77
|
+
SET @ErrorMessage = ERROR_MESSAGE();
|
|
78
|
+
END CATCH
|
|
79
|
+
END
|
|
80
|
+
GO
|
|
81
|
+
|
|
82
|
+
-- Get User by ID
|
|
83
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_GetUserById]') AND type in (N'P', N'PC'))
|
|
84
|
+
DROP PROCEDURE [dbo].[sp_GetUserById];
|
|
85
|
+
GO
|
|
86
|
+
|
|
87
|
+
CREATE PROCEDURE [dbo].[sp_GetUserById]
|
|
88
|
+
@UserId UNIQUEIDENTIFIER
|
|
89
|
+
AS
|
|
90
|
+
BEGIN
|
|
91
|
+
SET NOCOUNT ON;
|
|
92
|
+
|
|
93
|
+
SELECT
|
|
94
|
+
[Id], [Username], [Email], [FirstName], [LastName],
|
|
95
|
+
[IsActive], [EmailVerified], [LastLogin], [CreatedAt], [UpdatedAt]
|
|
96
|
+
FROM [dbo].[Users]
|
|
97
|
+
WHERE [Id] = @UserId;
|
|
98
|
+
END
|
|
99
|
+
GO
|
|
100
|
+
|
|
101
|
+
-- Update User
|
|
102
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_UpdateUser]') AND type in (N'P', N'PC'))
|
|
103
|
+
DROP PROCEDURE [dbo].[sp_UpdateUser];
|
|
104
|
+
GO
|
|
105
|
+
|
|
106
|
+
CREATE PROCEDURE [dbo].[sp_UpdateUser]
|
|
107
|
+
@UserId UNIQUEIDENTIFIER,
|
|
108
|
+
@FirstName NVARCHAR(100) = NULL,
|
|
109
|
+
@LastName NVARCHAR(100) = NULL,
|
|
110
|
+
@UpdatedBy UNIQUEIDENTIFIER = NULL,
|
|
111
|
+
@ErrorMessage NVARCHAR(500) OUTPUT
|
|
112
|
+
AS
|
|
113
|
+
BEGIN
|
|
114
|
+
SET NOCOUNT ON;
|
|
115
|
+
|
|
116
|
+
BEGIN TRY
|
|
117
|
+
BEGIN TRANSACTION;
|
|
118
|
+
|
|
119
|
+
DECLARE @OldValue NVARCHAR(MAX);
|
|
120
|
+
DECLARE @NewValue NVARCHAR(MAX);
|
|
121
|
+
|
|
122
|
+
-- Get old values
|
|
123
|
+
SELECT @OldValue = 'FirstName:' + ISNULL([FirstName], '') + ',LastName:' + ISNULL([LastName], '')
|
|
124
|
+
FROM [dbo].[Users]
|
|
125
|
+
WHERE [Id] = @UserId;
|
|
126
|
+
|
|
127
|
+
-- Update user
|
|
128
|
+
UPDATE [dbo].[Users]
|
|
129
|
+
SET
|
|
130
|
+
[FirstName] = @FirstName,
|
|
131
|
+
[LastName] = @LastName,
|
|
132
|
+
[UpdatedAt] = GETUTCDATE(),
|
|
133
|
+
[UpdatedBy] = @UpdatedBy
|
|
134
|
+
WHERE [Id] = @UserId;
|
|
135
|
+
|
|
136
|
+
IF @@ROWCOUNT = 0
|
|
137
|
+
BEGIN
|
|
138
|
+
SET @ErrorMessage = 'User not found';
|
|
139
|
+
ROLLBACK TRANSACTION;
|
|
140
|
+
RETURN;
|
|
141
|
+
END
|
|
142
|
+
|
|
143
|
+
-- Get new values
|
|
144
|
+
SELECT @NewValue = 'FirstName:' + ISNULL([FirstName], '') + ',LastName:' + ISNULL([LastName], '')
|
|
145
|
+
FROM [dbo].[Users]
|
|
146
|
+
WHERE [Id] = @UserId;
|
|
147
|
+
|
|
148
|
+
-- Log audit
|
|
149
|
+
INSERT INTO [dbo].[AuditLog] (
|
|
150
|
+
[TableName], [RecordId], [Action], [OldValue], [NewValue], [ChangedBy]
|
|
151
|
+
)
|
|
152
|
+
VALUES (
|
|
153
|
+
'Users', CAST(@UserId AS NVARCHAR(100)), 'UPDATE',
|
|
154
|
+
@OldValue, @NewValue, COALESCE(CAST(@UpdatedBy AS NVARCHAR(100)), 'System')
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
COMMIT TRANSACTION;
|
|
158
|
+
END TRY
|
|
159
|
+
BEGIN CATCH
|
|
160
|
+
IF @@TRANCOUNT > 0
|
|
161
|
+
ROLLBACK TRANSACTION;
|
|
162
|
+
|
|
163
|
+
SET @ErrorMessage = ERROR_MESSAGE();
|
|
164
|
+
END CATCH
|
|
165
|
+
END
|
|
166
|
+
GO
|
|
167
|
+
|
|
168
|
+
-- =============================================
|
|
169
|
+
-- Transaction Procedures
|
|
170
|
+
-- =============================================
|
|
171
|
+
|
|
172
|
+
-- Create Transaction
|
|
173
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_CreateTransaction]') AND type in (N'P', N'PC'))
|
|
174
|
+
DROP PROCEDURE [dbo].[sp_CreateTransaction];
|
|
175
|
+
GO
|
|
176
|
+
|
|
177
|
+
CREATE PROCEDURE [dbo].[sp_CreateTransaction]
|
|
178
|
+
@UserId UNIQUEIDENTIFIER,
|
|
179
|
+
@Type NVARCHAR(20),
|
|
180
|
+
@Amount DECIMAL(18, 2),
|
|
181
|
+
@Currency NVARCHAR(3) = 'MAD',
|
|
182
|
+
@Description NVARCHAR(500) = NULL,
|
|
183
|
+
@Reference NVARCHAR(100) = NULL,
|
|
184
|
+
@Provider NVARCHAR(50) = NULL,
|
|
185
|
+
@ProviderTransactionId NVARCHAR(100) = NULL,
|
|
186
|
+
@Metadata NVARCHAR(MAX) = NULL,
|
|
187
|
+
@TransactionId UNIQUEIDENTIFIER OUTPUT,
|
|
188
|
+
@TransactionNumber NVARCHAR(50) OUTPUT,
|
|
189
|
+
@ErrorMessage NVARCHAR(500) OUTPUT
|
|
190
|
+
AS
|
|
191
|
+
BEGIN
|
|
192
|
+
SET NOCOUNT ON;
|
|
193
|
+
|
|
194
|
+
BEGIN TRY
|
|
195
|
+
BEGIN TRANSACTION;
|
|
196
|
+
|
|
197
|
+
-- Generate transaction number
|
|
198
|
+
DECLARE @Prefix NVARCHAR(10) = 'TXN';
|
|
199
|
+
DECLARE @DatePart NVARCHAR(8) = REPLACE(CONVERT(NVARCHAR, GETDATE(), 112), '-', '');
|
|
200
|
+
DECLARE @RandomPart NVARCHAR(6) = RIGHT('000000' + CAST(CAST(CHECKSUM(NEWID()) AS INT) % 1000000 AS NVARCHAR), 6);
|
|
201
|
+
SET @TransactionNumber = @Prefix + @DatePart + @RandomPart;
|
|
202
|
+
|
|
203
|
+
-- Create transaction
|
|
204
|
+
INSERT INTO [dbo].[Transactions] (
|
|
205
|
+
[TransactionNumber], [UserId], [Type], [Amount], [Currency],
|
|
206
|
+
[Description], [Reference], [Provider], [ProviderTransactionId], [Metadata]
|
|
207
|
+
)
|
|
208
|
+
VALUES (
|
|
209
|
+
@TransactionNumber, @UserId, @Type, @Amount, @Currency,
|
|
210
|
+
@Description, @Reference, @Provider, @ProviderTransactionId, @Metadata
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
SET @TransactionId = SCOPE_IDENTITY();
|
|
214
|
+
|
|
215
|
+
COMMIT TRANSACTION;
|
|
216
|
+
END TRY
|
|
217
|
+
BEGIN CATCH
|
|
218
|
+
IF @@TRANCOUNT > 0
|
|
219
|
+
ROLLBACK TRANSACTION;
|
|
220
|
+
|
|
221
|
+
SET @ErrorMessage = ERROR_MESSAGE();
|
|
222
|
+
END CATCH
|
|
223
|
+
END
|
|
224
|
+
GO
|
|
225
|
+
|
|
226
|
+
-- Update Transaction Status
|
|
227
|
+
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[sp_UpdateTransactionStatus]') AND type in (N'P', N'PC'))
|
|
228
|
+
DROP PROCEDURE [dbo].[sp_UpdateTransactionStatus];
|
|
229
|
+
GO
|
|
230
|
+
|
|
231
|
+
CREATE PROCEDURE [dbo].[sp_UpdateTransactionStatus]
|
|
232
|
+
@TransactionId UNIQUEIDENTIFIER,
|
|
233
|
+
@Status NVARCHAR(20),
|
|
234
|
+
@ProcessedAt DATETIME = NULL,
|
|
235
|
+
@ErrorMessage NVARCHAR(500) OUTPUT
|
|
236
|
+
AS
|
|
237
|
+
BEGIN
|
|
238
|
+
SET NOCOUNT ON;
|
|
239
|
+
|
|
240
|
+
BEGIN TRY
|
|
241
|
+
BEGIN TRANSACTION;
|
|
242
|
+
|
|
243
|
+
DECLARE @OldStatus NVARCHAR(20);
|
|
244
|
+
|
|
245
|
+
-- Get old status
|
|
246
|
+
SELECT @OldStatus = [Status]
|
|
247
|
+
FROM [dbo].[Transactions]
|
|
248
|
+
WHERE [Id] = @TransactionId;
|
|
249
|
+
|
|
250
|
+
-- Update transaction
|
|
251
|
+
UPDATE [dbo].[Transactions]
|
|
252
|
+
SET
|
|
253
|
+
[Status] = @Status,
|
|
254
|
+
[ProcessedAt] = COALESCE(@ProcessedAt, GETUTCDATE())
|
|
255
|
+
WHERE [Id] = @TransactionId;
|
|
256
|
+
|
|
257
|
+
IF @@ROWCOUNT = 0
|
|
258
|
+
BEGIN
|
|
259
|
+
SET @ErrorMessage = 'Transaction not found';
|
|
260
|
+
ROLLBACK TRANSACTION;
|
|
261
|
+
RETURN;
|
|
262
|
+
END
|
|
263
|
+
|
|
264
|
+
-- Log audit
|
|
265
|
+
INSERT INTO [dbo].[AuditLog] (
|
|
266
|
+
[TableName], [RecordId], [Action], [OldValue], [NewValue], [ChangedBy]
|
|
267
|
+
)
|
|
268
|
+
VALUES (
|
|
269
|
+
'Transactions', CAST(@TransactionId AS NVARCHAR(100)), 'UPDATE',
|
|
270
|
+
'Status:' + @OldStatus, 'Status:' + @Status, 'System'
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
COMMIT TRANSACTION;
|
|
274
|
+
END TRY
|
|
275
|
+
BEGIN CATCH
|
|
276
|
+
IF @@TRANCOUNT > 0
|
|
277
|
+
ROLLBACK TRANSACTION;
|
|
278
|
+
|
|
279
|
+
SET @ErrorMessage = ERROR_MESSAGE();
|
|
280
|
+
END CATCH
|
|
281
|
+
END
|
|
282
|
+
GO
|
|
283
|
+
|
|
284
|
+
PRINT 'Stored procedures created successfully.';
|