mirror of
https://github.com/bitwarden/server.git
synced 2025-07-01 16:12:49 -05:00
[AC-1943] Add ProviderInvoiceItem table (#4163)
* Add ProviderInvoiceItem table * Run dotnet format
This commit is contained in:
26
src/Core/Billing/Entities/ProviderInvoiceItem.cs
Normal file
26
src/Core/Billing/Entities/ProviderInvoiceItem.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using Bit.Core.Entities;
|
||||
using Bit.Core.Utilities;
|
||||
|
||||
namespace Bit.Core.Billing.Entities;
|
||||
|
||||
public class ProviderInvoiceItem : ITableObject<Guid>
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public Guid ProviderId { get; set; }
|
||||
public string InvoiceId { get; set; }
|
||||
public string InvoiceNumber { get; set; }
|
||||
public string ClientName { get; set; }
|
||||
public string PlanName { get; set; }
|
||||
public int AssignedSeats { get; set; }
|
||||
public int UsedSeats { get; set; }
|
||||
public decimal Total { get; set; }
|
||||
public DateTime Created { get; set; }
|
||||
|
||||
public void SetNewId()
|
||||
{
|
||||
if (Id == default)
|
||||
{
|
||||
Id = CoreHelpers.GenerateComb();
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
using Bit.Core.Billing.Entities;
|
||||
using Bit.Core.Repositories;
|
||||
|
||||
namespace Bit.Core.Billing.Repositories;
|
||||
|
||||
public interface IProviderInvoiceItemRepository : IRepository<ProviderInvoiceItem, Guid>
|
||||
{
|
||||
Task<ProviderInvoiceItem> GetByInvoiceId(string invoiceId);
|
||||
Task<ICollection<ProviderInvoiceItem>> GetByProviderId(Guid providerId);
|
||||
}
|
@ -0,0 +1,40 @@
|
||||
using System.Data;
|
||||
using Bit.Core.Billing.Entities;
|
||||
using Bit.Core.Billing.Repositories;
|
||||
using Bit.Core.Settings;
|
||||
using Bit.Infrastructure.Dapper.Repositories;
|
||||
using Dapper;
|
||||
using Microsoft.Data.SqlClient;
|
||||
|
||||
namespace Bit.Infrastructure.Dapper.Billing.Repositories;
|
||||
|
||||
public class ProviderInvoiceItemRepository(
|
||||
GlobalSettings globalSettings)
|
||||
: Repository<ProviderInvoiceItem, Guid>(
|
||||
globalSettings.SqlServer.ConnectionString,
|
||||
globalSettings.SqlServer.ReadOnlyConnectionString), IProviderInvoiceItemRepository
|
||||
{
|
||||
public async Task<ProviderInvoiceItem> GetByInvoiceId(string invoiceId)
|
||||
{
|
||||
var sqlConnection = new SqlConnection(ConnectionString);
|
||||
|
||||
var results = await sqlConnection.QueryAsync<ProviderInvoiceItem>(
|
||||
"[dbo].[ProviderInvoiceItem_ReadByInvoiceId]",
|
||||
new { InvoiceId = invoiceId },
|
||||
commandType: CommandType.StoredProcedure);
|
||||
|
||||
return results.FirstOrDefault();
|
||||
}
|
||||
|
||||
public async Task<ICollection<ProviderInvoiceItem>> GetByProviderId(Guid providerId)
|
||||
{
|
||||
var sqlConnection = new SqlConnection(ConnectionString);
|
||||
|
||||
var results = await sqlConnection.QueryAsync<ProviderInvoiceItem>(
|
||||
"[dbo].[ProviderInvoiceItem_ReadByProviderId]",
|
||||
new { ProviderId = providerId },
|
||||
commandType: CommandType.StoredProcedure);
|
||||
|
||||
return results.ToArray();
|
||||
}
|
||||
}
|
@ -51,6 +51,7 @@ public static class DapperServiceCollectionExtensions
|
||||
services.AddSingleton<IOrganizationDomainRepository, OrganizationDomainRepository>();
|
||||
services.AddSingleton<IWebAuthnCredentialRepository, WebAuthnCredentialRepository>();
|
||||
services.AddSingleton<IProviderPlanRepository, ProviderPlanRepository>();
|
||||
services.AddSingleton<IProviderInvoiceItemRepository, ProviderInvoiceItemRepository>();
|
||||
|
||||
if (selfHosted)
|
||||
{
|
||||
|
@ -0,0 +1,21 @@
|
||||
using Bit.Infrastructure.EntityFramework.Billing.Models;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
||||
|
||||
namespace Bit.Infrastructure.EntityFramework.Billing.Configurations;
|
||||
|
||||
public class ProviderInvoiceItemEntityTypeConfiguration : IEntityTypeConfiguration<ProviderInvoiceItem>
|
||||
{
|
||||
public void Configure(EntityTypeBuilder<ProviderInvoiceItem> builder)
|
||||
{
|
||||
builder
|
||||
.Property(t => t.Id)
|
||||
.ValueGeneratedNever();
|
||||
|
||||
builder
|
||||
.HasIndex(providerInvoiceItem => new { providerInvoiceItem.Id, providerInvoiceItem.InvoiceId })
|
||||
.IsUnique();
|
||||
|
||||
builder.ToTable(nameof(ProviderInvoiceItem));
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
using AutoMapper;
|
||||
using Bit.Infrastructure.EntityFramework.AdminConsole.Models.Provider;
|
||||
|
||||
namespace Bit.Infrastructure.EntityFramework.Billing.Models;
|
||||
|
||||
// ReSharper disable once ClassWithVirtualMembersNeverInherited.Global
|
||||
public class ProviderInvoiceItem : Core.Billing.Entities.ProviderInvoiceItem
|
||||
{
|
||||
public virtual Provider Provider { get; set; }
|
||||
}
|
||||
|
||||
public class ProviderInvoiceItemMapperProfile : Profile
|
||||
{
|
||||
public ProviderInvoiceItemMapperProfile()
|
||||
{
|
||||
CreateMap<Core.Billing.Entities.ProviderInvoiceItem, ProviderInvoiceItem>().ReverseMap();
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ using Bit.Infrastructure.EntityFramework.AdminConsole.Models.Provider;
|
||||
|
||||
namespace Bit.Infrastructure.EntityFramework.Billing.Models;
|
||||
|
||||
// ReSharper disable once ClassWithVirtualMembersNeverInherited.Global
|
||||
public class ProviderPlan : Core.Billing.Entities.ProviderPlan
|
||||
{
|
||||
public virtual Provider Provider { get; set; }
|
||||
|
@ -0,0 +1,46 @@
|
||||
using AutoMapper;
|
||||
using Bit.Core.Billing.Entities;
|
||||
using Bit.Core.Billing.Repositories;
|
||||
using Bit.Infrastructure.EntityFramework.Repositories;
|
||||
using LinqToDB;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using EFProviderInvoiceItem = Bit.Infrastructure.EntityFramework.Billing.Models.ProviderInvoiceItem;
|
||||
|
||||
namespace Bit.Infrastructure.EntityFramework.Billing.Repositories;
|
||||
|
||||
public class ProviderInvoiceItemRepository(
|
||||
IMapper mapper,
|
||||
IServiceScopeFactory serviceScopeFactory)
|
||||
: Repository<ProviderInvoiceItem, EFProviderInvoiceItem, Guid>(
|
||||
serviceScopeFactory,
|
||||
mapper,
|
||||
context => context.ProviderInvoiceItems), IProviderInvoiceItemRepository
|
||||
{
|
||||
public async Task<ProviderInvoiceItem> GetByInvoiceId(string invoiceId)
|
||||
{
|
||||
using var serviceScope = ServiceScopeFactory.CreateScope();
|
||||
|
||||
var databaseContext = GetDatabaseContext(serviceScope);
|
||||
|
||||
var query =
|
||||
from providerInvoiceItem in databaseContext.ProviderInvoiceItems
|
||||
where providerInvoiceItem.InvoiceId == invoiceId
|
||||
select providerInvoiceItem;
|
||||
|
||||
return await query.FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
public async Task<ICollection<ProviderInvoiceItem>> GetByProviderId(Guid providerId)
|
||||
{
|
||||
using var serviceScope = ServiceScopeFactory.CreateScope();
|
||||
|
||||
var databaseContext = GetDatabaseContext(serviceScope);
|
||||
|
||||
var query =
|
||||
from providerInvoiceItem in databaseContext.ProviderInvoiceItems
|
||||
where providerInvoiceItem.ProviderId == providerId
|
||||
select providerInvoiceItem;
|
||||
|
||||
return await query.ToArrayAsync();
|
||||
}
|
||||
}
|
@ -88,6 +88,7 @@ public static class EntityFrameworkServiceCollectionExtensions
|
||||
services.AddSingleton<IOrganizationDomainRepository, OrganizationDomainRepository>();
|
||||
services.AddSingleton<IWebAuthnCredentialRepository, WebAuthnCredentialRepository>();
|
||||
services.AddSingleton<IProviderPlanRepository, ProviderPlanRepository>();
|
||||
services.AddSingleton<IProviderInvoiceItemRepository, ProviderInvoiceItemRepository>();
|
||||
|
||||
if (selfHosted)
|
||||
{
|
||||
|
@ -67,6 +67,7 @@ public class DatabaseContext : DbContext
|
||||
public DbSet<OrganizationDomain> OrganizationDomains { get; set; }
|
||||
public DbSet<WebAuthnCredential> WebAuthnCredentials { get; set; }
|
||||
public DbSet<ProviderPlan> ProviderPlans { get; set; }
|
||||
public DbSet<ProviderInvoiceItem> ProviderInvoiceItems { get; set; }
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder builder)
|
||||
{
|
||||
|
@ -0,0 +1,41 @@
|
||||
CREATE PROCEDURE [dbo].[ProviderInvoiceItem_Create]
|
||||
@Id UNIQUEIDENTIFIER OUTPUT,
|
||||
@ProviderId UNIQUEIDENTIFIER,
|
||||
@InvoiceId VARCHAR (50),
|
||||
@InvoiceNumber VARCHAR (50),
|
||||
@ClientName NVARCHAR (50),
|
||||
@PlanName NVARCHAR (50),
|
||||
@AssignedSeats INT,
|
||||
@UsedSeats INT,
|
||||
@Total MONEY
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
INSERT INTO [dbo].[ProviderInvoiceItem]
|
||||
(
|
||||
[Id],
|
||||
[ProviderId],
|
||||
[InvoiceId],
|
||||
[InvoiceNumber],
|
||||
[ClientName],
|
||||
[PlanName],
|
||||
[AssignedSeats],
|
||||
[UsedSeats],
|
||||
[Total],
|
||||
[Created]
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
@Id,
|
||||
@ProviderId,
|
||||
@InvoiceId,
|
||||
@InvoiceNumber,
|
||||
@ClientName,
|
||||
@PlanName,
|
||||
@AssignedSeats,
|
||||
@UsedSeats,
|
||||
@Total,
|
||||
GETUTCDATE()
|
||||
)
|
||||
END
|
@ -0,0 +1,12 @@
|
||||
CREATE PROCEDURE [dbo].[ProviderInvoiceItem_DeleteById]
|
||||
@Id UNIQUEIDENTIFIER
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
DELETE
|
||||
FROM
|
||||
[dbo].[ProviderInvoiceItem]
|
||||
WHERE
|
||||
[Id] = @Id
|
||||
END
|
@ -0,0 +1,13 @@
|
||||
CREATE PROCEDURE [dbo].[ProviderInvoiceItem_ReadById]
|
||||
@Id UNIQUEIDENTIFIER
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
[dbo].[ProviderInvoiceItemView]
|
||||
WHERE
|
||||
[Id] = @Id
|
||||
END
|
@ -0,0 +1,13 @@
|
||||
CREATE PROCEDURE [dbo].[ProviderInvoiceItem_ReadByInvoiceId]
|
||||
@InvoiceId VARCHAR (50)
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
[dbo].[ProviderInvoiceItemView]
|
||||
WHERE
|
||||
[InvoiceId] = @InvoiceId
|
||||
END
|
@ -0,0 +1,13 @@
|
||||
CREATE PROCEDURE [dbo].[ProviderInvoiceItem_ReadByProviderId]
|
||||
@ProviderId UNIQUEIDENTIFIER
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
[dbo].[ProviderInvoiceItemView]
|
||||
WHERE
|
||||
[ProviderId] = @ProviderId
|
||||
END
|
@ -0,0 +1,28 @@
|
||||
CREATE PROCEDURE [dbo].[ProviderInvoiceItem_Update]
|
||||
@Id UNIQUEIDENTIFIER,
|
||||
@ProviderId UNIQUEIDENTIFIER,
|
||||
@InvoiceId VARCHAR (50),
|
||||
@InvoiceNumber VARCHAR (50),
|
||||
@ClientName NVARCHAR (50),
|
||||
@PlanName NVARCHAR (50),
|
||||
@AssignedSeats INT,
|
||||
@UsedSeats INT,
|
||||
@Total MONEY
|
||||
AS
|
||||
BEGIN
|
||||
SET NOCOUNT ON
|
||||
|
||||
UPDATE
|
||||
[dbo].[ProviderInvoiceItem]
|
||||
SET
|
||||
[ProviderId] = @ProviderId,
|
||||
[InvoiceId] = @InvoiceId,
|
||||
[InvoiceNumber] = @InvoiceNumber,
|
||||
[ClientName] = @ClientName,
|
||||
[PlanName] = @PlanName,
|
||||
[AssignedSeats] = @AssignedSeats,
|
||||
[UsedSeats] = @UsedSeats,
|
||||
[Total] = @Total
|
||||
WHERE
|
||||
[Id] = @Id
|
||||
END
|
15
src/Sql/Billing/Tables/ProviderInvoiceItem.sql
Normal file
15
src/Sql/Billing/Tables/ProviderInvoiceItem.sql
Normal file
@ -0,0 +1,15 @@
|
||||
CREATE TABLE [dbo].[ProviderInvoiceItem] (
|
||||
[Id] UNIQUEIDENTIFIER NOT NULL,
|
||||
[ProviderId] UNIQUEIDENTIFIER NOT NULL,
|
||||
[InvoiceId] VARCHAR (50) NOT NULL,
|
||||
[InvoiceNumber] VARCHAR (50) NOT NULL,
|
||||
[ClientName] NVARCHAR (50) NOT NULL,
|
||||
[PlanName] NVARCHAR (50) NOT NULL,
|
||||
[AssignedSeats] INT NOT NULL,
|
||||
[UsedSeats] INT NOT NULL,
|
||||
[Total] MONEY NOT NULL,
|
||||
[Created] DATETIME2 (7) NOT NULL,
|
||||
CONSTRAINT [PK_ProviderInvoiceItem] PRIMARY KEY CLUSTERED ([Id] ASC),
|
||||
CONSTRAINT [FK_ProviderInvoiceItem_Provider] FOREIGN KEY ([ProviderId]) REFERENCES [dbo].[Provider] ([Id]),
|
||||
CONSTRAINT [PK_ProviderIdInvoiceId] UNIQUE ([ProviderId], [InvoiceId])
|
||||
);
|
6
src/Sql/Billing/Views/ProviderInvoiceItemView.sql
Normal file
6
src/Sql/Billing/Views/ProviderInvoiceItemView.sql
Normal file
@ -0,0 +1,6 @@
|
||||
CREATE VIEW [dbo].[ProviderInvoiceItemView]
|
||||
AS
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
[dbo].[ProviderInvoiceItem]
|
Reference in New Issue
Block a user