Implement pricing management functionality and update related components
CI / Backend (build + test) (push) Successful in 1m19s
CI / Frontend (lint + typecheck + build) (push) Successful in 32s

- Added new endpoints for managing global pricing settings, including retrieval and updates for `PricePerConfigPerQuarter` and `PricePerConfigPerYear`.
- Updated `RoleService` and related commands to remove pricing fields from role management, ensuring a clear separation between role configurations and global pricing.
- Enhanced the `FactoryResetCommandHandler` to include seeding of pricing settings during a factory reset.
- Modified frontend components to support new pricing settings, including forms for creating and updating pricing information.
- Updated API documentation to reflect changes in pricing management endpoints and their expected request/response formats.
- Adjusted tests to ensure proper coverage for new pricing functionalities and their integration with existing role management features.
This commit is contained in:
Leonid Pershin
2026-07-18 19:34:29 +03:00
parent 285d8180c8
commit ae379f8e0f
54 changed files with 2516 additions and 268 deletions
@@ -23,6 +23,8 @@ public class FactoryResetCommandHandlerTests
Substitute.For<IClientAppCatalogSeeder>();
private readonly IInstructionIntroSeeder _instructionIntroSeeder =
Substitute.For<IInstructionIntroSeeder>();
private readonly IPricingSettingsSeeder _pricingSettingsSeeder =
Substitute.For<IPricingSettingsSeeder>();
[Fact]
public async Task Handle_WipesEverythingExceptCurrentAdminAndSystemRoles()
@@ -104,6 +106,7 @@ public class FactoryResetCommandHandlerTests
_fileStorage,
_catalogSeeder,
_instructionIntroSeeder,
_pricingSettingsSeeder,
currentUser
);
@@ -144,5 +147,6 @@ public class FactoryResetCommandHandlerTests
await _fileStorage.Received(1).DeleteAsync("stored-name", Arg.Any<CancellationToken>());
await _catalogSeeder.Received(1).SeedIfEmptyAsync(Arg.Any<CancellationToken>());
await _instructionIntroSeeder.Received(1).SeedIfEmptyAsync(Arg.Any<CancellationToken>());
await _pricingSettingsSeeder.Received(1).SeedIfEmptyAsync(Arg.Any<CancellationToken>());
}
}
@@ -27,7 +27,7 @@ public class ApproveRoleRequestCommandHandlerTests
var newRoleId = Guid.NewGuid();
_roleService
.CreateRoleAsync("premium", 10, 5, null, null, Arg.Any<CancellationToken>())
.CreateRoleAsync("premium", 10, 5, Arg.Any<CancellationToken>())
.Returns(Result.Success(new RoleDto(newRoleId, "premium", 10, 5, false)));
_roleService
.ChangeUserRoleAsync(userId, newRoleId, Arg.Any<CancellationToken>())
@@ -51,7 +51,7 @@ public class ApproveRoleRequestCommandHandlerTests
Assert.Equal(TicketStatus.Resolved, ticket.Status);
await _roleService
.Received(1)
.CreateRoleAsync("premium", 10, 5, null, null, Arg.Any<CancellationToken>());
.CreateRoleAsync("premium", 10, 5, Arg.Any<CancellationToken>());
await _roleService
.Received(1)
.ChangeUserRoleAsync(userId, newRoleId, Arg.Any<CancellationToken>());
@@ -100,8 +100,6 @@ public class ApproveRoleRequestCommandHandlerTests
Arg.Any<string>(),
Arg.Any<int>(),
Arg.Any<int>(),
Arg.Any<int?>(),
Arg.Any<int?>(),
Arg.Any<CancellationToken>()
);
}