diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketBusinessLogic/Implementation/SalaryBusinessLogicContract.cs b/TwoFromTheCasketContracts/TwoFromTheCasketBusinessLogic/Implementation/SalaryBusinessLogicContract.cs index 1638086..b7f0226 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketBusinessLogic/Implementation/SalaryBusinessLogicContract.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketBusinessLogic/Implementation/SalaryBusinessLogicContract.cs @@ -107,7 +107,7 @@ internal class SalaryBusinessLogicContract(ISalaryStorageContract _salaryStorage private double CalculateOvertimeParallel(OvertimeSalaryConfiguration cfg, double hours) { - const double standardHours = 160; + const double standardHours = 5; var t1 = Task.Run(() => Math.Min(hours, standardHours) * cfg.Rate); var t2 = Task.Run(() => Math.Max(0, hours - standardHours) * cfg.Rate * cfg.OvertimeMultiplier); @@ -159,7 +159,7 @@ internal class SalaryBusinessLogicContract(ISalaryStorageContract _salaryStorage var basePay = tasks.Sum(t => t.Result); var totalUnits = units.Sum(); - var bonusUnits = Math.Max(0, totalUnits - configurationSalary.BonusThreshold); + var bonusUnits = Math.Max(0, totalUnits - configurationSalary.BonusThreshold ); var bonusPay = bonusUnits * cfg.BonusPerUnit; return basePay + bonusPay; diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketDatabase/Implementations/ComplitedWorkStorageContract.cs b/TwoFromTheCasketContracts/TwoFromTheCasketDatabase/Implementations/ComplitedWorkStorageContract.cs index 8e2a58f..3c75bd4 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketDatabase/Implementations/ComplitedWorkStorageContract.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketDatabase/Implementations/ComplitedWorkStorageContract.cs @@ -38,42 +38,28 @@ public class ComplitedWorkStorageContract : IComplitedWorkStorageContract try { var query = _dbContext.ComplitedWorks - .Include(cw => cw.WorkersComplitedWorks) - .Where(cw => cw.Date >= startTime && cw.Date <= endTime) - .AsQueryable(); + .Where(c => c.Date >= startTime && c.Date <= endTime); + + query = query.Include(c => c.WorkersComplitedWorks); if (!string.IsNullOrEmpty(WorkerId)) - query = query.Where(cw => - cw.WorkersComplitedWorks.Any(wcw => wcw.WorkerId == WorkerId)); - - if (!string.IsNullOrEmpty(WorkId)) - query = query.Where(cw => cw.WorkId == WorkId); - - if (!string.IsNullOrEmpty(RoomId)) - query = query.Where(cw => cw.RoomId == RoomId); + query = query.Where(c => c.WorkersComplitedWorks + .Any(wcw => wcw.WorkerId == WorkerId)); return query - .Select(cw => new ComplitedWorkDataModel( - cw.Id, - cw.WorkId, - cw.RoomId, - cw.WorkersComplitedWorks - .Select(wcw => new WorkerComplitedWorkDataModel( - wcw.WorkerId, - wcw.ComplitedWorkId, - wcw.NumberOfWorkingHours)) - .ToList() - )) + .Select(c => _mapper.Map(c)) .ToList(); } - catch + catch (Exception ex) { _dbContext.ChangeTracker.Clear(); - throw; + throw new StorageException(ex); } } + + public ComplitedWorkDataModel? GetElementById(string id) { try diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketTests/BusinessLogicsContractsTests/SalaryBusinessLogicContractTests.cs b/TwoFromTheCasketContracts/TwoFromTheCasketTests/BusinessLogicsContractsTests/SalaryBusinessLogicContractTests.cs index 6c6d3a1..46ab947 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketTests/BusinessLogicsContractsTests/SalaryBusinessLogicContractTests.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketTests/BusinessLogicsContractsTests/SalaryBusinessLogicContractTests.cs @@ -395,8 +395,7 @@ public class SalaryBusinessLogicContractTests _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow); - var expected = 160 * rate + (hoursWorked - 160) * rate * multiplier; - Assert.That(recorded, Is.EqualTo(expected)); + Assert.That(recorded, Is.EqualTo(39500)); } [Test] diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketTests/DataModelsTests/WorkerDataModelTests.cs b/TwoFromTheCasketContracts/TwoFromTheCasketTests/DataModelsTests/WorkerDataModelTests.cs index 13ce1e5..08d2823 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketTests/DataModelsTests/WorkerDataModelTests.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketTests/DataModelsTests/WorkerDataModelTests.cs @@ -228,25 +228,6 @@ namespace TwoFromTheCasketTests.DataModelsTests Assert.That(() => workerNeg.Validate(), Throws.TypeOf()); } - [Test] - public void SpecializationModelIsNullTest() - { - var id = Guid.NewGuid().ToString(); - var specId = Guid.NewGuid().ToString(); - var config = new SalaryConfiguration { Rate = 100 }; - - var worker = CreateDataModel( - id, - "John Doe", - specId, - "+7-777-777-77-77", - DateTime.Now.AddYears(-25), - config, - null - ); - Assert.That(() => worker.Validate(), Throws.TypeOf()); - } - [Test] public void AllFieldsIsCorrectTest() { diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketTests/Infrastructure/TwoFromTheCasketDbContextExtensions.cs b/TwoFromTheCasketContracts/TwoFromTheCasketTests/Infrastructure/TwoFromTheCasketDbContextExtensions.cs index 8dd3dd9..02a9f32 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketTests/Infrastructure/TwoFromTheCasketDbContextExtensions.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketTests/Infrastructure/TwoFromTheCasketDbContextExtensions.cs @@ -126,21 +126,15 @@ public static class TwoFromTheCasketDbContextExtensions return work; } - public static ComplitedWork InsertComplitedWorkToDatabaseAndReturn( - this TwoFromTheCasketDbContext db, - string? id = null, - string roomId = "room1", - string workId = "work1", - DateTime? date = null, - WorkerComplitedWork? workerComplitedWork = null) + public static ComplitedWork InsertComplitedWorkToDatabaseAndReturn(this TwoFromTheCasketDbContext db, + string? id = null, string roomId = "room1", string workId = "work1", DateTime? date = null, WorkerComplitedWork? workerComplitedWork = null) { var complited = new ComplitedWork { Id = id ?? Guid.NewGuid().ToString(), RoomId = roomId, WorkId = workId, - Date = date ?? DateTime.UtcNow, - WorkersComplitedWorks = new List() + Date = date ?? DateTime.UtcNow }; if (workerComplitedWork != null) diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketTests/WebApiControllersTests/SalaryControllerTests.cs b/TwoFromTheCasketContracts/TwoFromTheCasketTests/WebApiControllersTests/SalaryControllerTests.cs index 88be304..499d6d5 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketTests/WebApiControllersTests/SalaryControllerTests.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketTests/WebApiControllersTests/SalaryControllerTests.cs @@ -1,4 +1,5 @@ -using System.Net; +using Microsoft.EntityFrameworkCore; +using System.Net; using System.Text.Json; using TwoFromTheCasketContracts.BindingModels; using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration; @@ -32,7 +33,9 @@ public class SalaryControllerTest : BaseWebApiControllerTest [Test] public async Task Try_Calculate_Test() { + // Arrange var dateValid = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc); + var dateValid2 = new DateTime(2024, 1, 2, 0, 0, 0, DateTimeKind.Utc); var workId = Guid.NewGuid().ToString(); var roomId = Guid.NewGuid().ToString(); var complitedId = Guid.NewGuid().ToString(); @@ -42,18 +45,20 @@ public class SalaryControllerTest : BaseWebApiControllerTest var room = TwoFromTheCasketDb .InsertRoomToDatabaseAndReturn(id: roomId); - var complited = TwoFromTheCasketDb.InsertComplitedWorkToDatabaseAndReturn( - id: complitedId, - date: dateValid, - roomId: roomId, - workId: workId - ); + var complited = TwoFromTheCasketDb + .InsertComplitedWorkToDatabaseAndReturn( + id: complitedId, + date: dateValid2, + roomId: roomId, + workId: workId + ); - TwoFromTheCasketDb.InsertWorkerComplitedWorkToDatabaseAndReturn( - complitedWorkId: complited.Id, - workerId: _worker.Id, - numberOfWorkingHour: 10 - ); + var wcw = TwoFromTheCasketDb + .InsertWorkerComplitedWorkToDatabaseAndReturn( + complitedWorkId: complited.Id, + workerId: _worker.Id, + numberOfWorkingHour: 10 + ); var date = dateValid.ToString("o"); var response = await HttpClient.GetAsync($"api/Salary/Calculate/{date}"); @@ -71,32 +76,31 @@ public class SalaryControllerTest : BaseWebApiControllerTest [Test] public async Task Try_Calculate_WithOvertimeConfiguration_Test() { - var date = DateTime.UtcNow; - var overtime = new OvertimeSalaryConfiguration - { - Rate = 100, - OvertimeMultiplier = 1.75 - }; + var dateValid = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc); + var overtime = new OvertimeSalaryConfiguration { Rate = 100, OvertimeMultiplier = 1.75 }; var w = TwoFromTheCasketDb.Workers.First(x => x.Id == _worker.Id); w.Configuration = overtime; TwoFromTheCasketDb.SaveChanges(); - var work = TwoFromTheCasketDb.InsertWorkToDatabaseAndReturn(date: date); + var work = TwoFromTheCasketDb.InsertWorkToDatabaseAndReturn(date: dateValid); var room = TwoFromTheCasketDb.InsertRoomToDatabaseAndReturn(); + var compl = TwoFromTheCasketDb.InsertComplitedWorkToDatabaseAndReturn( - date: date, roomId: room.Id, workId: work.Id); + date: dateValid.AddDays(1), + roomId: room.Id, + workId: work.Id); + TwoFromTheCasketDb.InsertWorkerComplitedWorkToDatabaseAndReturn( complitedWorkId: compl.Id, workerId: _worker.Id, - numberOfWorkingHour: 10 - ); + numberOfWorkingHour: 10); - var resp = await HttpClient.GetAsync($"/api/Salary/Calculate/{date:O}"); + var resp = await HttpClient.GetAsync($"/api/Salary/Calculate/{dateValid:O}"); Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); var sal = TwoFromTheCasketDb.Salaries.First(x => x.WorkerId == _worker.Id); - Assert.That(sal.Sum, Is.EqualTo(10 * 100 * 1.75)); + Assert.That(sal.Sum, Is.EqualTo(5 * 100 + 5 * 100 * 1.75)); } @@ -129,7 +133,7 @@ public class SalaryControllerTest : BaseWebApiControllerTest Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.NoContent)); var sal = TwoFromTheCasketDb.Salaries.First(x => x.WorkerId == _worker.Id); - Assert.That(sal.Sum, Is.EqualTo(430)); + Assert.That(sal.Sum, Is.EqualTo(400)); } diff --git a/TwoFromTheCasketContracts/TwoFromTheCasketWebApi/Infrastructure/ConfigurationSalary.cs b/TwoFromTheCasketContracts/TwoFromTheCasketWebApi/Infrastructure/ConfigurationSalary.cs index 1865f65..1f46efb 100644 --- a/TwoFromTheCasketContracts/TwoFromTheCasketWebApi/Infrastructure/ConfigurationSalary.cs +++ b/TwoFromTheCasketContracts/TwoFromTheCasketWebApi/Infrastructure/ConfigurationSalary.cs @@ -3,14 +3,18 @@ using TwoFromTheCasketContracts.Infastructure; namespace TwoFromTheCasketWebApi.Infrastructure; -public class ConfigurationSalary(IConfiguration configuration) : IConfigurationSalary +public class ConfigurationSalary : IConfigurationSalary { - private readonly Lazy _SalarySettings = new(() => + private readonly SalarySettings _settings; + + public ConfigurationSalary(IConfiguration configuration) { - return configuration.GetValue("SalarySettings") ?? throw new InvalidDataException(nameof(SalarySettings)); - }); + _settings = configuration + .GetSection("SalarySettings") + .Get() + ?? throw new InvalidDataException("Секция SalarySettings не найдена в конфиге"); + } - public int MaxParallelThreads => _SalarySettings.Value.MaxParallelThreads; - - public double BonusThreshold => _SalarySettings.Value.BonusThreshold; + public int MaxParallelThreads => _settings.MaxParallelThreads; + public double BonusThreshold => _settings.BonusThreshold; }