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.
Files changed (57) hide show
  1. package/AGENTS.md +76 -1
  2. package/README.md +274 -4
  3. package/agents/auto-orchestrator.md +343 -0
  4. package/agents/devops.md +511 -94
  5. package/cli/mdan.py +111 -6
  6. package/cli/mdan_crewai.py +539 -0
  7. package/core/crewai_orchestrator.md +419 -0
  8. package/core/debate-protocol.md +454 -0
  9. package/core/universal-envelope.md +113 -0
  10. package/integrations/__init__.py +33 -0
  11. package/integrations/crewai/__init__.py +27 -0
  12. package/integrations/crewai/agents/__init__.py +21 -0
  13. package/integrations/crewai/agents/architect_agent.py +264 -0
  14. package/integrations/crewai/agents/dev_agent.py +271 -0
  15. package/integrations/crewai/agents/devops_agent.py +421 -0
  16. package/integrations/crewai/agents/doc_agent.py +388 -0
  17. package/integrations/crewai/agents/product_agent.py +203 -0
  18. package/integrations/crewai/agents/security_agent.py +386 -0
  19. package/integrations/crewai/agents/test_agent.py +358 -0
  20. package/integrations/crewai/agents/ux_agent.py +257 -0
  21. package/integrations/crewai/flows/__init__.py +13 -0
  22. package/integrations/crewai/flows/auto_flow.py +451 -0
  23. package/integrations/crewai/flows/build_flow.py +297 -0
  24. package/integrations/crewai/flows/debate_flow.py +422 -0
  25. package/integrations/crewai/flows/discovery_flow.py +267 -0
  26. package/integrations/crewai/orchestrator.py +558 -0
  27. package/integrations/crewai/skills/__init__.py +8 -0
  28. package/integrations/crewai/skills/skill_router.py +534 -0
  29. package/integrations/crewai/tools/__init__.py +11 -0
  30. package/integrations/crewai/tools/file_tool.py +355 -0
  31. package/integrations/crewai/tools/serper_tool.py +169 -0
  32. package/integrations/crewai/tools/sql_tool.py +435 -0
  33. package/memory/CONTEXT-SAVE-FORMAT.md +328 -0
  34. package/memory/MEMORY-AUTO.json +66 -0
  35. package/memory/RESUME-PROTOCOL.md +379 -0
  36. package/package.json +1 -1
  37. package/phases/auto-01-load.md +165 -0
  38. package/phases/auto-02-discover.md +207 -0
  39. package/phases/auto-03-plan.md +509 -0
  40. package/phases/auto-04-architect.md +567 -0
  41. package/phases/auto-05-implement.md +713 -0
  42. package/phases/auto-06-test.md +559 -0
  43. package/phases/auto-07-deploy.md +510 -0
  44. package/phases/auto-08-doc.md +970 -0
  45. package/skills/azure-devops/skill.md +1757 -0
  46. package/templates/dotnet-blazor/README.md +415 -0
  47. package/templates/external-services/ExampleService.cs +361 -0
  48. package/templates/external-services/IService.cs +113 -0
  49. package/templates/external-services/README.md +325 -0
  50. package/templates/external-services/ServiceBase.cs +492 -0
  51. package/templates/external-services/ServiceProvider.cs +243 -0
  52. package/templates/prompts/devops-agent.yaml +327 -0
  53. package/templates/prompts.json +15 -1
  54. package/templates/sql-server/README.md +37 -0
  55. package/templates/sql-server/functions.sql +158 -0
  56. package/templates/sql-server/schema.sql +188 -0
  57. 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.';