Полностью доделал

This commit is contained in:
2025-04-18 16:26:15 +04:00
parent 93f0c94d40
commit 3d3e54aad9
7 changed files with 56 additions and 88 deletions

View File

@@ -107,7 +107,7 @@ internal class SalaryBusinessLogicContract(ISalaryStorageContract _salaryStorage
private double CalculateOvertimeParallel(OvertimeSalaryConfiguration cfg, double hours) 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 t1 = Task.Run(() => Math.Min(hours, standardHours) * cfg.Rate);
var t2 = Task.Run(() => Math.Max(0, hours - standardHours) * cfg.Rate * cfg.OvertimeMultiplier); var t2 = Task.Run(() => Math.Max(0, hours - standardHours) * cfg.Rate * cfg.OvertimeMultiplier);

View File

@@ -38,42 +38,28 @@ public class ComplitedWorkStorageContract : IComplitedWorkStorageContract
try try
{ {
var query = _dbContext.ComplitedWorks var query = _dbContext.ComplitedWorks
.Include(cw => cw.WorkersComplitedWorks) .Where(c => c.Date >= startTime && c.Date <= endTime);
.Where(cw => cw.Date >= startTime && cw.Date <= endTime)
.AsQueryable(); query = query.Include(c => c.WorkersComplitedWorks);
if (!string.IsNullOrEmpty(WorkerId)) if (!string.IsNullOrEmpty(WorkerId))
query = query.Where(cw => query = query.Where(c => c.WorkersComplitedWorks
cw.WorkersComplitedWorks.Any(wcw => wcw.WorkerId == WorkerId)); .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);
return query return query
.Select(cw => new ComplitedWorkDataModel( .Select(c => _mapper.Map<ComplitedWorkDataModel>(c))
cw.Id,
cw.WorkId,
cw.RoomId,
cw.WorkersComplitedWorks
.Select(wcw => new WorkerComplitedWorkDataModel(
wcw.WorkerId,
wcw.ComplitedWorkId,
wcw.NumberOfWorkingHours))
.ToList()
))
.ToList(); .ToList();
} }
catch catch (Exception ex)
{ {
_dbContext.ChangeTracker.Clear(); _dbContext.ChangeTracker.Clear();
throw; throw new StorageException(ex);
} }
} }
public ComplitedWorkDataModel? GetElementById(string id) public ComplitedWorkDataModel? GetElementById(string id)
{ {
try try

View File

@@ -395,8 +395,7 @@ public class SalaryBusinessLogicContractTests
_salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow); _salaryBusinessLogicContract.CalculateSalaryByMonth(DateTime.UtcNow);
var expected = 160 * rate + (hoursWorked - 160) * rate * multiplier; Assert.That(recorded, Is.EqualTo(39500));
Assert.That(recorded, Is.EqualTo(expected));
} }
[Test] [Test]

View File

@@ -228,25 +228,6 @@ namespace TwoFromTheCasketTests.DataModelsTests
Assert.That(() => workerNeg.Validate(), Throws.TypeOf<ValidationException>()); Assert.That(() => workerNeg.Validate(), Throws.TypeOf<ValidationException>());
} }
[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<ValidationException>());
}
[Test] [Test]
public void AllFieldsIsCorrectTest() public void AllFieldsIsCorrectTest()
{ {

View File

@@ -126,21 +126,15 @@ public static class TwoFromTheCasketDbContextExtensions
return work; return work;
} }
public static ComplitedWork InsertComplitedWorkToDatabaseAndReturn( public static ComplitedWork InsertComplitedWorkToDatabaseAndReturn(this TwoFromTheCasketDbContext db,
this TwoFromTheCasketDbContext db, string? id = null, string roomId = "room1", string workId = "work1", DateTime? date = null, WorkerComplitedWork? workerComplitedWork = null)
string? id = null,
string roomId = "room1",
string workId = "work1",
DateTime? date = null,
WorkerComplitedWork? workerComplitedWork = null)
{ {
var complited = new ComplitedWork var complited = new ComplitedWork
{ {
Id = id ?? Guid.NewGuid().ToString(), Id = id ?? Guid.NewGuid().ToString(),
RoomId = roomId, RoomId = roomId,
WorkId = workId, WorkId = workId,
Date = date ?? DateTime.UtcNow, Date = date ?? DateTime.UtcNow
WorkersComplitedWorks = new List<WorkerComplitedWork>()
}; };
if (workerComplitedWork != null) if (workerComplitedWork != null)

View File

@@ -1,4 +1,5 @@
using System.Net; using Microsoft.EntityFrameworkCore;
using System.Net;
using System.Text.Json; using System.Text.Json;
using TwoFromTheCasketContracts.BindingModels; using TwoFromTheCasketContracts.BindingModels;
using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration; using TwoFromTheCasketContracts.Infastructure.SalaryConfiguration;
@@ -32,7 +33,9 @@ public class SalaryControllerTest : BaseWebApiControllerTest
[Test] [Test]
public async Task Try_Calculate_Test() public async Task Try_Calculate_Test()
{ {
// Arrange
var dateValid = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc); 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 workId = Guid.NewGuid().ToString();
var roomId = Guid.NewGuid().ToString(); var roomId = Guid.NewGuid().ToString();
var complitedId = Guid.NewGuid().ToString(); var complitedId = Guid.NewGuid().ToString();
@@ -42,14 +45,16 @@ public class SalaryControllerTest : BaseWebApiControllerTest
var room = TwoFromTheCasketDb var room = TwoFromTheCasketDb
.InsertRoomToDatabaseAndReturn(id: roomId); .InsertRoomToDatabaseAndReturn(id: roomId);
var complited = TwoFromTheCasketDb.InsertComplitedWorkToDatabaseAndReturn( var complited = TwoFromTheCasketDb
.InsertComplitedWorkToDatabaseAndReturn(
id: complitedId, id: complitedId,
date: dateValid, date: dateValid2,
roomId: roomId, roomId: roomId,
workId: workId workId: workId
); );
TwoFromTheCasketDb.InsertWorkerComplitedWorkToDatabaseAndReturn( var wcw = TwoFromTheCasketDb
.InsertWorkerComplitedWorkToDatabaseAndReturn(
complitedWorkId: complited.Id, complitedWorkId: complited.Id,
workerId: _worker.Id, workerId: _worker.Id,
numberOfWorkingHour: 10 numberOfWorkingHour: 10
@@ -71,32 +76,31 @@ public class SalaryControllerTest : BaseWebApiControllerTest
[Test] [Test]
public async Task Try_Calculate_WithOvertimeConfiguration_Test() public async Task Try_Calculate_WithOvertimeConfiguration_Test()
{ {
var date = DateTime.UtcNow; var dateValid = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var overtime = new OvertimeSalaryConfiguration var overtime = new OvertimeSalaryConfiguration { Rate = 100, OvertimeMultiplier = 1.75 };
{
Rate = 100,
OvertimeMultiplier = 1.75
};
var w = TwoFromTheCasketDb.Workers.First(x => x.Id == _worker.Id); var w = TwoFromTheCasketDb.Workers.First(x => x.Id == _worker.Id);
w.Configuration = overtime; w.Configuration = overtime;
TwoFromTheCasketDb.SaveChanges(); TwoFromTheCasketDb.SaveChanges();
var work = TwoFromTheCasketDb.InsertWorkToDatabaseAndReturn(date: date); var work = TwoFromTheCasketDb.InsertWorkToDatabaseAndReturn(date: dateValid);
var room = TwoFromTheCasketDb.InsertRoomToDatabaseAndReturn(); var room = TwoFromTheCasketDb.InsertRoomToDatabaseAndReturn();
var compl = TwoFromTheCasketDb.InsertComplitedWorkToDatabaseAndReturn( var compl = TwoFromTheCasketDb.InsertComplitedWorkToDatabaseAndReturn(
date: date, roomId: room.Id, workId: work.Id); date: dateValid.AddDays(1),
roomId: room.Id,
workId: work.Id);
TwoFromTheCasketDb.InsertWorkerComplitedWorkToDatabaseAndReturn( TwoFromTheCasketDb.InsertWorkerComplitedWorkToDatabaseAndReturn(
complitedWorkId: compl.Id, complitedWorkId: compl.Id,
workerId: _worker.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)); Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var sal = TwoFromTheCasketDb.Salaries.First(x => x.WorkerId == _worker.Id); 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)); Assert.That(resp.StatusCode, Is.EqualTo(HttpStatusCode.NoContent));
var sal = TwoFromTheCasketDb.Salaries.First(x => x.WorkerId == _worker.Id); var sal = TwoFromTheCasketDb.Salaries.First(x => x.WorkerId == _worker.Id);
Assert.That(sal.Sum, Is.EqualTo(430)); Assert.That(sal.Sum, Is.EqualTo(400));
} }

View File

@@ -3,14 +3,18 @@ using TwoFromTheCasketContracts.Infastructure;
namespace TwoFromTheCasketWebApi.Infrastructure; namespace TwoFromTheCasketWebApi.Infrastructure;
public class ConfigurationSalary(IConfiguration configuration) : IConfigurationSalary public class ConfigurationSalary : IConfigurationSalary
{ {
private readonly Lazy<SalarySettings> _SalarySettings = new(() => private readonly SalarySettings _settings;
public ConfigurationSalary(IConfiguration configuration)
{ {
return configuration.GetValue<SalarySettings>("SalarySettings") ?? throw new InvalidDataException(nameof(SalarySettings)); _settings = configuration
}); .GetSection("SalarySettings")
.Get<SalarySettings>()
public int MaxParallelThreads => _SalarySettings.Value.MaxParallelThreads; ?? throw new InvalidDataException("Секция SalarySettings не найдена в конфиге");
}
public double BonusThreshold => _SalarySettings.Value.BonusThreshold;
public int MaxParallelThreads => _settings.MaxParallelThreads;
public double BonusThreshold => _settings.BonusThreshold;
} }