diff --git a/src/Api/Billing/Controllers/OrganizationSponsorshipsController.cs b/src/Api/Billing/Controllers/OrganizationSponsorshipsController.cs index f2c2418bf5..21fad58c80 100644 --- a/src/Api/Billing/Controllers/OrganizationSponsorshipsController.cs +++ b/src/Api/Billing/Controllers/OrganizationSponsorshipsController.cs @@ -81,7 +81,10 @@ public class OrganizationSponsorshipsController : Controller var sponsorship = await _createSponsorshipCommand.CreateSponsorshipAsync( sponsoringOrg, await _organizationUserRepository.GetByOrganizationAsync(sponsoringOrgId, targetUser), - model.PlanSponsorshipType, model.SponsoredEmail, model.FriendlyName); + model.PlanSponsorshipType, + model.SponsoredEmail, + model.FriendlyName, + model.Notes); await _sendSponsorshipOfferCommand.SendSponsorshipOfferAsync(sponsorship, sponsoringOrg.Name); } diff --git a/src/Api/Controllers/SelfHosted/SelfHostedOrganizationSponsorshipsController.cs b/src/Api/Controllers/SelfHosted/SelfHostedOrganizationSponsorshipsController.cs index ffb5c7bb98..654860c24a 100644 --- a/src/Api/Controllers/SelfHosted/SelfHostedOrganizationSponsorshipsController.cs +++ b/src/Api/Controllers/SelfHosted/SelfHostedOrganizationSponsorshipsController.cs @@ -44,7 +44,7 @@ public class SelfHostedOrganizationSponsorshipsController : Controller await _offerSponsorshipCommand.CreateSponsorshipAsync( await _organizationRepository.GetByIdAsync(sponsoringOrgId), await _organizationUserRepository.GetByOrganizationAsync(sponsoringOrgId, _currentContext.UserId ?? default), - model.PlanSponsorshipType, model.SponsoredEmail, model.FriendlyName); + model.PlanSponsorshipType, model.SponsoredEmail, model.FriendlyName, model.Notes); } [HttpDelete("{sponsoringOrgId}")] diff --git a/src/Api/Models/Request/Organizations/OrganizationSponsorshipCreateRequestModel.cs b/src/Api/Models/Request/Organizations/OrganizationSponsorshipCreateRequestModel.cs index 9bdb8a3a16..3b2e873385 100644 --- a/src/Api/Models/Request/Organizations/OrganizationSponsorshipCreateRequestModel.cs +++ b/src/Api/Models/Request/Organizations/OrganizationSponsorshipCreateRequestModel.cs @@ -22,4 +22,6 @@ public class OrganizationSponsorshipCreateRequestModel /// /// Left empty when creating a sponsorship for the authenticated user. public Guid? SponsoringUserId { get; set; } + + public string Notes { get; set; } } diff --git a/src/Core/Entities/OrganizationSponsorship.cs b/src/Core/Entities/OrganizationSponsorship.cs index fa211b686e..0bb21d780b 100644 --- a/src/Core/Entities/OrganizationSponsorship.cs +++ b/src/Core/Entities/OrganizationSponsorship.cs @@ -21,6 +21,7 @@ public class OrganizationSponsorship : ITableObject public DateTime? ValidUntil { get; set; } public bool ToDelete { get; set; } public bool IsAdminInitiated { get; set; } + public string? Notes { get; set; } public void SetNewId() { diff --git a/src/Core/Models/Data/Organizations/OrganizationSponsorships/OrganizationSponsorshipData.cs b/src/Core/Models/Data/Organizations/OrganizationSponsorships/OrganizationSponsorshipData.cs index df0d431ce0..649459bc6b 100644 --- a/src/Core/Models/Data/Organizations/OrganizationSponsorships/OrganizationSponsorshipData.cs +++ b/src/Core/Models/Data/Organizations/OrganizationSponsorships/OrganizationSponsorshipData.cs @@ -17,6 +17,7 @@ public class OrganizationSponsorshipData ValidUntil = sponsorship.ValidUntil; ToDelete = sponsorship.ToDelete; IsAdminInitiated = sponsorship.IsAdminInitiated; + Notes = sponsorship.Notes; } public Guid SponsoringOrganizationUserId { get; set; } public Guid? SponsoredOrganizationId { get; set; } @@ -27,6 +28,7 @@ public class OrganizationSponsorshipData public DateTime? ValidUntil { get; set; } public bool ToDelete { get; set; } public bool IsAdminInitiated { get; set; } + public string Notes { get; set; } public bool CloudSponsorshipRemoved { get; set; } } diff --git a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommand.cs b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommand.cs index f409fdc30d..a7591d0d45 100644 --- a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommand.cs +++ b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommand.cs @@ -28,9 +28,9 @@ public class CreateSponsorshipCommand : ICreateSponsorshipCommand } public async Task CreateSponsorshipAsync(Organization sponsoringOrg, OrganizationUser sponsoringOrgUser, - PlanSponsorshipType sponsorshipType, string sponsoredEmail, string friendlyName) + PlanSponsorshipType sponsorshipType, string sponsoredEmail, string friendlyName, string notes) { - var createSponsorshipRequest = new CreateSponsorshipRequest(sponsoringOrg, sponsoringOrgUser, sponsorshipType, sponsoredEmail, friendlyName); + var createSponsorshipRequest = new CreateSponsorshipRequest(sponsoringOrg, sponsoringOrgUser, sponsorshipType, sponsoredEmail, friendlyName, notes); var sponsorship = await _createSponsorshipHandler.HandleAsync(createSponsorshipRequest); try diff --git a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/Interfaces/ICreateSponsorshipCommand.cs b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/Interfaces/ICreateSponsorshipCommand.cs index 8e3d055a79..4a3e5a63dc 100644 --- a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/Interfaces/ICreateSponsorshipCommand.cs +++ b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/Interfaces/ICreateSponsorshipCommand.cs @@ -7,5 +7,5 @@ namespace Bit.Core.OrganizationFeatures.OrganizationSponsorships.FamiliesForEnte public interface ICreateSponsorshipCommand { Task CreateSponsorshipAsync(Organization sponsoringOrg, OrganizationUser sponsoringOrgUser, - PlanSponsorshipType sponsorshipType, string sponsoredEmail, string friendlyName); + PlanSponsorshipType sponsorshipType, string sponsoredEmail, string friendlyName, string notes); } diff --git a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateAdminInitiatedSponsorshipHandler.cs b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateAdminInitiatedSponsorshipHandler.cs index b8350316d6..e3d915fbff 100644 --- a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateAdminInitiatedSponsorshipHandler.cs +++ b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateAdminInitiatedSponsorshipHandler.cs @@ -40,6 +40,7 @@ public class CreateAdminInitiatedSponsorshipHandler( var sponsorship = await base.HandleAsync(request) ?? new OrganizationSponsorship(); sponsorship.IsAdminInitiated = isAdminInitiated; + sponsorship.Notes = request.Notes; return sponsorship; } diff --git a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateSponsorshipRequest.cs b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateSponsorshipRequest.cs index a989474106..9c7ccfd672 100644 --- a/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateSponsorshipRequest.cs +++ b/src/Core/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/SponsorshipCreation/CreateSponsorshipRequest.cs @@ -9,4 +9,5 @@ public record CreateSponsorshipRequest( OrganizationUser SponsoringMember, PlanSponsorshipType SponsorshipType, string SponsoredEmail, - string FriendlyName); + string FriendlyName, + string Notes); diff --git a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Create.sql b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Create.sql index f681a4f9e4..e79d8770b3 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Create.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Create.sql @@ -9,7 +9,8 @@ CREATE PROCEDURE [dbo].[OrganizationSponsorship_Create] @ToDelete BIT, @LastSyncDate DATETIME2 (7), @ValidUntil DATETIME2 (7), - @IsAdminInitiated BIT + @IsAdminInitiated BIT, + @Notes NVARCHAR(512) AS BEGIN SET NOCOUNT ON @@ -26,7 +27,8 @@ BEGIN [ToDelete], [LastSyncDate], [ValidUntil], - [IsAdminInitiated] + [IsAdminInitiated], + [Notes] ) VALUES ( @@ -40,7 +42,8 @@ BEGIN @ToDelete, @LastSyncDate, @ValidUntil, - @IsAdminInitiated + @IsAdminInitiated, + @Notes ) END GO diff --git a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_CreateMany.sql b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_CreateMany.sql index 61c71c872a..24ae4674a3 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_CreateMany.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_CreateMany.sql @@ -16,7 +16,8 @@ BEGIN [ToDelete], [LastSyncDate], [ValidUntil], - [IsAdminInitiated] + [IsAdminInitiated], + [Notes] ) SELECT OS.[Id], @@ -29,7 +30,8 @@ BEGIN OS.[ToDelete], OS.[LastSyncDate], OS.[ValidUntil], - OS.[IsAdminInitiated] + OS.[IsAdminInitiated], + OS.[Notes] FROM @OrganizationSponsorshipsInput OS END diff --git a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Update.sql b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Update.sql index 6c82c6cf18..d1c68319f4 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Update.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_Update.sql @@ -9,7 +9,8 @@ CREATE PROCEDURE [dbo].[OrganizationSponsorship_Update] @ToDelete BIT, @LastSyncDate DATETIME2 (7), @ValidUntil DATETIME2 (7), - @IsAdminInitiated BIT + @IsAdminInitiated BIT, + @Notes NVARCHAR(512) AS BEGIN SET NOCOUNT ON @@ -26,7 +27,8 @@ BEGIN [ToDelete] = @ToDelete, [LastSyncDate] = @LastSyncDate, [ValidUntil] = @ValidUntil, - [IsAdminInitiated] = @IsAdminInitiated + [IsAdminInitiated] = @IsAdminInitiated, + [Notes] = @Notes WHERE [Id] = @Id END diff --git a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_UpdateMany.sql b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_UpdateMany.sql index c4321a86d2..cd8461cec9 100644 --- a/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_UpdateMany.sql +++ b/src/Sql/dbo/Stored Procedures/OrganizationSponsorship_UpdateMany.sql @@ -17,7 +17,8 @@ BEGIN [ToDelete] = OSI.[ToDelete], [LastSyncDate] = OSI.[LastSyncDate], [ValidUntil] = OSI.[ValidUntil], - [IsAdminInitiated] = OSI.[IsAdminInitiated] + [IsAdminInitiated] = OSI.[IsAdminInitiated], + [Notes] = OSI.[Notes] FROM [dbo].[OrganizationSponsorship] OS INNER JOIN diff --git a/src/Sql/dbo/Tables/OrganizationSponsorship.sql b/src/Sql/dbo/Tables/OrganizationSponsorship.sql index b4526d5b65..c2aaeb088a 100644 --- a/src/Sql/dbo/Tables/OrganizationSponsorship.sql +++ b/src/Sql/dbo/Tables/OrganizationSponsorship.sql @@ -10,6 +10,7 @@ CREATE TABLE [dbo].[OrganizationSponsorship] ( [LastSyncDate] DATETIME2 (7) NULL, [ValidUntil] DATETIME2 (7) NULL, [IsAdminInitiated] BIT NOT NULL CONSTRAINT [DF_OrganizationSponsorship_IsAdminInitiated] DEFAULT (0), + [Notes] NVARCHAR(512) NULL, CONSTRAINT [PK_OrganizationSponsorship] PRIMARY KEY CLUSTERED ([Id] ASC), CONSTRAINT [FK_OrganizationSponsorship_SponsoringOrg] FOREIGN KEY ([SponsoringOrganizationId]) REFERENCES [dbo].[Organization] ([Id]), CONSTRAINT [FK_OrganizationSponsorship_SponsoredOrg] FOREIGN KEY ([SponsoredOrganizationId]) REFERENCES [dbo].[Organization] ([Id]), diff --git a/src/Sql/dbo/User Defined Types/OrganizationSponsorshipType.sql b/src/Sql/dbo/User Defined Types/OrganizationSponsorshipType.sql index 00080cad5d..0df4eadbb8 100644 --- a/src/Sql/dbo/User Defined Types/OrganizationSponsorshipType.sql +++ b/src/Sql/dbo/User Defined Types/OrganizationSponsorshipType.sql @@ -9,5 +9,6 @@ CREATE TYPE [dbo].[OrganizationSponsorshipType] AS TABLE( [LastSyncDate] DATETIME2(7), [ValidUntil] DATETIME2(7), [ToDelete] BIT, - [IsAdminInitiated] BIT + [IsAdminInitiated] BIT, + [Notes] NVARCHAR(512) ) diff --git a/test/Core.Test/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommandTests.cs b/test/Core.Test/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommandTests.cs index 4fadafb2c3..6fe4e8bb3c 100644 --- a/test/Core.Test/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommandTests.cs +++ b/test/Core.Test/OrganizationFeatures/OrganizationSponsorships/FamiliesForEnterprise/CreateSponsorshipCommandTests.cs @@ -41,7 +41,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase sutProvider.GetDependency().GetUserByIdAsync(orgUser.UserId.Value).ReturnsNull(); var exception = await Assert.ThrowsAsync(() => - sutProvider.Sut.CreateSponsorshipAsync(null, orgUser, PlanSponsorshipType.FamiliesForEnterprise, default, default)); + sutProvider.Sut.CreateSponsorshipAsync(null, orgUser, PlanSponsorshipType.FamiliesForEnterprise, default, default, null)); Assert.Contains("Cannot offer a Families Organization Sponsorship to yourself. Choose a different email.", exception.Message); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() @@ -55,7 +55,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase sutProvider.GetDependency().GetUserByIdAsync(orgUser.UserId.Value).Returns(user); var exception = await Assert.ThrowsAsync(() => - sutProvider.Sut.CreateSponsorshipAsync(null, orgUser, PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, default)); + sutProvider.Sut.CreateSponsorshipAsync(null, orgUser, PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, default, null)); Assert.Contains("Cannot offer a Families Organization Sponsorship to yourself. Choose a different email.", exception.Message); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() @@ -72,7 +72,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase sutProvider.GetDependency().GetUserByIdAsync(orgUser.UserId.Value).Returns(user); var exception = await Assert.ThrowsAsync(() => - sutProvider.Sut.CreateSponsorshipAsync(org, orgUser, PlanSponsorshipType.FamiliesForEnterprise, default, default)); + sutProvider.Sut.CreateSponsorshipAsync(org, orgUser, PlanSponsorshipType.FamiliesForEnterprise, default, default, null)); Assert.Contains("Specified Organization cannot sponsor other organizations.", exception.Message); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() @@ -91,7 +91,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase sutProvider.GetDependency().GetUserByIdAsync(orgUser.UserId.Value).Returns(user); var exception = await Assert.ThrowsAsync(() => - sutProvider.Sut.CreateSponsorshipAsync(org, orgUser, PlanSponsorshipType.FamiliesForEnterprise, default, default)); + sutProvider.Sut.CreateSponsorshipAsync(org, orgUser, PlanSponsorshipType.FamiliesForEnterprise, default, default, null)); Assert.Contains("Only confirmed users can sponsor other organizations.", exception.Message); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() @@ -115,7 +115,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase sutProvider.GetDependency().UserId.Returns(orgUser.UserId.Value); var exception = await Assert.ThrowsAsync(() => - sutProvider.Sut.CreateSponsorshipAsync(org, orgUser, sponsorship.PlanSponsorshipType.Value, default, default)); + sutProvider.Sut.CreateSponsorshipAsync(org, orgUser, sponsorship.PlanSponsorshipType.Value, default, default, null)); Assert.Contains("Can only sponsor one organization per Organization User.", exception.Message); await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() @@ -140,7 +140,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase await sutProvider.Sut.CreateSponsorshipAsync(sponsoringOrg, sponsoringOrgUser, - PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName); + PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName, null); var expectedSponsorship = new OrganizationSponsorship { @@ -150,7 +150,8 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase FriendlyName = friendlyName, OfferedToEmail = sponsoredEmail, PlanSponsorshipType = PlanSponsorshipType.FamiliesForEnterprise, - IsAdminInitiated = false + IsAdminInitiated = false, + Notes = null }; await sutProvider.GetDependency().Received(1) @@ -178,7 +179,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase var actualException = await Assert.ThrowsAsync(() => sutProvider.Sut.CreateSponsorshipAsync(sponsoringOrg, sponsoringOrgUser, - PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName)); + PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName, null)); Assert.Same(expectedException, actualException); await sutProvider.GetDependency().Received(1) @@ -213,7 +214,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase var actual = await Assert.ThrowsAsync(async () => await sutProvider.Sut.CreateSponsorshipAsync(sponsoringOrg, sponsoringOrgUser, - PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName)); + PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName, null)); Assert.Equal("You do not have permissions to send sponsorships on behalf of the organization.", actual.Message); } @@ -250,7 +251,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase var actual = await Assert.ThrowsAsync(async () => await sutProvider.Sut.CreateSponsorshipAsync(sponsoringOrg, sponsoringOrgUser, - PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName)); + PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName, null)); Assert.Equal("You do not have permissions to send sponsorships on behalf of the organization.", actual.Message); } @@ -262,7 +263,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase public async Task CreateSponsorship_CreatesAdminInitiatedSponsorship( OrganizationUserType organizationUserType, Organization sponsoringOrg, OrganizationUser sponsoringOrgUser, User user, string sponsoredEmail, - string friendlyName, Guid sponsorshipId, Guid currentUserId, SutProvider sutProvider) + string friendlyName, Guid sponsorshipId, Guid currentUserId, string notes, SutProvider sutProvider) { sponsoringOrg.PlanType = PlanType.EnterpriseAnnually; sponsoringOrgUser.Status = OrganizationUserStatusType.Confirmed; @@ -287,7 +288,7 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase ]); await sutProvider.Sut.CreateSponsorshipAsync(sponsoringOrg, sponsoringOrgUser, - PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName); + PlanSponsorshipType.FamiliesForEnterprise, sponsoredEmail, friendlyName, notes); var expectedSponsorship = new OrganizationSponsorship @@ -298,7 +299,8 @@ public class CreateSponsorshipCommandTests : FamiliesForEnterpriseTestsBase FriendlyName = friendlyName, OfferedToEmail = sponsoredEmail, PlanSponsorshipType = PlanSponsorshipType.FamiliesForEnterprise, - IsAdminInitiated = true + IsAdminInitiated = true, + Notes = notes }; await sutProvider.GetDependency().Received(1) diff --git a/util/Migrator/DbScripts/2025-03-14_00_AddUseAdminInitiatedSponsorship.sql b/util/Migrator/DbScripts/2025-03-14_00_AddUseAdminInitiatedSponsorship.sql index 89d48c0cf8..f3c120d75c 100644 --- a/util/Migrator/DbScripts/2025-03-14_00_AddUseAdminInitiatedSponsorship.sql +++ b/util/Migrator/DbScripts/2025-03-14_00_AddUseAdminInitiatedSponsorship.sql @@ -364,7 +364,8 @@ CREATE OR ALTER PROCEDURE [dbo].[OrganizationSponsorship_Update] @ToDelete BIT, @LastSyncDate DATETIME2 (7), @ValidUntil DATETIME2 (7), - @IsAdminInitiated BIT + @IsAdminInitiated BIT, + @Notes NVARCHAR(512) AS BEGIN SET NOCOUNT ON @@ -381,7 +382,8 @@ SET [ToDelete] = @ToDelete, [LastSyncDate] = @LastSyncDate, [ValidUntil] = @ValidUntil, - [IsAdminInitiated] = @IsAdminInitiated + [IsAdminInitiated] = @IsAdminInitiated, + [Notes] = @Notes WHERE [Id] = @Id END @@ -398,7 +400,8 @@ CREATE OR ALTER PROCEDURE [dbo].[OrganizationSponsorship_Create] @ToDelete BIT, @LastSyncDate DATETIME2 (7), @ValidUntil DATETIME2 (7), - @IsAdminInitiated BIT + @IsAdminInitiated BIT, + @Notes NVARCHAR(512) AS BEGIN SET NOCOUNT ON @@ -415,7 +418,8 @@ BEGIN [ToDelete], [LastSyncDate], [ValidUntil], - [IsAdminInitiated] + [IsAdminInitiated], + [Notes] ) VALUES ( @@ -429,7 +433,8 @@ BEGIN @ToDelete, @LastSyncDate, @ValidUntil, - @IsAdminInitiated + @IsAdminInitiated, + @Notes ) END GO; @@ -449,7 +454,8 @@ CREATE TYPE [dbo].[OrganizationSponsorshipType] AS TABLE( [LastSyncDate] DATETIME2(7), [ValidUntil] DATETIME2(7), [ToDelete] BIT, - [IsAdminInitiated] BIT + [IsAdminInitiated] BIT, + [Notes] NVARCHAR(512) ); GO; @@ -471,7 +477,8 @@ BEGIN [ToDelete], [LastSyncDate], [ValidUntil], - [IsAdminInitiated] + [IsAdminInitiated], + [Notes] ) SELECT OS.[Id], @@ -484,7 +491,8 @@ SELECT OS.[ToDelete], OS.[LastSyncDate], OS.[ValidUntil], - OS.[IsAdminInitiated] + OS.[IsAdminInitiated], + OS.[Notes] FROM @OrganizationSponsorshipsInput OS END @@ -509,7 +517,8 @@ SET [ToDelete] = OSI.[ToDelete], [LastSyncDate] = OSI.[LastSyncDate], [ValidUntil] = OSI.[ValidUntil], - [IsAdminInitiated] = OSI.[IsAdminInitiated] + [IsAdminInitiated] = OSI.[IsAdminInitiated], + [Notes] = OSI.[Notes] FROM [dbo].[OrganizationSponsorship] OS INNER JOIN diff --git a/util/MySqlMigrations/Migrations/20250312084349_PM17830_AdminInitiatedSponsorships.Designer.cs b/util/MySqlMigrations/Migrations/20250326092653_PM17830_AdminInitiatedSponsorships.Designer.cs similarity index 99% rename from util/MySqlMigrations/Migrations/20250312084349_PM17830_AdminInitiatedSponsorships.Designer.cs rename to util/MySqlMigrations/Migrations/20250326092653_PM17830_AdminInitiatedSponsorships.Designer.cs index 8dc9236fe3..ff9f22a15a 100644 --- a/util/MySqlMigrations/Migrations/20250312084349_PM17830_AdminInitiatedSponsorships.Designer.cs +++ b/util/MySqlMigrations/Migrations/20250326092653_PM17830_AdminInitiatedSponsorships.Designer.cs @@ -12,7 +12,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Bit.MySqlMigrations.Migrations { [DbContext(typeof(DatabaseContext))] - [Migration("20250312084349_PM17830_AdminInitiatedSponsorships")] + [Migration("20250326092653_PM17830_AdminInitiatedSponsorships")] partial class PM17830_AdminInitiatedSponsorships { /// @@ -1261,6 +1261,9 @@ namespace Bit.MySqlMigrations.Migrations b.Property("LastSyncDate") .HasColumnType("datetime(6)"); + b.Property("Notes") + .HasColumnType("longtext"); + b.Property("OfferedToEmail") .HasMaxLength(256) .HasColumnType("varchar(256)"); diff --git a/util/MySqlMigrations/Migrations/20250312084349_PM17830_AdminInitiatedSponsorships.cs b/util/MySqlMigrations/Migrations/20250326092653_PM17830_AdminInitiatedSponsorships.cs similarity index 76% rename from util/MySqlMigrations/Migrations/20250312084349_PM17830_AdminInitiatedSponsorships.cs rename to util/MySqlMigrations/Migrations/20250326092653_PM17830_AdminInitiatedSponsorships.cs index f37c2f30f4..11b2ca5dfa 100644 --- a/util/MySqlMigrations/Migrations/20250312084349_PM17830_AdminInitiatedSponsorships.cs +++ b/util/MySqlMigrations/Migrations/20250326092653_PM17830_AdminInitiatedSponsorships.cs @@ -17,6 +17,13 @@ public partial class PM17830_AdminInitiatedSponsorships : Migration nullable: false, defaultValue: false); + migrationBuilder.AddColumn( + name: "Notes", + table: "OrganizationSponsorship", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + migrationBuilder.AddColumn( name: "UseAdminSponsoredFamilies", table: "Organization", @@ -32,6 +39,10 @@ public partial class PM17830_AdminInitiatedSponsorships : Migration name: "IsAdminInitiated", table: "OrganizationSponsorship"); + migrationBuilder.DropColumn( + name: "Notes", + table: "OrganizationSponsorship"); + migrationBuilder.DropColumn( name: "UseAdminSponsoredFamilies", table: "Organization"); diff --git a/util/MySqlMigrations/Migrations/DatabaseContextModelSnapshot.cs b/util/MySqlMigrations/Migrations/DatabaseContextModelSnapshot.cs index ba6a46c96d..92c88e3ca5 100644 --- a/util/MySqlMigrations/Migrations/DatabaseContextModelSnapshot.cs +++ b/util/MySqlMigrations/Migrations/DatabaseContextModelSnapshot.cs @@ -1258,6 +1258,9 @@ namespace Bit.MySqlMigrations.Migrations b.Property("LastSyncDate") .HasColumnType("datetime(6)"); + b.Property("Notes") + .HasColumnType("longtext"); + b.Property("OfferedToEmail") .HasMaxLength(256) .HasColumnType("varchar(256)"); diff --git a/util/PostgresMigrations/Migrations/20250312084357_PM17830_AdminInitiatedSponsorships.Designer.cs b/util/PostgresMigrations/Migrations/20250326092700_PM17830_AdminInitiatedSponsorships.Designer.cs similarity index 99% rename from util/PostgresMigrations/Migrations/20250312084357_PM17830_AdminInitiatedSponsorships.Designer.cs rename to util/PostgresMigrations/Migrations/20250326092700_PM17830_AdminInitiatedSponsorships.Designer.cs index a5883a7f9e..e55146fa30 100644 --- a/util/PostgresMigrations/Migrations/20250312084357_PM17830_AdminInitiatedSponsorships.Designer.cs +++ b/util/PostgresMigrations/Migrations/20250326092700_PM17830_AdminInitiatedSponsorships.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Bit.PostgresMigrations.Migrations { [DbContext(typeof(DatabaseContext))] - [Migration("20250312084357_PM17830_AdminInitiatedSponsorships")] + [Migration("20250326092700_PM17830_AdminInitiatedSponsorships")] partial class PM17830_AdminInitiatedSponsorships { /// @@ -1266,6 +1266,9 @@ namespace Bit.PostgresMigrations.Migrations b.Property("LastSyncDate") .HasColumnType("timestamp with time zone"); + b.Property("Notes") + .HasColumnType("text"); + b.Property("OfferedToEmail") .HasMaxLength(256) .HasColumnType("character varying(256)"); diff --git a/util/PostgresMigrations/Migrations/20250312084357_PM17830_AdminInitiatedSponsorships.cs b/util/PostgresMigrations/Migrations/20250326092700_PM17830_AdminInitiatedSponsorships.cs similarity index 79% rename from util/PostgresMigrations/Migrations/20250312084357_PM17830_AdminInitiatedSponsorships.cs rename to util/PostgresMigrations/Migrations/20250326092700_PM17830_AdminInitiatedSponsorships.cs index 8b6ce63859..4507686e8f 100644 --- a/util/PostgresMigrations/Migrations/20250312084357_PM17830_AdminInitiatedSponsorships.cs +++ b/util/PostgresMigrations/Migrations/20250326092700_PM17830_AdminInitiatedSponsorships.cs @@ -17,6 +17,12 @@ public partial class PM17830_AdminInitiatedSponsorships : Migration nullable: false, defaultValue: false); + migrationBuilder.AddColumn( + name: "Notes", + table: "OrganizationSponsorship", + type: "text", + nullable: true); + migrationBuilder.AddColumn( name: "UseAdminSponsoredFamilies", table: "Organization", @@ -32,6 +38,10 @@ public partial class PM17830_AdminInitiatedSponsorships : Migration name: "IsAdminInitiated", table: "OrganizationSponsorship"); + migrationBuilder.DropColumn( + name: "Notes", + table: "OrganizationSponsorship"); + migrationBuilder.DropColumn( name: "UseAdminSponsoredFamilies", table: "Organization"); diff --git a/util/PostgresMigrations/Migrations/DatabaseContextModelSnapshot.cs b/util/PostgresMigrations/Migrations/DatabaseContextModelSnapshot.cs index 6ddd04add8..be4e68d840 100644 --- a/util/PostgresMigrations/Migrations/DatabaseContextModelSnapshot.cs +++ b/util/PostgresMigrations/Migrations/DatabaseContextModelSnapshot.cs @@ -1263,6 +1263,9 @@ namespace Bit.PostgresMigrations.Migrations b.Property("LastSyncDate") .HasColumnType("timestamp with time zone"); + b.Property("Notes") + .HasColumnType("text"); + b.Property("OfferedToEmail") .HasMaxLength(256) .HasColumnType("character varying(256)"); diff --git a/util/SqliteMigrations/Migrations/20250312084403_PM17830_AdminInitiatedSponsorships.Designer.cs b/util/SqliteMigrations/Migrations/20250326092645_PM17830_AdminInitiatedSponsorships.Designer.cs similarity index 99% rename from util/SqliteMigrations/Migrations/20250312084403_PM17830_AdminInitiatedSponsorships.Designer.cs rename to util/SqliteMigrations/Migrations/20250326092645_PM17830_AdminInitiatedSponsorships.Designer.cs index df5db8b8ca..4cdb9e514f 100644 --- a/util/SqliteMigrations/Migrations/20250312084403_PM17830_AdminInitiatedSponsorships.Designer.cs +++ b/util/SqliteMigrations/Migrations/20250326092645_PM17830_AdminInitiatedSponsorships.Designer.cs @@ -11,7 +11,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Bit.SqliteMigrations.Migrations { [DbContext(typeof(DatabaseContext))] - [Migration("20250312084403_PM17830_AdminInitiatedSponsorships")] + [Migration("20250326092645_PM17830_AdminInitiatedSponsorships")] partial class PM17830_AdminInitiatedSponsorships { /// @@ -1250,6 +1250,9 @@ namespace Bit.SqliteMigrations.Migrations b.Property("LastSyncDate") .HasColumnType("TEXT"); + b.Property("Notes") + .HasColumnType("TEXT"); + b.Property("OfferedToEmail") .HasMaxLength(256) .HasColumnType("TEXT"); diff --git a/util/SqliteMigrations/Migrations/20250312084403_PM17830_AdminInitiatedSponsorships.cs b/util/SqliteMigrations/Migrations/20250326092645_PM17830_AdminInitiatedSponsorships.cs similarity index 79% rename from util/SqliteMigrations/Migrations/20250312084403_PM17830_AdminInitiatedSponsorships.cs rename to util/SqliteMigrations/Migrations/20250326092645_PM17830_AdminInitiatedSponsorships.cs index 64fc52651c..5d28771b4c 100644 --- a/util/SqliteMigrations/Migrations/20250312084403_PM17830_AdminInitiatedSponsorships.cs +++ b/util/SqliteMigrations/Migrations/20250326092645_PM17830_AdminInitiatedSponsorships.cs @@ -17,6 +17,12 @@ public partial class PM17830_AdminInitiatedSponsorships : Migration nullable: false, defaultValue: false); + migrationBuilder.AddColumn( + name: "Notes", + table: "OrganizationSponsorship", + type: "TEXT", + nullable: true); + migrationBuilder.AddColumn( name: "UseAdminSponsoredFamilies", table: "Organization", @@ -32,6 +38,10 @@ public partial class PM17830_AdminInitiatedSponsorships : Migration name: "IsAdminInitiated", table: "OrganizationSponsorship"); + migrationBuilder.DropColumn( + name: "Notes", + table: "OrganizationSponsorship"); + migrationBuilder.DropColumn( name: "UseAdminSponsoredFamilies", table: "Organization"); diff --git a/util/SqliteMigrations/Migrations/DatabaseContextModelSnapshot.cs b/util/SqliteMigrations/Migrations/DatabaseContextModelSnapshot.cs index 71bf12bee2..2dab5acaf7 100644 --- a/util/SqliteMigrations/Migrations/DatabaseContextModelSnapshot.cs +++ b/util/SqliteMigrations/Migrations/DatabaseContextModelSnapshot.cs @@ -1247,6 +1247,9 @@ namespace Bit.SqliteMigrations.Migrations b.Property("LastSyncDate") .HasColumnType("TEXT"); + b.Property("Notes") + .HasColumnType("TEXT"); + b.Property("OfferedToEmail") .HasMaxLength(256) .HasColumnType("TEXT");