2 Commits

Author SHA1 Message Date
maxim
79089f9a32 вот теперь точно ready 2025-03-31 16:35:01 +04:00
maxim
f510cb98dd ready 2025-03-31 16:32:50 +04:00
174 changed files with 524 additions and 14178 deletions

View File

@@ -4,26 +4,24 @@ using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageContract, ILogger logger, IStringLocalizer<Messages> localizer) : IMasterBuisnessLogicContract
internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageContract, ILogger logger) : IMasterBuisnessLogicContract
{
ILogger _logger = logger;
private IMasterStorageContract _masterStorageContract = masterStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<MasterDataModel> GetAllMasters(bool onlyActive = true)
{
_logger.LogInformation("GetAllWorkers params: {onlyActive}", onlyActive);
return _masterStorageContract.GetList(onlyActive);
return _masterStorageContract.GetList(onlyActive) ?? throw new
NullListException();
}
public List<MasterDataModel> GetAllMastersByPost(string postId, bool onlyActive = true)
@@ -35,9 +33,9 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
}
if (!postId.IsGuid())
{
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageIncorrectField"], "PostId"));
throw new ValidationException("The value in the field postId is not a unique identifier.");
}
return _masterStorageContract.GetList(onlyActive, postId);
return _masterStorageContract.GetList(onlyActive, postId) ?? throw new NullListException();
}
public List<MasterDataModel> GetAllMastersByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive = true)
@@ -45,10 +43,10 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
_logger.LogInformation("GetAllWorkers params: {onlyActive}, { fromDate}, { toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate, localizer);
throw new IncorrectDatesException(fromDate, toDate);
}
return _masterStorageContract.GetList(onlyActive, fromEmploymentDate:
fromDate, toEmploymentDate: toDate);
fromDate, toEmploymentDate: toDate) ?? throw new NullListException();
}
public MasterDataModel GetMasterByData(string data)
@@ -61,10 +59,10 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
if (data.IsGuid())
{
return _masterStorageContract.GetElementById(data) ?? throw
new ElementNotFoundException(data, _localizer);
new ElementNotFoundException(data);
}
return _masterStorageContract.GetElementByFIO(data) ?? throw new
ElementNotFoundException(data, _localizer);
ElementNotFoundException(data);
}
public void InsertMaster(MasterDataModel workerDataModel)
@@ -72,7 +70,7 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
_logger.LogInformation("New data: {json}",
JsonSerializer.Serialize(workerDataModel));
ArgumentNullException.ThrowIfNull(workerDataModel);
workerDataModel.Validate(localizer);
workerDataModel.Validate();
_masterStorageContract.AddElement(workerDataModel);
}
@@ -81,7 +79,7 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
_logger.LogInformation("Update data: {json}",
JsonSerializer.Serialize(workerDataModel));
ArgumentNullException.ThrowIfNull(workerDataModel);
workerDataModel.Validate(_localizer);
workerDataModel.Validate();
_masterStorageContract.UpdElement(workerDataModel);
}
@@ -94,7 +92,7 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
}
if (!id.IsGuid())
{
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageIncorrectField"], "Id"));
throw new ValidationException("Id is not a unique identifier");
}
_masterStorageContract.DelElement(id);
}
@@ -104,9 +102,9 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
_logger.LogInformation("GetAllWorkers params: {onlyActive}, { fromDate}, { toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate, localizer);
throw new IncorrectDatesException(fromDate, toDate);
}
return _masterStorageContract.GetList(onlyActive, fromBirthDate: fromDate, toBirthDate: toDate);
return _masterStorageContract.GetList(onlyActive, fromBirthDate: fromDate, toBirthDate: toDate) ?? throw new NullListException();
}
public List<MasterDataModel> GetAllWorkersByEmploymentDate(DateTime
@@ -115,9 +113,9 @@ internal class MasterBusinessLogicContract(IMasterStorageContract masterStorageC
_logger.LogInformation("GetAllMaster params: {onlyActive}, { fromDate}, { toDate}", onlyActive, fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate, localizer);
throw new IncorrectDatesException(fromDate, toDate);
}
return _masterStorageContract.GetList(onlyActive, fromEmploymentDate:
fromDate, toEmploymentDate: toDate);
fromDate, toEmploymentDate: toDate) ?? throw new NullListException();
}
}

View File

@@ -3,26 +3,27 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageContract, ILogger logger, IStringLocalizer<Messages> localizer) : IOrderBuisnessLogicContract
internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageContract, ILogger logger) : IOrderBuisnessLogicContract
{
private ILogger _logger = logger;
private IOrderStorageContract _orderStorageContract = orderStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<OrderDataModel> GetAllOrder()
{
_logger.LogInformation("GetAllOrders called");
var orders = _orderStorageContract.GetList();
if (orders == null)
{
throw new NullListException();
}
return orders;
}
@@ -31,7 +32,7 @@ internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageCont
_logger.LogInformation("GetAllOrdersByDate called with fromDate: {fromDate} to: {toDate}");
return _orderStorageContract.GetElementByDate(fromDate);
return _orderStorageContract.GetElementByDate(fromDate) ?? throw new NullListException();
}
public OrderDataModel GetOrderByData(string data)
@@ -43,9 +44,9 @@ internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageCont
}
if (data.IsGuid())
{
return _orderStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
return _orderStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
}
return _orderStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data, _localizer);
return _orderStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data);
}
public void InsertOrder(OrderDataModel orderDataModel)
@@ -74,7 +75,7 @@ internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageCont
if (orderDataModel == null)
throw new ArgumentNullException(nameof(orderDataModel));
orderDataModel.Validate(_localizer);
orderDataModel.Validate();
}
private void ValidateId(string id)
@@ -83,6 +84,6 @@ internal class OrderBusinessLogicContract(IOrderStorageContract orderStorageCont
throw new ArgumentNullException(nameof(id));
if (!Guid.TryParse(id, out _))
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Id is not a unique identifier");
}
}

View File

@@ -4,27 +4,25 @@ using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class PostBusinessLogicContract(IPostStorageContract postStorageContract, ILogger logger, IStringLocalizer<Messages> localizer) : IPostBuisnessLogicContract
internal class PostBusinessLogicContract(IPostStorageContract postStorageContract, ILogger logger) : IPostBuisnessLogicContract
{
private IPostStorageContract _postStorageContract = postStorageContract;
private ILogger _logger = logger;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<PostDataModel> GetAllPosts()
{
_logger.LogInformation("GetAllPosts");
return _postStorageContract.GetList();
return _postStorageContract.GetList() ?? throw new
NullListException();
}
public List<PostDataModel> GetAllDataOfPost(string postId)
@@ -36,9 +34,10 @@ internal class PostBusinessLogicContract(IPostStorageContract postStorageContrac
}
if (!postId.IsGuid())
{
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("The value in the field postId is not a unique identifier.");
}
return _postStorageContract.GetPostWithHistory(postId);
return _postStorageContract.GetPostWithHistory(postId) ?? throw new
NullListException();
}
public PostDataModel GetPostByData(string data)
@@ -51,10 +50,10 @@ internal class PostBusinessLogicContract(IPostStorageContract postStorageContrac
if (data.IsGuid())
{
return _postStorageContract.GetElementById(data) ?? throw new
ElementNotFoundException(data, _localizer);
ElementNotFoundException(data);
}
return _postStorageContract.GetElementByName(data) ?? throw new
ElementNotFoundException(data, _localizer);
ElementNotFoundException(data);
}
public void InsertPost(PostDataModel postDataModel)
@@ -64,7 +63,7 @@ internal class PostBusinessLogicContract(IPostStorageContract postStorageContrac
if (postDataModel == null)
throw new ArgumentNullException(nameof(postDataModel));
postDataModel.Validate(localizer); // Вызовляем проверку валидности данных
postDataModel.Validate(); // Вызовляем проверку валидности данных
_postStorageContract.AddElement(postDataModel);
}
@@ -73,7 +72,7 @@ internal class PostBusinessLogicContract(IPostStorageContract postStorageContrac
{
_logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(postDataModel));
ArgumentNullException.ThrowIfNull(postDataModel);
postDataModel.Validate(localizer);
postDataModel.Validate();
_postStorageContract.UpdElement(postDataModel);
}
@@ -86,7 +85,7 @@ internal class PostBusinessLogicContract(IPostStorageContract postStorageContrac
}
if (!id.IsGuid())
{
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Id is not a unique identifier");
}
_postStorageContract.DelElement(id);
}
@@ -100,7 +99,7 @@ internal class PostBusinessLogicContract(IPostStorageContract postStorageContrac
}
if (!id.IsGuid())
{
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Id is not a unique identifier");
}
_postStorageContract.ResElement(id);
}

View File

@@ -1,328 +0,0 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketBuisnessLogic.OfficePackage;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class ReportContract(IServiceStorageContract serviceStorageContract, IMasterStorageContract masterStorageContract, IOrderStorageContract orderStorageContract, ISalaryStorageContract salaryStorageContract, IPostStorageContract postStorageContract, BaseWordBuilder baseWordBuilder, BaseExcelBuilder baseExcelBuilder, BasePdfBuilder basePdfBuilder, ILogger logger, IStringLocalizer<Messages> localizer) : IReportContract
{
private readonly IServiceStorageContract _serviceStorageContract = serviceStorageContract;
private readonly IMasterStorageContract _masterStorageContract = masterStorageContract;
private readonly IOrderStorageContract _orderStorageContract = orderStorageContract;
private readonly ISalaryStorageContract _salaryStorageContract = salaryStorageContract;
private readonly IPostStorageContract _postStorageContract = postStorageContract;
private readonly BaseWordBuilder _baseWordBuilder = baseWordBuilder;
private readonly BaseExcelBuilder _baseExcelBuilder = baseExcelBuilder;
private readonly BasePdfBuilder _basePdfBuilder = basePdfBuilder;
private readonly ILogger _logger = logger;
private readonly IStringLocalizer<Messages> _localizer = localizer;
internal static readonly string[] documentHeader = ["Дата", "Работа"];
internal static readonly string[] tableHeader = ["Дата", "Сумма", "Работа", "Объём"];
public async Task<Stream> CreateDocumentServicesWithHistoryAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
{
var services = await GetDataServicesWithHistoryAsync(dateStart, dateFinish, ct);
var builder = _baseWordBuilder
.AddHeader(_localizer["ReportServicesHeader"].Value)
.AddParagraph(_localizer["ReportServicesPeriod", dateStart.ToString("dd.MM.yyyy"), dateFinish.ToString("dd.MM.yyyy")].Value)
.AddParagraph(_localizer["ReportServicesGenerated", DateTime.Now.ToString("dd.MM.yyyy HH:mm")].Value);
if (!services.Any())
{
builder.AddParagraph(_localizer["ReportServicesNoData"].Value);
return builder.Build();
}
// Создаем таблицу с заголовками
var tableData = new List<string[]>
{
new[] {
_localizer["ReportServicesTableService"].Value,
_localizer["ReportServicesTableType"].Value,
_localizer["ReportServicesTableCurrentPrice"].Value,
_localizer["ReportServicesTableChangeDate"].Value,
_localizer["ReportServicesTableOldPrice"].Value
}
};
foreach (var service in services)
{
if (service.History.Any())
{
// Если есть история изменений, добавляем каждое изменение как отдельную строку
var sortedHistory = service.History.OrderByDescending(h => h.ChangeDate).ToList();
for (int i = 0; i < sortedHistory.Count; i++)
{
var history = sortedHistory[i];
tableData.Add(new[]
{
i == 0 ? service.ServiceName : "", // Название услуги только в первой строке
i == 0 ? service.ServiceType.ToString() : "", // Тип только в первой строке
i == 0 ? service.Price.ToString("C") : "", // Текущая цена только в первой строке
history.ChangeDate.ToString("dd.MM.yyyy HH:mm"),
history.OldPrice.ToString("C")
});
}
}
else
{
// Если истории нет, добавляем одну строку с прочерками
tableData.Add(new[]
{
service.ServiceName,
service.ServiceType.ToString(),
service.Price.ToString("C"),
_localizer["ReportServicesNoChanges"].Value, // Прочерк для даты изменения
_localizer["ReportServicesNoChanges"].Value // Прочерк для старой цены
});
}
}
// Добавляем таблицу с настройками ширины колонок
builder.AddTable(new[] { 2500, 1500, 1500, 2000, 1500 }, tableData);
return builder.Build();
}
public async Task<Stream> CreateDocumentOrdersByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
{
var orders = await GetDataOrderByPeriodAsync(dateStart, dateFinish, ct);
var tableData = new List<string[]> { new[] {
_localizer["ReportOrdersTableOrderDate"].Value,
_localizer["ReportOrdersTableStatus"].Value,
_localizer["ReportOrdersTableRoomType"].Value,
_localizer["ReportOrdersTableMaster"].Value,
_localizer["ReportOrdersTableService"].Value,
_localizer["ReportOrdersTableWorkTime"].Value,
_localizer["ReportOrdersTableAmount"].Value
} };
foreach (var order in orders)
{
// Получаем информацию о мастере и услугах для этого заказа
var orderDetails = await GetOrderDetailsAsync(order.Id, ct);
if (orderDetails.Any())
{
foreach (var detail in orderDetails)
{
tableData.Add(new[]
{
order.Date.ToString("dd.MM.yyyy"),
order.Status.ToString(),
order.RoomType.ToString(),
detail.MasterFIO,
detail.ServiceName,
$"{detail.TimeOfWorking} {_localizer["ReportOrdersHours"].Value}",
detail.TotalAmount.ToString("C")
});
}
}
else
{
// Если нет деталей, показываем только основную информацию о заказе
tableData.Add(new[]
{
order.Date.ToString("dd.MM.yyyy"),
order.Status.ToString(),
order.RoomType.ToString(),
_localizer["ReportOrdersNotAssigned"].Value,
_localizer["ReportOrdersNoServices"].Value,
$"0 {_localizer["ReportOrdersHours"].Value}",
"0,00 ₽"
});
}
}
return _baseExcelBuilder
.AddHeader(_localizer["ReportOrdersHeader"].Value, 0, 7)
.AddParagraph(_localizer["ReportOrdersPeriod", dateStart.ToString("dd.MM.yyyy"), dateFinish.ToString("dd.MM.yyyy")].Value, 2)
.AddTable([15, 12, 15, 20, 25, 12, 15], tableData)
.Build();
}
public async Task<Stream> CreateDocumentSalaryByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
{
var data = await GetDataSalaryByPeriodAsync(dateStart, dateFinish, ct);
if (!data.Any())
{
return _basePdfBuilder
.AddHeader(_localizer["ReportSalaryHeader"].Value)
.AddParagraph(_localizer["ReportSalaryPeriod", dateStart.ToString("dd.MM.yyyy"), dateFinish.ToString("dd.MM.yyyy")].Value)
.AddParagraph(_localizer["ReportServicesNoData"].Value)
.Build();
}
// Группируем данные по мастерам для диаграммы
var groupedData = data.GroupBy(x => x.MasterFIO)
.Select(g => new { MasterFIO = g.Key, TotalSalary = g.Sum(x => x.TotalSalary) })
.ToList();
// Создаем таблицу с данными о зарплатах
var tableData = new List<string[]>
{
new[] {
_localizer["ReportSalaryTableMaster"].Value,
_localizer["ReportSalaryTableDate"].Value,
_localizer["ReportSalaryTableAmount"].Value
}
};
foreach (var salary in data)
{
var row = new[]
{
salary.MasterFIO,
salary.FromPeriod.ToString("dd.MM.yyyy"),
salary.TotalSalary.ToString("C")
};
tableData.Add(row);
}
return _basePdfBuilder
.AddHeader(_localizer["ReportSalaryHeader"].Value)
.AddParagraph(_localizer["ReportSalaryPeriod", dateStart.ToString("dd.MM.yyyy"), dateFinish.ToString("dd.MM.yyyy")].Value)
.AddPieChart(_localizer["ReportSalaryAccruals"].Value, groupedData.Select(x => (x.MasterFIO, x.TotalSalary)).ToList())
.AddParagraph("") // Отступ между диаграммой и таблицей
.AddTable(new[] { 200, 150, 150 }, tableData)
.Build();
}
public async Task<List<ServiceHistoryDataModel>> GetDataServiceHistoryAsync(CancellationToken ct)
{
var histories = new List<ServiceHistoryDataModel>();
var services = _serviceStorageContract.GetList() ?? new List<ServiceDataModel>();
foreach (var service in services)
{
var serviceHistories = _serviceStorageContract.GetHistoryByServiceId(service.Id);
if (serviceHistories != null)
{
histories.AddRange(serviceHistories);
}
}
return histories.OrderByDescending(h => h.ChangeDate).ToList();
}
public async Task<List<OrderDataModel>> GetDataOrderByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
{
if (dateStart.IsDateNotOlder(dateFinish))
{
throw new IncorrectDatesException(dateStart, dateFinish, _localizer);
}
try
{
// Получаем все заказы за указанный период
var orders = await _orderStorageContract.GetListAsync(dateStart, dateFinish, ct);
return orders.OrderBy(o => o.Date).ToList();
}
catch (Exception ex)
{
throw;
}
}
public async Task<List<MasterSalaryByPeriodDataModel>> GetDataSalaryByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
{
if (dateStart >= dateFinish)
{
throw new IncorrectDatesException(dateStart, dateFinish, _localizer);
}
var salaries = await _salaryStorageContract.GetListAsync(dateStart, dateFinish, ct) ?? new List<SalaryDataModel>();
var masters = _masterStorageContract.GetList(onlyActive: true) ?? new List<MasterDataModel>();
// Возвращаем отдельные записи зарплаты вместо агрегированных данных
var salaryRecords = salaries.Select(salary =>
{
var master = masters.FirstOrDefault(m => m.Id == salary.MasterId);
return new MasterSalaryByPeriodDataModel
{
MasterFIO = master?.FIO ?? _localizer["ReportSalaryUnknownMaster"].Value,
TotalSalary = salary.Salary + salary.Prize,
FromPeriod = salary.SalaryDate,
ToPeriod = salary.SalaryDate
};
}).OrderBy(x => x.MasterFIO).ThenBy(x => x.FromPeriod).ToList();
return salaryRecords;
}
public async Task<List<ServiceWithHistoryDataModel>> GetDataServicesWithHistoryAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct)
{
if (dateStart > dateFinish)
{
throw new IncorrectDatesException(dateStart, dateFinish, _localizer);
}
// Получаем все услуги
var services = _serviceStorageContract.GetList() ?? new List<ServiceDataModel>();
var result = new List<ServiceWithHistoryDataModel>();
foreach (var service in services)
{
// Получаем историю изменений для данной услуги
var serviceHistories = _serviceStorageContract.GetHistoryByServiceId(service.Id) ?? new List<ServiceHistoryDataModel>();
// Фильтруем историю по периоду
var filteredHistories = serviceHistories
.Where(h => h.ChangeDate >= dateStart && h.ChangeDate <= dateFinish)
.OrderByDescending(h => h.ChangeDate)
.ToList();
result.Add(new ServiceWithHistoryDataModel
{
Id = service.Id,
ServiceName = service.ServiceName,
ServiceType = service.ServiceType,
MasterId = service.MasterId,
Price = service.Price,
IsDeleted = service.IsDeleted,
History = filteredHistories
});
}
return result.OrderBy(s => s.ServiceName).ToList();
}
private async Task<List<(string MasterFIO, string ServiceName, int TimeOfWorking, decimal TotalAmount)>> GetOrderDetailsAsync(string orderId, CancellationToken ct)
{
try
{
return await _orderStorageContract.GetOrderDetailsAsync(orderId, ct);
}
catch (Exception)
{
return new List<(string MasterFIO, string ServiceName, int TimeOfWorking, decimal TotalAmount)>();
}
}
}

View File

@@ -1,51 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketBuisnessLogic.Implementations
{
internal class SalaryBusinessLogicContract(ISalaryStorageContract
salaryStorageContract, IPostStorageContract
postStorageContract, IMasterStorageContract masterStorageContract, ILogger
logger, IOrderStorageContract orderStorageContract, IConfigurationSalary configurationSalary, IStringLocalizer<Messages> localizer) : ISalaryBuisnessLogicContract
logger, IOrderStorageContract orderStorageContract) : ISalaryBuisnessLogicContract
{
private readonly ILogger _logger = logger;
private readonly ISalaryStorageContract _salaryStorageContract = salaryStorageContract;
private readonly IPostStorageContract _postStorageContract = postStorageContract;
private readonly IMasterStorageContract _masterStorageContract = masterStorageContract;
private readonly IOrderStorageContract _orderStorageContract = orderStorageContract;
private readonly IConfigurationSalary _configurationSalary = configurationSalary;
private readonly object _lockObject = new object();
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<SalaryDataModel> GetAllSalariesByPeriod(DateTime fromDate, DateTime toDate)
{
_logger.LogInformation("GetAllSalaries params: {fromDate}, {toDate}", fromDate, toDate);
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate, _localizer);
throw new IncorrectDatesException(fromDate, toDate);
}
return _salaryStorageContract.GetList(fromDate, toDate);
return _salaryStorageContract.GetList(fromDate, toDate) ?? throw new NullListException();
}
public List<SalaryDataModel> GetAllSalariesByPeriodByMaster(DateTime fromDate, DateTime toDate, string masterId)
{
if (fromDate.IsDateNotOlder(toDate))
{
throw new IncorrectDatesException(fromDate, toDate, _localizer);
throw new IncorrectDatesException(fromDate, toDate);
}
if (string.IsNullOrEmpty(masterId))
@@ -59,156 +52,35 @@ logger, IOrderStorageContract orderStorageContract, IConfigurationSalary configu
}
_logger.LogInformation("GetAllSalaries params: {fromDate}, {toDate}, {masterId}", fromDate, toDate, masterId);
return _salaryStorageContract.GetList(fromDate, toDate, masterId);
return _salaryStorageContract.GetList(fromDate, toDate, masterId) ?? throw new NullListException();
}
public void CalculateSalaryByMonth(DateTime date)
{
_logger.LogInformation("CalculateSalaryByMonth: {date}", date);
var startDate = new DateTime(date.Year, date.Month, 1, 0, 0, 0, DateTimeKind.Utc);
var finishDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month), 0, 0, 0, DateTimeKind.Utc);
var masters = _masterStorageContract.GetList();
var startDate = new DateTime(date.Year, date.Month, 1);
var finishDate = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
var masters = _masterStorageContract.GetList() ?? throw new NullListException();
foreach (var master in masters)
{
var orders = _orderStorageContract.GetList();
var masterOrders = orders.Where(o => o.Date >= startDate && o.Date <= finishDate).ToList();
var post = _postStorageContract.GetElementById(master.PostId) ?? throw new ElementNotFoundException(master.PostId, _localizer);
var salary = post.ConfigurationModel switch
{
null => 0,
CarpenterPostConfiguration cpc => CalculateSalaryForCarpenter(masterOrders, startDate, finishDate, cpc),
PainterPostConfiguration ppc => CalculateSalaryForPainter(masterOrders, startDate, finishDate, ppc),
PlastererPostConfiguration plpc => CalculateSalaryForPlasterer(masterOrders, startDate, finishDate, plpc),
PostConfiguration pc => pc.Rate,
};
_logger.LogDebug("The master {masterId} was paid a salary of {salary}", master.Id, salary);
_salaryStorageContract.AddElement(new SalaryDataModel(master.Id, finishDate, salary, 0));
master.Validate();
var orders = _orderStorageContract.GetList()?.Count(x => x.Id.IsGuid()) ??
throw new NullListException();
var post = _postStorageContract.GetElementById(master.PostId) ?? throw new NullListException();
var baseSalary = post.Salary;
var prize = 500.0;
var totalSalary = baseSalary + prize;
_logger.LogDebug("The master {master.Id} was paid a salary of {salary}", master.Id, totalSalary);
_salaryStorageContract.AddElement(new SalaryDataModel(master.Id, finishDate, totalSalary, prize));
}
// Сохраняем все изменения одним вызовом
_salaryStorageContract.SaveChanges();
}
private double CalculateSalaryForCarpenter(List<OrderDataModel> orders, DateTime startDate, DateTime finishDate, CarpenterPostConfiguration config)
{
var maxThreads = Math.Max(1, _configurationSalary.MaxThreads);
var options = new ParallelOptions { MaxDegreeOfParallelism = maxThreads };
var calcPercent = 0.0;
var days = new List<DateTime>();
for (var date = startDate; date < finishDate; date = date.AddDays(1))
{
days.Add(date);
}
Parallel.ForEach(days, options, date =>
{
var ordersInDay = orders.Where(x => x.Date.Date == date.Date).ToArray();
if (ordersInDay.Length > 0)
{
lock (_lockObject)
{
calcPercent += ordersInDay.Length * config.BonusForExtraCarpentry;
}
}
});
return config.Rate + calcPercent;
}
private double CalculateSalaryForPainter(List<OrderDataModel> orders, DateTime startDate, DateTime finishDate, PainterPostConfiguration config)
{
var maxThreads = Math.Max(1, _configurationSalary.MaxThreads);
var options = new ParallelOptions { MaxDegreeOfParallelism = maxThreads };
var calcPercent = 0.0;
var days = new List<DateTime>();
for (var date = startDate; date < finishDate; date = date.AddDays(1))
{
days.Add(date);
}
Parallel.ForEach(days, options, date =>
{
var ordersInDay = orders.Where(x => x.Date.Date == date.Date).ToArray();
if (ordersInDay.Length > 0)
{
lock (_lockObject)
{
calcPercent += ordersInDay.Length * config.PainterPercent;
}
}
});
var calcBonusTask = Task.Run(() =>
{
return orders.Count * config.BonusForExtraPainter;
});
try
{
calcBonusTask.Wait();
}
catch (AggregateException agEx)
{
foreach (var ex in agEx.InnerExceptions)
{
_logger.LogError(ex, "Error in the painter payroll process");
}
return 0;
}
return config.Rate + calcPercent + calcBonusTask.Result;
}
private double CalculateSalaryForPlasterer(List<OrderDataModel> orders, DateTime startDate, DateTime finishDate, PlastererPostConfiguration config)
{
var maxThreads = Math.Max(1, _configurationSalary.MaxThreads);
var options = new ParallelOptions { MaxDegreeOfParallelism = maxThreads };
var calcPercent = 0.0;
var days = new List<DateTime>();
for (var date = startDate; date < finishDate; date = date.AddDays(1))
{
days.Add(date);
}
Parallel.ForEach(days, options, date =>
{
var ordersInDay = orders.Where(x => x.Date.Date == date.Date).ToArray();
if (ordersInDay.Length > 0)
{
lock (_lockObject)
{
calcPercent += ordersInDay.Length * config.PlastererPercent;
}
}
});
var calcBonusTask = Task.Run(() =>
{
return orders.Count * config.BonusForExtraPlasterer;
});
try
{
calcBonusTask.Wait();
}
catch (AggregateException agEx)
{
foreach (var ex in agEx.InnerExceptions)
{
_logger.LogError(ex, "Error in the plasterer payroll process");
}
return 0;
}
return config.Rate + calcPercent + calcBonusTask.Result;
}
}
}

View File

@@ -4,28 +4,28 @@ using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
using TwoFromTheCasketContratcs.BuisnessLogicsContracts;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
namespace TwoFromTheCasketBuisnessLogic.Implementations;
internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStorageContract, ILogger logger, IStringLocalizer<Messages> localizer) : IServiceBuisnessLogicContract
internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStorageContract, ILogger logger) : IServiceBuisnessLogicContract
{
ILogger _logger = logger;
private IServiceStorageContract _serviceStorageContract = serviceStorageContract;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<ServiceDataModel> GetAllServices(bool onlyActive)
{
_logger.LogInformation("GetAllService called");
var services = _serviceStorageContract.GetList(onlyActive);
var services = _serviceStorageContract.GetList();
if(services == null)
{
throw new NullListException();
}
return services;
}
@@ -40,7 +40,7 @@ internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStora
{
throw new ValidationException("The value in the field masterId is not a unique identifier.");
}
return _serviceStorageContract.GetElementByMasterId(masterId);
return _serviceStorageContract.GetElementByMasterId(masterId) ?? throw new NullListException();
}
public List<ServiceDataModel> GetServicesByServiceType(ServiceType serviceType, bool onlyActive)
@@ -48,11 +48,17 @@ internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStora
_logger.LogInformation($"GetServicesByServiceType called for {serviceType} (onlyActive: {onlyActive})");
var allServices = _serviceStorageContract.GetList(onlyActive) ?? new List<ServiceDataModel>();
var allServices = _serviceStorageContract.GetList() ?? new List<ServiceDataModel>();
var filteredByType = allServices.Where(s => s.ServiceType == serviceType);
if (onlyActive)
{
filteredByType = filteredByType.Where(s => s.IsDeleted!);
}
return filteredByType.ToList();
}
@@ -61,7 +67,7 @@ internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStora
_logger.LogInformation("New data: {json}",
JsonSerializer.Serialize(serviceDataModel));
ArgumentNullException.ThrowIfNull(serviceDataModel);
serviceDataModel.Validate(_localizer);
serviceDataModel.Validate();
_serviceStorageContract.AddElement(serviceDataModel);
}
@@ -71,7 +77,7 @@ internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStora
_logger.LogInformation("Update data: {json}",
JsonSerializer.Serialize(serviceDataModel));
ArgumentNullException.ThrowIfNull(serviceDataModel);
serviceDataModel.Validate(_localizer);
serviceDataModel.Validate();
_serviceStorageContract.UpdElement(serviceDataModel);
}
public void DeleteService(string id)
@@ -83,7 +89,7 @@ internal class ServiceBusinessLogicContract(IServiceStorageContract serviceStora
}
if (!id.IsGuid())
{
throw new ValidationException(string.Format(_localizer["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Id is not a unique identifier");
}
_serviceStorageContract.DelElement(id);
}

View File

@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketBuisnessLogic.OfficePackage;
public abstract class BaseExcelBuilder
{
public abstract BaseExcelBuilder AddHeader(string header, int startIndex, int count);
public abstract BaseExcelBuilder AddParagraph(string text, int columnIndex);
public abstract BaseExcelBuilder AddTable(int[] columnsWidths, List<string[]> data);
public abstract Stream Build();
}

View File

@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketBuisnessLogic.OfficePackage;
public abstract class BasePdfBuilder
{
public abstract BasePdfBuilder AddHeader(string header);
public abstract BasePdfBuilder AddParagraph(string text);
public abstract BasePdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data);
public abstract BasePdfBuilder AddTable(int[] widths, List<string[]> data);
public abstract Stream Build();
}

View File

@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketBuisnessLogic.OfficePackage;
public abstract class BaseWordBuilder
{
public abstract BaseWordBuilder AddHeader(string header);
public abstract BaseWordBuilder AddParagraph(string text);
public abstract BaseWordBuilder AddTable(int[] widths, List<string[]> data);
public abstract Stream Build();
}

View File

@@ -1,116 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Shapes.Charts;
using MigraDoc.Rendering;
using System.Threading.Tasks;
namespace TwoFromTheCasketBuisnessLogic.OfficePackage;
internal class MigraDocPdfBuilder : BasePdfBuilder
{
private readonly Document _document;
public MigraDocPdfBuilder()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
_document = new Document();
DefineStyles();
}
public override BasePdfBuilder AddHeader(string header)
{
_document.AddSection().AddParagraph(header, "NormalBold");
return this;
}
public override BasePdfBuilder AddParagraph(string text)
{
_document.LastSection.AddParagraph(text, "Normal");
return this;
}
public override BasePdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data)
{
if (data == null || data.Count == 0)
{
return this;
}
var chart = new Chart(ChartType.Pie2D);
var series = chart.SeriesCollection.AddSeries();
series.Add(data.Select(x => x.Value).ToArray());
var xseries = chart.XValues.AddXSeries();
xseries.Add(data.Select(x => x.Caption).ToArray());
chart.DataLabel.Type = DataLabelType.Percent;
chart.DataLabel.Position = DataLabelPosition.OutsideEnd;
chart.Width = Unit.FromCentimeter(16);
chart.Height = Unit.FromCentimeter(12);
chart.TopArea.AddParagraph(title);
chart.XAxis.MajorTickMark = TickMarkType.Outside;
chart.YAxis.MajorTickMark = TickMarkType.Outside;
chart.YAxis.HasMajorGridlines = true;
chart.PlotArea.LineFormat.Width = 1;
chart.PlotArea.LineFormat.Visible = true;
chart.TopArea.AddLegend();
_document.LastSection.Add(chart);
return this;
}
public override BasePdfBuilder AddTable(int[] widths, List<string[]> data)
{
if (data == null || data.Count == 0)
{
return this;
}
var table = _document.LastSection.AddTable();
table.Style = "Table";
table.Borders.Color = Colors.Black;
table.Borders.Width = 0.25;
table.Borders.Left.Width = 0.5;
table.Borders.Right.Width = 0.5;
table.Rows.LeftIndent = 0;
// Настройка колонок
for (int i = 0; i < widths.Length; i++)
{
var column = table.AddColumn(Unit.FromPoint(widths[i]));
column.Format.Alignment = ParagraphAlignment.Center;
}
// Добавление данных
for (int rowIndex = 0; rowIndex < data.Count; rowIndex++)
{
var row = table.AddRow();
row.HeadingFormat = (rowIndex == 0); // Первая строка - заголовок
row.Format.Alignment = ParagraphAlignment.Center;
row.Format.Font.Bold = (rowIndex == 0);
for (int colIndex = 0; colIndex < data[rowIndex].Length && colIndex < widths.Length; colIndex++)
{
var cell = row.Cells[colIndex];
var cellText = data[rowIndex][colIndex];
cell.AddParagraph(cellText);
cell.Format.Alignment = ParagraphAlignment.Center;
}
}
return this;
}
public override Stream Build()
{
var stream = new MemoryStream();
var renderer = new PdfDocumentRenderer(true)
{
Document = _document
};
renderer.RenderDocument();
renderer.PdfDocument.Save(stream);
return stream;
}
private void DefineStyles()
{
var style = _document.Styles.AddStyle("NormalBold", "Normal");
style.Font.Bold = true;
}
}

View File

@@ -1,271 +0,0 @@
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
namespace TwoFromTheCasketBuisnessLogic.OfficePackage;
internal class OpenXmlExcelBuilder : BaseExcelBuilder
{
private readonly SheetData _sheetData;
private readonly MergeCells _mergeCells;
private readonly Columns _columns;
private uint _rowIndex = 0;
public OpenXmlExcelBuilder()
{
_sheetData = new SheetData();
_mergeCells = new MergeCells();
_columns = new Columns();
_rowIndex = 1;
}
public override BaseExcelBuilder AddHeader(string header, int startIndex, int count)
{
CreateCell(startIndex, _rowIndex, header, StyleIndex.BoldTextWithoutBorder);
for (int i = startIndex + 1; i < startIndex + count; ++i)
{
CreateCell(i, _rowIndex, "", StyleIndex.SimpleTextWithoutBorder);
}
_mergeCells.Append(new MergeCell()
{
Reference =
new StringValue($"{GetExcelColumnName(startIndex)}{_rowIndex}:{GetExcelColumnName(startIndex + count - 1)}{_rowIndex}")
});
_rowIndex++;
return this;
}
public override BaseExcelBuilder AddParagraph(string text, int columnIndex)
{
CreateCell(columnIndex, _rowIndex++, text, StyleIndex.SimpleTextWithoutBorder);
return this;
}
public override BaseExcelBuilder AddTable(int[] columnsWidths, List<string[]> data)
{
if (columnsWidths == null || columnsWidths.Length == 0)
{
throw new ArgumentNullException(nameof(columnsWidths));
}
if (data == null || data.Count == 0)
{
throw new ArgumentNullException(nameof(data));
}
if (data.Any(x => x.Length != columnsWidths.Length))
{
throw new InvalidOperationException("widths.Length != data.Length");
}
uint counter = 1;
int coef = 2;
_columns.Append(columnsWidths.Select(x => new Column
{
Min = counter,
Max = counter++,
Width = x * coef,
CustomWidth = true
}));
for (var j = 0; j < data.First().Length; ++j)
{
CreateCell(j, _rowIndex, data.First()[j], StyleIndex.BoldTextWithBorder);
}
_rowIndex++;
for (var i = 1; i < data.Count - 1; ++i)
{
for (var j = 0; j < data[i].Length; ++j)
{
CreateCell(j, _rowIndex, data[i][j], StyleIndex.SimpleTextWithBorder);
}
_rowIndex++;
}
for (var j = 0; j < data.Last().Length; ++j)
{
CreateCell(j, _rowIndex, data.Last()[j], StyleIndex.SimpleTextWithBorder);
}
_rowIndex++;
return this;
}
public override Stream Build()
{
var stream = new MemoryStream();
using var spreadsheetDocument = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook);
var workbookpart = spreadsheetDocument.AddWorkbookPart();
GenerateStyle(workbookpart);
workbookpart.Workbook = new Workbook();
var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet();
if (_columns.HasChildren)
{
worksheetPart.Worksheet.Append(_columns);
}
worksheetPart.Worksheet.Append(_sheetData);
var sheets = spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets());
var sheet = new Sheet()
{
Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "Лист 1"
};
sheets.Append(sheet);
if (_mergeCells.HasChildren)
{
worksheetPart.Worksheet.InsertAfter(_mergeCells, worksheetPart.Worksheet.Elements<SheetData>().First());
}
return stream;
}
private static void GenerateStyle(WorkbookPart workbookPart)
{
var workbookStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>();
workbookStylesPart.Stylesheet = new Stylesheet();
var fonts = new Fonts() { Count = 2, KnownFonts = BooleanValue.FromBoolean(true) };
fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font
{
FontSize = new FontSize() { Val = 11 },
FontName = new FontName() { Val = "Calibri" },
FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 },
FontScheme = new FontScheme() { Val = new EnumValue<FontSchemeValues>(FontSchemeValues.Minor) }
});
fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font
{
FontSize = new FontSize() { Val = 11 },
FontName = new FontName() { Val = "Calibri" },
FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 },
FontScheme = new FontScheme() { Val = new EnumValue<FontSchemeValues>(FontSchemeValues.Minor) },
Bold = new Bold()
});
workbookStylesPart.Stylesheet.Append(fonts);
// Default Fill
var fills = new Fills() { Count = 1 };
fills.Append(new Fill
{
PatternFill = new PatternFill() { PatternType = new EnumValue<PatternValues>(PatternValues.None) }
});
workbookStylesPart.Stylesheet.Append(fills);
// Default Border
var borders = new Borders() { Count = 2 };
borders.Append(new Border
{
LeftBorder = new LeftBorder(),
RightBorder = new RightBorder(),
TopBorder = new TopBorder(),
BottomBorder = new BottomBorder(),
DiagonalBorder = new DiagonalBorder()
});
borders.Append(new Border
{
LeftBorder = new LeftBorder() { Style = BorderStyleValues.Thin },
RightBorder = new RightBorder() { Style = BorderStyleValues.Thin },
TopBorder = new TopBorder() { Style = BorderStyleValues.Thin },
BottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin }
});
workbookStylesPart.Stylesheet.Append(borders);
// Default cell format and a date cell format
var cellFormats = new CellFormats() { Count = 4 };
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 0,
BorderId = 0,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Left,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 0,
BorderId = 1,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Left,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 1,
BorderId = 0,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Center,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
cellFormats.Append(new CellFormat
{
NumberFormatId = 0,
FormatId = 0,
FontId = 1,
BorderId = 1,
FillId = 0,
Alignment = new Alignment()
{
Horizontal = HorizontalAlignmentValues.Center,
Vertical = VerticalAlignmentValues.Center,
WrapText = true
}
});
workbookStylesPart.Stylesheet.Append(cellFormats);
}
private enum StyleIndex
{
SimpleTextWithoutBorder = 0,
SimpleTextWithBorder = 1,
BoldTextWithoutBorder = 2,
BoldTextWithBorder = 3
}
private void CreateCell(int columnIndex, uint rowIndex, string text, StyleIndex styleIndex)
{
var columnName = GetExcelColumnName(columnIndex);
var cellReference = columnName + rowIndex;
var row = _sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex! == rowIndex);
if (row == null)
{
row = new Row() { RowIndex = rowIndex };
_sheetData.Append(row);
}
var newCell = row.Elements<Cell>()
.FirstOrDefault(c => c.CellReference != null && c.CellReference.Value == columnName + rowIndex);
if (newCell == null)
{
Cell? refCell = null;
foreach (Cell cell in row.Elements<Cell>())
{
if (cell.CellReference?.Value != null && cell.CellReference.Value.Length == cellReference.Length)
{
if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
{
refCell = cell;
break;
}
}
}
newCell = new Cell() { CellReference = cellReference };
row.InsertBefore(newCell, refCell);
}
newCell.CellValue = new CellValue(text);
newCell.DataType = CellValues.String;
newCell.StyleIndex = (uint)styleIndex;
}
private static string GetExcelColumnName(int columnNumber)
{
columnNumber += 1;
int dividend = columnNumber;
string columnName = string.Empty;
int modulo;
while (dividend > 0)
{
modulo = (dividend - 1) % 26;
columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
dividend = (dividend - modulo) / 26;
}
return columnName;
}
}

View File

@@ -1,79 +0,0 @@
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
namespace TwoFromTheCasketBuisnessLogic.OfficePackage;
internal class OpenXmlWordBuilder : BaseWordBuilder
{
private readonly Document _document;
private readonly Body _body;
public OpenXmlWordBuilder()
{
_document = new Document();
_body = _document.AppendChild(new Body());
}
public override BaseWordBuilder AddHeader(string header)
{
var paragraph = _body.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
run.AppendChild(new RunProperties(new Bold()));
run.AppendChild(new Text(header));
return this;
}
public override BaseWordBuilder AddParagraph(string text)
{
var paragraph = _body.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
run.AppendChild(new Text(text));
return this;
}
public override BaseWordBuilder AddTable(int[] widths, List<string[]> data)
{
if (widths == null || widths.Length == 0)
{
throw new ArgumentNullException(nameof(widths));
}
if (data == null || data.Count == 0)
{
throw new ArgumentNullException(nameof(data));
}
if (data.Any(x => x.Length != widths.Length))
{
throw new InvalidOperationException("widths.Length != data.Length");
}
var table = new Table();
table.AppendChild(new TableProperties(
new TableBorders(
new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 }
)
));
// Заголовок
var tr = new TableRow();
for (var j = 0; j < widths.Length; ++j)
{
tr.Append(new TableCell(
new TableCellProperties(new TableCellWidth() { Width = widths[j].ToString() }),
new Paragraph(new Run(new RunProperties(new Bold()), new Text(data.First()[j])))));
}
table.Append(tr);
// Данные
table.Append(data.Skip(1).Select(x =>
new TableRow(x.Select(y => new TableCell(new Paragraph(new Run(new Text(y))))))));
_body.Append(table);
return this;
}
public override Stream Build()
{
var stream = new MemoryStream();
using var wordDocument = WordprocessingDocument.Create(stream, WordprocessingDocumentType.Document);
var mainPart = wordDocument.AddMainDocumentPart();
mainPart.Document = _document;
return stream;
}
}

View File

@@ -8,15 +8,10 @@
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
<InternalsVisibleTo Include="TwoFromTheCasketWebApi" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="DocumentFormat.OpenXml" Version="3.3.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageReference Include="PDFsharp-MigraDoc-gdi" Version="6.2.1" />
<PackageReference Include="System.Drawing.Common" Version="9.0.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -9,10 +9,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketTest", "Two
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketBuisnessLogic", "TwoFromTheCasketBuisnessLogic\TwoFromTheCasketBuisnessLogic.csproj", "{371435E4-6D04-4302-86C8-23F063FBE57A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketDatabase", "TwoFromTheCasketDatabase\TwoFromTheCasketDatabase.csproj", "{C77C86D0-B620-4737-93D9-1A5A69BD7128}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwoFromTheCasketWebApi", "TwoFromTheCasketWebApi\TwoFromTheCasketWebApi.csproj", "{9627CDA8-1A24-4093-8D46-ED40DC05C942}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -31,19 +27,8 @@ Global
{371435E4-6D04-4302-86C8-23F063FBE57A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{371435E4-6D04-4302-86C8-23F063FBE57A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{371435E4-6D04-4302-86C8-23F063FBE57A}.Release|Any CPU.Build.0 = Release|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C77C86D0-B620-4737-93D9-1A5A69BD7128}.Release|Any CPU.Build.0 = Release|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9627CDA8-1A24-4093-8D46-ED40DC05C942}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {7B5E57DB-A427-4A96-9581-F3FF00AC4923}
EndGlobalSection
EndGlobal

View File

@@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IMasterAdapter
{
MasterOperationResponse GetList(bool onlyActive);
MasterOperationResponse GetListByPost(string postId, bool onlyActive);
MasterOperationResponse GetListByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive);
MasterOperationResponse GetListByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive);
MasterOperationResponse GetElementByData(string data);
MasterOperationResponse RegisterMaster(MasterBindingModel masterModel);
MasterOperationResponse ChangeMasterInfo(MasterBindingModel masterModel);
MasterOperationResponse RemoveMaster(string id);
}

View File

@@ -1,19 +0,0 @@
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IOrderAdapter
{
OrderOperationResponse GetList();
OrderOperationResponse GetListByDate(DateTime fromDate);
OrderOperationResponse GetElementByData(string data);
OrderOperationResponse RegisterOrder(OrderBindingModel orderModel);
OrderOperationResponse ChangeOrderInfo(OrderBindingModel orderModel);
OrderOperationResponse RemoveOrder(string id);
}

View File

@@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IPostAdapter
{
PostOperationResponse GetList();
PostOperationResponse GetHistory(string id);
PostOperationResponse GetElement(string data);
PostOperationResponse RegisterPost(PostBindingModel postModel);
PostOperationResponse ChangePostInfo(PostBindingModel postModel);
PostOperationResponse RemovePost(string id);
PostOperationResponse RestorePost(string id);
}

View File

@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IReportAdapter
{
Task<ReportOperationResponse> GetDataServicesWithHistoryAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<ReportOperationResponse> GetDataOrderByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<ReportOperationResponse> GetDataSalaryByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<ReportOperationResponse> CreateDocumentServicesWithHistoryAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<ReportOperationResponse> CreateDocumentOrdersByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<ReportOperationResponse> CreateDocumentSalaryByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
}

View File

@@ -1,10 +0,0 @@
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface ISalaryAdapter
{
SalaryOperationResponse GetListByPeriod(DateTime fromDate, DateTime toDate);
SalaryOperationResponse GetListByPeriodByMaster(DateTime fromDate, DateTime toDate, string masterId);
SalaryOperationResponse CalculateSalaryByMonth(DateTime date);
}

View File

@@ -1,15 +0,0 @@
using TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
using TwoFromTheCasketContratcs.BindingModels;
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.AdapterContracts;
public interface IServiceAdapter
{
ServiceOperationResponse GetList(bool onlyActive);
ServiceOperationResponse GetListByServiceType(ServiceType serviceType, bool onlyActive);
ServiceOperationResponse GetListByMasterId(string masterId, bool onlyActive);
ServiceOperationResponse RegisterService(ServiceBindingModel serviceModel);
ServiceOperationResponse ChangeServiceInfo(ServiceBindingModel serviceModel);
ServiceOperationResponse RemoveService(string id);
}

View File

@@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class MasterOperationResponse : OperationResponse
{
public static MasterOperationResponse OK(List<MasterViewModel> data) => OK<MasterOperationResponse, List<MasterViewModel>>(data);
public static MasterOperationResponse OK(MasterViewModel data) => OK<MasterOperationResponse, MasterViewModel>(data);
public static MasterOperationResponse NoContent() => NoContent<MasterOperationResponse>();
public static MasterOperationResponse NotFound(string message) => NotFound<MasterOperationResponse>(message);
public static MasterOperationResponse BadRequest(string message) => BadRequest<MasterOperationResponse>(message);
public static MasterOperationResponse InternalServerError(string message) => InternalServerError<MasterOperationResponse>(message);
}

View File

@@ -1,14 +0,0 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class OrderOperationResponse : OperationResponse
{
public static OrderOperationResponse OK(List<OrderViewModel> data) => OK<OrderOperationResponse, List<OrderViewModel>>(data);
public static OrderOperationResponse OK(OrderViewModel data) => OK<OrderOperationResponse, OrderViewModel>(data);
public static OrderOperationResponse NoContent() => NoContent<OrderOperationResponse>();
public static OrderOperationResponse NotFound(string message) => NotFound<OrderOperationResponse>(message);
public static OrderOperationResponse BadRequest(string message) => BadRequest<OrderOperationResponse>(message);
public static OrderOperationResponse InternalServerError(string message) => InternalServerError<OrderOperationResponse>(message);
}

View File

@@ -1,25 +0,0 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class PostOperationResponse : OperationResponse
{
public static PostOperationResponse OK(List<PostViewModel> data) =>
OK<PostOperationResponse, List<PostViewModel>>(data);
public static PostOperationResponse OK(PostViewModel data) =>
OK<PostOperationResponse, PostViewModel>(data);
public static PostOperationResponse NoContent() =>
NoContent<PostOperationResponse>();
public static PostOperationResponse NotFound(string message) =>
NotFound<PostOperationResponse>(message);
public static PostOperationResponse BadRequest(string message) =>
BadRequest<PostOperationResponse>(message);
public static PostOperationResponse InternalServerError(string message) =>
InternalServerError<PostOperationResponse>(message);
}

View File

@@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class ReportOperationResponse : OperationResponse
{
public static ReportOperationResponse OK(List<ServiceHistoryViewModel> data) => OK<ReportOperationResponse, List<ServiceHistoryViewModel>>(data);
public static ReportOperationResponse OK(List<ServiceWithHistoryViewModel> data) => OK<ReportOperationResponse, List<ServiceWithHistoryViewModel>>(data);
public static ReportOperationResponse OK(List<OrderViewModel> data) => OK<ReportOperationResponse, List<OrderViewModel>>(data);
public static ReportOperationResponse OK(List<MasterSalaryByPeriodViewModel> data) => OK<ReportOperationResponse, List<MasterSalaryByPeriodViewModel>>(data);
public static ReportOperationResponse OK(Stream data, string fileName) => OK<ReportOperationResponse, Stream>(data, fileName);
public static ReportOperationResponse BadRequest(string message) =>
BadRequest<ReportOperationResponse>(message);
public static ReportOperationResponse InternalServerError(string message) =>
InternalServerError<ReportOperationResponse>(message);
}

View File

@@ -1,13 +0,0 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class SalaryOperationResponse : OperationResponse
{
public static SalaryOperationResponse OK(List<SalaryViewModel> data) => OK<SalaryOperationResponse, List<SalaryViewModel>>(data);
public static SalaryOperationResponse NoContent() => NoContent<SalaryOperationResponse>();
public static SalaryOperationResponse NotFound(string message) => NotFound<SalaryOperationResponse>(message);
public static SalaryOperationResponse BadRequest(string message) => BadRequest<SalaryOperationResponse>(message);
public static SalaryOperationResponse InternalServerError(string message) => InternalServerError<SalaryOperationResponse>(message);
}

View File

@@ -1,14 +0,0 @@
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.ViewModels;
namespace TwoFromTheCasketContratcs.AdapterContracts.OperationResponses;
public class ServiceOperationResponse : OperationResponse
{
public static ServiceOperationResponse OK(List<ServiceViewModel> data) => OK<ServiceOperationResponse, List<ServiceViewModel>>(data);
public static ServiceOperationResponse OK(ServiceViewModel data) => OK<ServiceOperationResponse, ServiceViewModel>(data);
public static ServiceOperationResponse NoContent() => NoContent<ServiceOperationResponse>();
public static ServiceOperationResponse NotFound(string message) => NotFound<ServiceOperationResponse>(message);
public static ServiceOperationResponse BadRequest(string message) => BadRequest<ServiceOperationResponse>(message);
public static ServiceOperationResponse InternalServerError(string message) => InternalServerError<ServiceOperationResponse>(message);
}

View File

@@ -1,22 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.BindingModels;
public class MasterBindingModel
{
public string? Id { get; set; }
public string? FIO { get; set; }
public string? PostId { get; set; }
public DateTime? BirthDate { get; set; }
public DateTime? EmploymentDate { get; set; }
public bool IsDeleted { get; set; }
}

View File

@@ -1,14 +0,0 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.BindingModels;
public class OrderBindingModel
{
public required string? Id { get; set; }
public required DateTime Date { get; set; }
public required StatusType Status { get; set; }
public required RoomType RoomType { get; set; }
}

View File

@@ -1,61 +0,0 @@
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.BindingModels;
public class PostBindingModel
{
public string? Id { get; set; }
public string? PostId => Id;
public string? PostName { get; set; }
public string? PostType { get; set; }
[AlternativeName("ConfigurationJson")]
public string? ConfigurationJson { get; set; }
[AlternativeName("ConfigurationModel")]
public PostConfiguration? ConfigurationModel => ParseJson(ConfigurationJson ?? "");
private string ParseConfiguration(PostConfiguration model) =>
System.Text.Json.JsonSerializer.Serialize(model, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
private PostConfiguration? ParseJson(string json)
{
if (string.IsNullOrEmpty(json))
return null;
try
{
var obj = JToken.Parse(json);
if (obj is not null)
{
return obj.Value<string>("Type") switch
{
nameof(CarpenterPostConfiguration) => JsonConvert.DeserializeObject<CarpenterPostConfiguration>(
json)!,
nameof(PainterPostConfiguration) => JsonConvert
.DeserializeObject<PainterPostConfiguration>(json)!,
nameof(PlastererPostConfiguration) => JsonConvert.DeserializeObject<PlastererPostConfiguration>(
json)!,
_ => JsonConvert.DeserializeObject<PostConfiguration>(json)!,
};
}
}
catch
{
// Return null if parsing fails
}
return null;
}
}

View File

@@ -1,15 +0,0 @@
using System.Diagnostics.Metrics;
namespace TwoFromTheCasketContratcs.BindingModels;
public class SalaryBindingModel
{
public string? Id { get; set; }
public string? MasterId { get; set; }
public DateTime SalaryDate { get; set; }
public double SalarySize { get; set; }
public double Prize { get; set; }
}

View File

@@ -1,18 +0,0 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.BindingModels;
public class ServiceBindingModel
{
public string? Id { get; set; }
public string? ServiceName { get; set; }
public ServiceType ServiceType { get; set; }
public string? MasterId { get; set; }
public double Price { get; set; }
public bool IsDeleted { get; set; }
}

View File

@@ -1,12 +0,0 @@
namespace TwoFromTheCasketContratcs.BindingModels;
public class ServiceOrderBindingModel
{
public string? OrderId { get; set; }
public string? ServiceId { get; set; }
public string? MasterId { get; set; }
public int TimeOfWorking { get; set; }
}

View File

@@ -7,7 +7,7 @@ using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
internal interface IMasterBuisnessLogicContract
public interface IMasterBuisnessLogicContract
{
List<MasterDataModel> GetAllMasters(bool onlyActive = true);

View File

@@ -7,7 +7,7 @@ using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
internal interface IOrderBuisnessLogicContract
public interface IOrderBuisnessLogicContract
{
List<OrderDataModel> GetAllOrder();

View File

@@ -7,7 +7,7 @@ using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
internal interface IPostBuisnessLogicContract
public interface IPostBuisnessLogicContract
{
List<PostDataModel> GetAllPosts();

View File

@@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
internal interface IReportContract
{
Task<List<ServiceHistoryDataModel>> GetDataServiceHistoryAsync(CancellationToken ct);
Task<List<OrderDataModel>> GetDataOrderByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<List<MasterSalaryByPeriodDataModel>> GetDataSalaryByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<List<ServiceWithHistoryDataModel>> GetDataServicesWithHistoryAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<Stream> CreateDocumentServicesWithHistoryAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<Stream> CreateDocumentOrdersByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
Task<Stream> CreateDocumentSalaryByPeriodAsync(DateTime dateStart, DateTime dateFinish, CancellationToken ct);
}

View File

@@ -7,7 +7,7 @@ using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
internal interface ISalaryBuisnessLogicContract
public interface ISalaryBuisnessLogicContract
{
List<SalaryDataModel> GetAllSalariesByPeriod(DateTime fromDate, DateTime toDate);

View File

@@ -8,7 +8,7 @@ using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.BuisnessLogicsContracts;
internal interface IServiceBuisnessLogicContract
public interface IServiceBuisnessLogicContract
{
List<ServiceDataModel> GetAllServices(bool onlyActive);

View File

@@ -9,15 +9,10 @@ using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Exceptions;
using System.Text.RegularExpressions;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
using Microsoft.Extensions.Configuration;
using TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.DataModels;
internal class MasterDataModel(string id, string fio, string postId, DateTime birthDate, DateTime employmentDate, bool isDeleted) : IValidation
public class MasterDataModel(string id, string fio, string postId, DateTime birthDate, DateTime employmentDate, bool isDeleted) : IValidation
{
public string Id { get; private set; } = id;
@@ -25,42 +20,41 @@ internal class MasterDataModel(string id, string fio, string postId, DateTime bi
public string PostId { get; private set; } = postId;
public DateTime BirthDate { get; private set; } = birthDate.ToUniversalTime();
public DateTime BirthDate { get; private set; } = birthDate;
public DateTime EmploymentDate { get; private set; } = employmentDate.ToUniversalTime();
public DateTime EmploymentDate { get; private set; } = employmentDate;
public bool IsDeleted { get; private set; } = isDeleted;
public MasterDataModel() : this(string.Empty, string.Empty, string.Empty, DateTime.UtcNow, DateTime.UtcNow, false) { }
public void Validate(IStringLocalizer<Messages> localazier)
public void Validate()
{
if (Id.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Field Id is empty");
if (!Id.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "Id"));
throw new ValidationException("The value in the field Id is not a unique identifier");
if (!Regex.IsMatch(FIO, @"^[А-ЯЁA-Z][а-яёa-z]*(?:-[А-ЯЁA-Z][а-яёa-z]*)?\s[А-ЯЁA-Z][а-яёa-z]*(?:\s[А-ЯЁA-Z][а-яёa-z]*)?$"))
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectFIO"]));
throw new ValidationException("Field FIO is not FIO");
if (PostId.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "PostId"));
throw new ValidationException("Field PostId is empty");
if (!PostId.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "PostId"));
throw new ValidationException("The value in the field PostId is not a unique identifier");
if (BirthDate.Date > DateTime.Now.AddYears(-16).Date)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageMinorCannotBeHired"], BirthDate.ToShortDateString()));
throw new ValidationException($"Minors cannot be hired (BirthDate = {BirthDate.ToShortDateString()})");
if (EmploymentDate.Date < BirthDate.Date)
throw new ValidationException(localazier["ValidationExceptionMessageEmploymentDateBeforeBirthDate"]);
throw new ValidationException("The date of employment cannot be less than the date of birth");
if ((EmploymentDate - BirthDate).TotalDays / 365 < 16)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageMinorAgeAtEmployment"], EmploymentDate.ToShortDateString(), BirthDate.ToShortDateString()));
throw new ValidationException($"Minors cannot be hired (EmploymentDate - {EmploymentDate.ToShortDateString()}, BirthDate - {BirthDate.ToShortDateString()})");
}
}

View File

@@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.DataModels;
public class MasterSalaryByPeriodDataModel
{
public required string MasterFIO { get; set; }
public double TotalSalary { get; set; }
public DateTime FromPeriod { get; set; }
public DateTime ToPeriod { get; set; }
}

View File

@@ -1,5 +1,4 @@
using Microsoft.Extensions.Localization;
using System;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
@@ -9,36 +8,34 @@ using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.DataModels;
internal class OrderDataModel( string id, DateTime data, StatusType status, RoomType roomType) : IValidation
public class OrderDataModel( string id, DateTime dataTime, StatusType status, RoomType roomType) : IValidation
{
public string Id { get; private set; } = id;
public DateTime Date { get; private set; } = data.ToUniversalTime();
public DateTime Date { get; private set; } = dataTime;
public StatusType Status { get; private set; } = status;
public RoomType RoomType { get; private set; } = roomType;
public OrderDataModel() : this(string.Empty, DateTime.UtcNow, StatusType.None, RoomType.None) { }
public void Validate(IStringLocalizer<Messages> localazier)
public void Validate()
{
if (Id.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Field Id is empty");
if (!Id.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "Id"));
throw new ValidationException("The value in the field Id is not a unique identifier");
if (Date == default)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldIsDefault"], "Date"));
throw new ValidationException("Field Date is empty");
if (Status == StatusType.None)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldIsNone"], "Status"));
throw new ValidationException("Field Status is empty");
if (RoomType == RoomType.None)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldIsNone"], "RoomType"));
throw new ValidationException("Field RoomType is empty");
}
}

View File

@@ -1,47 +1,44 @@
using TwoFromTheCasketContratcs.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.DataModels;
internal class PostDataModel(string postId, string postName, PostType postType, PostConfiguration configuration) : IValidation
public class PostDataModel(string id, string postName, PostType
postType, double salary) : IValidation
{
[AlternativeName("PostId")]
public string Id { get; private set; } = postId;
public string Id { get; private set; } = id;
public string PostName { get; private set; } = postName;
public PostType PostType { get; private set; } = postType;
[AlternativeName("Configuration")]
public PostConfiguration ConfigurationModel { get; private set; } = configuration;
public double Salary { get; private set; } = salary;
public PostDataModel() : this(string.Empty, string.Empty, PostType.None, new PostConfiguration { Rate = 0 }) { }
public void Validate(IStringLocalizer<Messages> localizer)
public void Validate()
{
if (Id.IsEmpty())
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Field Id is empty");
if (!Id.IsGuid())
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageIncorrectField"], "Id"));
throw new ValidationException("The value in the field Id is not a unique identifier");
if (PostName.IsEmpty())
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageEmptyField"], "PostName"));
throw new ValidationException("Field PostName is empty");
if (PostType == PostType.None)
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageFieldIsNone"], "PostType"));
throw new ValidationException("Field PostType is empty");
if (ConfigurationModel is null)
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageFieldNotInitialized"], "ConfigurationModel"));
if (ConfigurationModel!.Rate <= 0)
throw new ValidationException(string.Format(localizer["ValidationExceptionMessageFieldLessOrEqualZero"], "Rate"));
if (Salary <= 0)
throw new ValidationException("Field Salary is empty");
}
}
}

View File

@@ -1,5 +1,4 @@
using Microsoft.Extensions.Localization;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -7,33 +6,28 @@ using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Mapper;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.DataModels;
internal class SalaryDataModel(string masterId, DateTime salaryDate, double masterSalary, double prize) : IValidation
public class SalaryDataModel(string masterId, DateTime salaryDate, double masterSalary, double prize) : IValidation
{
public string MasterId { get; private set; } = masterId;
public DateTime SalaryDate { get; private set; } = salaryDate.ToUniversalTime();
public DateTime SalaryDate { get; private set; } = salaryDate;
[AlternativeName("SalarySize")]
public double Salary { get; private set; } = masterSalary;
public double Prize { get; private set; } = prize;
public SalaryDataModel() : this(string.Empty, DateTime.UtcNow, 0, 0) { }
public void Validate(IStringLocalizer<Messages> localazier)
public void Validate()
{
if (MasterId.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "MasterId"));
throw new ValidationException("Field MasterId is empty");
if (!MasterId.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "MasterId"));
throw new ValidationException("The value in the field MasterId is not a unique identifier");
if (Salary <= 0)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldLessOrEqualZero"], "Salary"));
throw new ValidationException("Field Salary is less than or equal to 0");
}
}

View File

@@ -1,5 +1,4 @@
using Microsoft.Extensions.Localization;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -8,11 +7,10 @@ using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.DataModels;
internal class ServiceDataModel(string id, string serviceName, ServiceType serviceType, string masterID, double price, bool isDeleted) : IValidation
public class ServiceDataModel(string id, string serviceName, ServiceType serviceType, string masterID, double price, bool isDeleted) : IValidation
{
public string Id { get; private set; } = id;
@@ -26,32 +24,30 @@ internal class ServiceDataModel(string id, string serviceName, ServiceType servi
public bool IsDeleted { get; private set; } = isDeleted;
public ServiceDataModel() : this(string.Empty, string.Empty, ServiceType.None, string.Empty, 0, false) { }
public void Validate(IStringLocalizer<Messages> localazier)
public void Validate()
{
if (Id.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "Id"));
throw new ValidationException("Field Id is empty");
if (!Id.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "Id"));
throw new ValidationException("The value in the field Id is not a unique identifier");
if (ServiceName.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "ServiceName"));
throw new ValidationException("Field ServiceName is empty");
if (ServiceType == ServiceType.None)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldIsNone"], "ServiceType"));
throw new ValidationException("Field ServiceType is empty");
if (MasterId.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "MasterId"));
throw new ValidationException("Field MasterId is empty");
if (!MasterId.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "MasterId"));
throw new ValidationException("The value in the field MasterId is not a unique identifier");
if (Price <= 0)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldLessOrEqualZero"], "Price"));
throw new ValidationException("Field Price is less than or equal to 0");
}
}

View File

@@ -1,5 +1,4 @@
using Microsoft.Extensions.Localization;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -7,11 +6,10 @@ using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.DataModels;
internal class ServiceHistoryDataModel(string serviceId, double oldPrice) :
public class ServiceHistoryDataModel(string serviceId, double oldPrice) :
IValidation
{
public string ServiceId { get; private set; } = serviceId;
@@ -20,18 +18,16 @@ IValidation
public DateTime ChangeDate { get; private set; } = DateTime.UtcNow;
public ServiceHistoryDataModel() : this(string.Empty, 0) { }
public void Validate(IStringLocalizer<Messages> localazier)
public void Validate()
{
if (ServiceId.IsEmpty())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "ServiceId"));
throw new ValidationException("Field ServiceId is empty");
if (!ServiceId.IsGuid())
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "ServiceId"));
throw new ValidationException("The value in the field ServiceId is not a unique identifier");
if (OldPrice <= 0)
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldLessOrEqualZero"], "OldPrice"));
throw new ValidationException("Field OldPrice is less than or equal to 0");
}
}

View File

@@ -1,5 +1,4 @@
using Microsoft.Extensions.Localization;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -7,11 +6,10 @@ using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Extensions;
using TwoFromTheCasketContratcs.Infrastructure;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.DataModels;
internal class ServiceOrderDataModel(string orderId, string serviceId, string masterId, int timeOfWorking) : IValidation
public class ServiceOrderDataModel(string orderId, string serviceId, string masterId, int timeOfWorking) : IValidation
{
public string OrderId { get; private set; } = orderId;
@@ -21,37 +19,35 @@ internal class ServiceOrderDataModel(string orderId, string serviceId, string ma
public int TimeOfWorking { get; private set; }= timeOfWorking;
public ServiceOrderDataModel() : this(string.Empty, string.Empty, string.Empty, 0) { }
public void Validate(IStringLocalizer<Messages> localazier)
public void Validate()
{
if (OrderId.IsEmpty())
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "OrderId"));
throw new ValidationException("Field OrderId is empty");
}
if (!OrderId.IsGuid())
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "OrderId"));
throw new ValidationException("The value in the field OrderId is not a unique identifier");
}
if (ServiceId.IsEmpty())
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "ServiceId"));
throw new ValidationException("Field ServiceId is empty");
}
if (!ServiceId.IsGuid())
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "ServiceId"));
throw new ValidationException("The value in the field ServiceId is not a unique identifier");
}
if (MasterId.IsEmpty())
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageEmptyField"], "MasterId"));
throw new ValidationException("Field MasterId is empty");
}
if (!MasterId.IsGuid())
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageIncorrectField"], "MasterId"));
throw new ValidationException("The value in the field MasterId is not a unique identifier");
}
if (TimeOfWorking == 0)
{
throw new ValidationException(string.Format(localazier["ValidationExceptionMessageFieldIsZero"], "TimeOfWorking"));
throw new ValidationException("Field TimeOfWorking is less than or equal to 0");
}
}
}

View File

@@ -1,15 +0,0 @@
using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.DataModels;
internal class ServiceWithHistoryDataModel
{
public string Id { get; set; } = string.Empty;
public string ServiceName { get; set; } = string.Empty;
public ServiceType ServiceType { get; set; }
public double Price { get; set; }
public string MasterId { get; set; } = string.Empty;
public DateTime CreatedAt { get; set; }
public bool IsDeleted { get; set; }
public List<ServiceHistoryDataModel> History { get; set; } = new();
}

View File

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.Exceptions;
internal class ElementDeletedException(string id, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["ElementDeletedExceptionMessage"].Value, id))
{ }

View File

@@ -3,15 +3,16 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.Exceptions;
internal class ElementExistsException(string paramName, string paramValue, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["ElementExistsExceptionMessage"].Value, paramValue, paramName))
public class ElementExistsException : Exception
{
public string ParamName { get; private set; } = paramName;
public string ParamValue { get; private set; } = paramValue;
public string ParamName { get; private set; }
public string ParamValue { get; private set; }
public ElementExistsException(string paramName, string paramValue) : base($"There is alredy an element with value {paramValue} of parameter {paramName}")
{
ParamName = paramName;
ParamValue = paramValue;
}
}

View File

@@ -3,13 +3,12 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.Exceptions;
internal class ElementNotFoundException(string value, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["ElementNotFoundExceptionMessage"].Value, value))
public class ElementNotFoundException : Exception
{
public string Value { get; private set; } = value;
public string Value { get; private set; }
public ElementNotFoundException(string value) : base($"Element not found at value = {value}") { Value = value; }
}

View File

@@ -4,11 +4,10 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Runtime.InteropServices.JavaScript.JSType;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.Exceptions;
internal class IncorrectDatesException(DateTime start, DateTime end, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["IncorrectDatesExceptionMessage"].Value, start.ToShortDateString(), end.ToShortDateString()))
{ }
public class IncorrectDatesException : Exception
{
public IncorrectDatesException(DateTime start, DateTime end) : base($"The end date must be later than the start date..StartDate: { start: dd.MM.YYYY}. EndDate: {end:dd.MM.YYYY}") { }
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Exceptions;
public class NullListException : Exception
{
public NullListException() : base("The returned list is null") { }
}

View File

@@ -3,11 +3,10 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.Exceptions;
internal class StorageException(Exception ex, IStringLocalizer<Messages> localizer) :
Exception(string.Format(localizer["StorageExceptionMessage"].Value, ex.Message), ex)
{ }
public class StorageException : Exception
{
public StorageException(Exception ex) : base($"Error while working in storage: {ex.Message}", ex) { }
}

View File

@@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure;
public interface IConfigurationDatabase
{
string ConnectionString { get; }
}

View File

@@ -1,14 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure;
public interface IConfigurationSalary
{
double ExtraSaleSum { get; }
double ExtraInstallationSum { get; }
int MaxThreads { get; }
}

View File

@@ -1,14 +1,12 @@
using Microsoft.Extensions.Localization;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Resources;
namespace TwoFromTheCasketContratcs.Infrastructure;
internal interface IValidation
public interface IValidation
{
void Validate(IStringLocalizer<Messages> localazier);
void Validate();
}

View File

@@ -1,54 +0,0 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure;
public class OperationResponse
{
protected HttpStatusCode StatusCode { get; set; }
protected object? Result { get; set; }
protected string? FileName { get; set; }
public IActionResult GetResponse(HttpRequest request, HttpResponse response)
{
ArgumentNullException.ThrowIfNull(request);
ArgumentNullException.ThrowIfNull(response);
response.StatusCode = (int)StatusCode;
if (Result == null)
return new StatusCodeResult((int)StatusCode);
return new ObjectResult(Result);
}
protected static TResult OK<TResult, TData>(TData data)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.OK, Result = data };
protected static TResult OK<TResult, TData>(TData data, string fileName) where TResult : OperationResponse, new() => new() { StatusCode = HttpStatusCode.OK, Result = data, FileName = fileName };
protected static TResult NoContent<TResult>()
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.NoContent };
protected static TResult BadRequest<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.BadRequest, Result = errorMessage };
protected static TResult NotFound<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.NotFound, Result = errorMessage };
protected static TResult InternalServerError<TResult>(string? errorMessage = null)
where TResult : OperationResponse, new() =>
new() { StatusCode = HttpStatusCode.InternalServerError, Result = errorMessage };
}

View File

@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
public class CarpenterPostConfiguration : PostConfiguration
{
public override string Type => nameof(CarpenterPostConfiguration);
public double BonusForExtraCarpentry { get; set; }
}

View File

@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
public class PainterPostConfiguration : PostConfiguration
{
public override string Type => nameof(PainterPostConfiguration);
public double PainterPercent { get; set; }
public double BonusForExtraPainter { get; set; }
}

View File

@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
public class PlastererPostConfiguration : PostConfiguration
{
public override string Type => nameof(PlastererPostConfiguration);
public double PlastererPercent { get; set; }
public double BonusForExtraPlasterer { get; set; }
}

View File

@@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Infrastructure.PostConfigurations;
public class PostConfiguration
{
public virtual string Type => nameof(PostConfiguration);
public double Rate { get; set; }
public string CutleryName { get; set; } = CultureInfo.CurrentCulture.Name;
}

View File

@@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Mapper;
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true)]
class AlternativeNameAttribute(string alternativeName) : Attribute
{
public string AlternativeName { get; set; } = alternativeName;
}

View File

@@ -1,247 +0,0 @@
using System.Collections;
using System.Reflection;
namespace TwoFromTheCasketContratcs.Mapper;
internal static class CustomMapper
{
public static To MapObject<To>(object obj, To newObject)
{
ArgumentNullException.ThrowIfNull(obj);
ArgumentNullException.ThrowIfNull(newObject);
var typeFrom = obj.GetType();
var typeTo = newObject.GetType();
var propertiesFrom = typeFrom.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(x => x.CanRead).ToArray();
foreach (var property in typeTo.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(x => x.CanWrite))
{
if (property.GetCustomAttribute<IgnoreMappingAttribute>() is not null) continue;
var propertyFrom = TryGetPropertyFrom(property, propertiesFrom);
if (propertyFrom is null)
{
FindAndMapDefaultValue(property, newObject);
continue;
}
var fromValue = propertyFrom.GetValue(obj);
var postProcessingAttribute = property.GetCustomAttribute<PostProcessingAttribute>();
if (postProcessingAttribute is not null)
{
var value = PostProcessing(fromValue, postProcessingAttribute, newObject);
if (value is not null)
{
property.SetValue(newObject, value);
}
continue;
}
if (propertyFrom.PropertyType.IsGenericType && propertyFrom.PropertyType.Name.StartsWith("List") && fromValue is not null)
{
fromValue = MapListOfObjects(property, fromValue);
}
if (propertyFrom.PropertyType.IsEnum && property.PropertyType == typeof(string) && fromValue != null)
{
fromValue = fromValue.ToString();
}
else if (!propertyFrom.PropertyType.IsEnum && property.PropertyType.IsEnum && fromValue is not null)
{
if (fromValue is string stringValue) fromValue = Enum.Parse(property.PropertyType, stringValue);
else fromValue = Enum.ToObject(property.PropertyType, fromValue);
}
if (fromValue is not null)
{
if (propertyFrom.PropertyType.IsClass && property.PropertyType.IsClass && propertyFrom.PropertyType != typeof(string) && property.PropertyType != typeof(string) && !property.PropertyType.IsAssignableFrom(propertyFrom.PropertyType))
{
try
{
var nestedInstance = Activator.CreateInstance(property.PropertyType);
if (nestedInstance != null)
{
var nestedMapped = MapObject(fromValue, nestedInstance);
property.SetValue(newObject, nestedMapped);
continue;
}
}
catch
{
}
}
property.SetValue(newObject, fromValue);
}
}
var fieldsTo = typeTo.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
var fieldsFrom = typeFrom.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
foreach (var field in fieldsTo)
{
if (field.Name.Contains("k__BackingField")) continue;
if (field.GetCustomAttribute<IgnoreMappingAttribute>() is not null) continue;
var sourceField = fieldsFrom.FirstOrDefault(f => f.Name == field.Name);
object? fromValue = null;
if (sourceField is not null)
{
fromValue = sourceField.GetValue(obj);
}
else
{
var propertyName = field.Name.TrimStart('_');
var sourceProperty = typeFrom.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (sourceProperty is not null && sourceProperty.CanRead)
{
fromValue = sourceProperty.GetValue(obj);
}
}
if (fromValue is null)
continue;
if (field.FieldType.IsClass && field.FieldType != typeof(string))
{
try
{
var nested = Activator.CreateInstance(field.FieldType)!;
var mapped = MapObject(fromValue, nested);
RemoveReadOnly(field);
field.SetValue(newObject, mapped);
continue;
}
catch
{
}
}
RemoveReadOnly(field);
field.SetValue(newObject, fromValue);
}
var classPostProcessing = typeTo.GetCustomAttribute<PostProcessingAttribute>();
if (classPostProcessing is not null && classPostProcessing.MappingCallMethodName is not null)
{
var methodInfo = typeTo.GetMethod(classPostProcessing.MappingCallMethodName, BindingFlags.NonPublic | BindingFlags.Instance);
methodInfo?.Invoke(newObject, []);
}
return newObject;
}
private static void RemoveReadOnly(FieldInfo field)
{
if (!field.IsInitOnly) return;
var attr = typeof(FieldInfo).GetField("m_fieldAttributes", BindingFlags.Instance | BindingFlags.NonPublic);
if (attr != null)
{
var current = (FieldAttributes)attr.GetValue(field)!;
attr.SetValue(field, current & ~FieldAttributes.InitOnly);
}
}
public static To MapObject<To>(object obj) => MapObject(obj, Activator.CreateInstance<To>()!);
public static To? MapObjectWithNull<To>(object? obj) => obj is null ? default : MapObject(obj, Activator.CreateInstance<To>());
private static PropertyInfo? TryGetPropertyFrom(PropertyInfo propertyTo, PropertyInfo[] propertiesFrom)
{
var customAttribute = propertyTo.GetCustomAttributes<AlternativeNameAttribute>()?.ToArray().FirstOrDefault(x => propertiesFrom.Any(y => y.Name == x.AlternativeName));
if (customAttribute is not null)
{
return propertiesFrom.FirstOrDefault(x => x.Name == customAttribute.AlternativeName);
}
return propertiesFrom.FirstOrDefault(x => x.Name == propertyTo.Name);
}
private static object? PostProcessing<T>(object? value, PostProcessingAttribute postProcessingAttribute, T newObject)
{
if (value is null || newObject is null)
{
return null;
}
if (!string.IsNullOrEmpty(postProcessingAttribute.MappingCallMethodName))
{
var methodInfo = newObject.GetType().GetMethod(postProcessingAttribute.MappingCallMethodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (methodInfo is not null)
{
return methodInfo.Invoke(newObject, [value]);
}
}
else if (postProcessingAttribute.ActionType != PostProcessingType.None)
{
switch (postProcessingAttribute.ActionType)
{
case PostProcessingType.ToUniversalTime:
return ToUniversalTime(value);
case PostProcessingType.ToLocalTime:
return ToLocalTime(value);
}
}
return null;
}
private static object? ToLocalTime(object? obj)
{
if (obj is DateTime date) return date.ToLocalTime();
return obj;
}
private static object? ToUniversalTime(object? obj)
{
if (obj is DateTime date) return date.ToUniversalTime();
return obj;
}
private static void FindAndMapDefaultValue<T>(PropertyInfo property, T newObject)
{
var defaultValueAttribute = property.GetCustomAttribute<DefaultValueAttribute>();
if (defaultValueAttribute is null)
{
return;
}
if (defaultValueAttribute.DefaultValue is not null)
{
property.SetValue(newObject, defaultValueAttribute.DefaultValue);
return;
}
var value = defaultValueAttribute.Func switch
{
DefaultValueFunc.UtcNow => DateTime.UtcNow,
_ => (object?)null,
};
if (value is not null)
{
property.SetValue(newObject, value);
}
}
private static object? MapListOfObjects(PropertyInfo propertyTo, object list)
{
var listResult = Activator.CreateInstance(propertyTo.PropertyType);
foreach (var elem in (IEnumerable)list)
{
var newElem = MapObject(elem, Activator.CreateInstance(propertyTo.PropertyType.GenericTypeArguments[0])!);
if (newElem is not null)
{
propertyTo.PropertyType.GetMethod("Add")!.Invoke(listResult, [newElem]);
}
}
return listResult;
}
}
enum DefaultValueFunc
{
None,
UtcNow
}

View File

@@ -1,18 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Mapper;
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class)]
class DefaultValueAttribute : Attribute
{
public object? DefaultValue { get; set; }
public string? FuncName { get; set; }
public DefaultValueFunc Func { get; set; } = DefaultValueFunc.None;
}

View File

@@ -1,12 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Mapper;
[AttributeUsage(AttributeTargets.Property)]
class IgnoreMappingAttribute : Attribute
{
}

View File

@@ -1,15 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Mapper;
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class | AttributeTargets.Field)]
class PostProcessingAttribute : Attribute
{
public string? MappingCallMethodName { get; set; }
public PostProcessingType ActionType { get; set; } = PostProcessingType.None;
}

View File

@@ -1,16 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TwoFromTheCasketContratcs.Mapper;
enum PostProcessingType
{
None = -1,
ToUniversalTime = 1,
ToLocalTime = 2
}

View File

@@ -1,783 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace TwoFromTheCasketContratcs.Resources {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Messages {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Messages() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TwoFromTheCasketContratcs.Resources.Messages", typeof(Messages).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Данные пусты.
/// </summary>
internal static string AdapterMessageDataIsEmpty {
get {
return ResourceManager.GetString("AdapterMessageDataIsEmpty", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент не найден: {0}.
/// </summary>
internal static string AdapterMessageElementNotFound {
get {
return ResourceManager.GetString("AdapterMessageElementNotFound", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент с идентификатором {0} был удален.
/// </summary>
internal static string AdapterMessageElementWasDeleted {
get {
return ResourceManager.GetString("AdapterMessageElementWasDeleted", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент с данными {0} был удален.
/// </summary>
internal static string AdapterMessageElementWasDeletedByData {
get {
return ResourceManager.GetString("AdapterMessageElementWasDeletedByData", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Ошибка при работе с хранилищем данных: {0}.
/// </summary>
internal static string AdapterMessageErrorWhileWorkingWithStorage {
get {
return ResourceManager.GetString("AdapterMessageErrorWhileWorkingWithStorage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Идентификатор пуст.
/// </summary>
internal static string AdapterMessageIdIsEmpty {
get {
return ResourceManager.GetString("AdapterMessageIdIsEmpty", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Переданы некорректные данные: {0}.
/// </summary>
internal static string AdapterMessageIncorrectDataTransmitted {
get {
return ResourceManager.GetString("AdapterMessageIncorrectDataTransmitted", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Некорректные даты: {0}.
/// </summary>
internal static string AdapterMessageIncorrectDates {
get {
return ResourceManager.GetString("AdapterMessageIncorrectDates", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Список не инициализирован.
/// </summary>
internal static string AdapterMessageListNotInitialized {
get {
return ResourceManager.GetString("AdapterMessageListNotInitialized", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент не найден по данным {0}.
/// </summary>
internal static string AdapterMessageNotFoundElementByData {
get {
return ResourceManager.GetString("AdapterMessageNotFoundElementByData", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент не найден по идентификатору {0}.
/// </summary>
internal static string AdapterMessageNotFoundElementById {
get {
return ResourceManager.GetString("AdapterMessageNotFoundElementById", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата.
/// </summary>
internal static string DocumentDocCaptionDate {
get {
return ResourceManager.GetString("DocumentDocCaptionDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата трудоустройства.
/// </summary>
internal static string DocumentDocEmploymentDate {
get {
return ResourceManager.GetString("DocumentDocEmploymentDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Отчёт сформирован: {0}.
/// </summary>
internal static string DocumentDocGeneratedOn {
get {
return ResourceManager.GetString("DocumentDocGeneratedOn", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Отчет по мастерам.
/// </summary>
internal static string DocumentDocHeader {
get {
return ResourceManager.GetString("DocumentDocHeader", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на ФИО мастера.
/// </summary>
internal static string DocumentDocMasterFIO {
get {
return ResourceManager.GetString("DocumentDocMasterFIO", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на За указанный период мастера не найдены..
/// </summary>
internal static string DocumentDocNoMastersFound {
get {
return ResourceManager.GetString("DocumentDocNoMastersFound", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Количество заказов.
/// </summary>
internal static string DocumentDocOrdersCount {
get {
return ResourceManager.GetString("DocumentDocOrdersCount", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Период: с {0} по {1}.
/// </summary>
internal static string DocumentDocPeriodFromTo {
get {
return ResourceManager.GetString("DocumentDocPeriodFromTo", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Статус.
/// </summary>
internal static string DocumentDocStatus {
get {
return ResourceManager.GetString("DocumentDocStatus", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Уволен.
/// </summary>
internal static string DocumentDocStatusFired {
get {
return ResourceManager.GetString("DocumentDocStatusFired", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Работает.
/// </summary>
internal static string DocumentDocStatusWorking {
get {
return ResourceManager.GetString("DocumentDocStatusWorking", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Количество.
/// </summary>
internal static string DocumentExcelCaptionCount {
get {
return ResourceManager.GetString("DocumentExcelCaptionCount", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Заказ.
/// </summary>
internal static string DocumentExcelCaptionOrder {
get {
return ResourceManager.GetString("DocumentExcelCaptionOrder", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Услуга.
/// </summary>
internal static string DocumentExcelCaptionService {
get {
return ResourceManager.GetString("DocumentExcelCaptionService", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Сумма.
/// </summary>
internal static string DocumentExcelCaptionSum {
get {
return ResourceManager.GetString("DocumentExcelCaptionSum", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата заказа.
/// </summary>
internal static string DocumentExcelOrderDate {
get {
return ResourceManager.GetString("DocumentExcelOrderDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на ID заказа.
/// </summary>
internal static string DocumentExcelOrderId {
get {
return ResourceManager.GetString("DocumentExcelOrderId", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Заказы за период.
/// </summary>
internal static string DocumentExcelOrdersByPeriod {
get {
return ResourceManager.GetString("DocumentExcelOrdersByPeriod", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на с {0} по {1}.
/// </summary>
internal static string DocumentExcelPeriodFromToShort {
get {
return ResourceManager.GetString("DocumentExcelPeriodFromToShort", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Тип помещения.
/// </summary>
internal static string DocumentExcelRoomType {
get {
return ResourceManager.GetString("DocumentExcelRoomType", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Начисления.
/// </summary>
internal static string DocumentPdfAccruals {
get {
return ResourceManager.GetString("DocumentPdfAccruals", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на за период с {0} по {1}.
/// </summary>
internal static string DocumentPdfSalaryPeriodFromTo {
get {
return ResourceManager.GetString("DocumentPdfSalaryPeriodFromTo", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Зарплатная ведомость.
/// </summary>
internal static string DocumentPdfSalaryStatement {
get {
return ResourceManager.GetString("DocumentPdfSalaryStatement", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Неизвестный мастер.
/// </summary>
internal static string DocumentPdfUnknownMaster {
get {
return ResourceManager.GetString("DocumentPdfUnknownMaster", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Нельзя изменить удаленный элемент (id: {0}).
/// </summary>
internal static string ElementDeletedExceptionMessage {
get {
return ResourceManager.GetString("ElementDeletedExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент со значением {0} параметра {1} уже существует.
/// </summary>
internal static string ElementExistsExceptionMessage {
get {
return ResourceManager.GetString("ElementExistsExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Элемент не найден со значением = {0}.
/// </summary>
internal static string ElementNotFoundExceptionMessage {
get {
return ResourceManager.GetString("ElementNotFoundExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата окончания должна быть позже даты начала. Дата начала: {0}. Дата окончания: {1}.
/// </summary>
internal static string IncorrectDatesExceptionMessage {
get {
return ResourceManager.GetString("IncorrectDatesExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Заказы за период.
/// </summary>
internal static string ReportOrdersHeader {
get {
return ResourceManager.GetString("ReportOrdersHeader", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на ч..
/// </summary>
internal static string ReportOrdersHours {
get {
return ResourceManager.GetString("ReportOrdersHours", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Нет услуг.
/// </summary>
internal static string ReportOrdersNoServices {
get {
return ResourceManager.GetString("ReportOrdersNoServices", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Не назначен.
/// </summary>
internal static string ReportOrdersNotAssigned {
get {
return ResourceManager.GetString("ReportOrdersNotAssigned", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на с {0} по {1}.
/// </summary>
internal static string ReportOrdersPeriod {
get {
return ResourceManager.GetString("ReportOrdersPeriod", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Сумма.
/// </summary>
internal static string ReportOrdersTableAmount {
get {
return ResourceManager.GetString("ReportOrdersTableAmount", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Мастер.
/// </summary>
internal static string ReportOrdersTableMaster {
get {
return ResourceManager.GetString("ReportOrdersTableMaster", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата заказа.
/// </summary>
internal static string ReportOrdersTableOrderDate {
get {
return ResourceManager.GetString("ReportOrdersTableOrderDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Тип помещения.
/// </summary>
internal static string ReportOrdersTableRoomType {
get {
return ResourceManager.GetString("ReportOrdersTableRoomType", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Услуга.
/// </summary>
internal static string ReportOrdersTableService {
get {
return ResourceManager.GetString("ReportOrdersTableService", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Статус.
/// </summary>
internal static string ReportOrdersTableStatus {
get {
return ResourceManager.GetString("ReportOrdersTableStatus", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Время работы.
/// </summary>
internal static string ReportOrdersTableWorkTime {
get {
return ResourceManager.GetString("ReportOrdersTableWorkTime", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Начисления.
/// </summary>
internal static string ReportSalaryAccruals {
get {
return ResourceManager.GetString("ReportSalaryAccruals", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Зарплатная ведомость.
/// </summary>
internal static string ReportSalaryHeader {
get {
return ResourceManager.GetString("ReportSalaryHeader", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на за период с {0} по {1}.
/// </summary>
internal static string ReportSalaryPeriod {
get {
return ResourceManager.GetString("ReportSalaryPeriod", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Сумма.
/// </summary>
internal static string ReportSalaryTableAmount {
get {
return ResourceManager.GetString("ReportSalaryTableAmount", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата.
/// </summary>
internal static string ReportSalaryTableDate {
get {
return ResourceManager.GetString("ReportSalaryTableDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Мастер.
/// </summary>
internal static string ReportSalaryTableMaster {
get {
return ResourceManager.GetString("ReportSalaryTableMaster", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Неизвестный мастер.
/// </summary>
internal static string ReportSalaryUnknownMaster {
get {
return ResourceManager.GetString("ReportSalaryUnknownMaster", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Отчёт сформирован: {0}.
/// </summary>
internal static string ReportServicesGenerated {
get {
return ResourceManager.GetString("ReportServicesGenerated", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Отчет по услугам и их истории изменений.
/// </summary>
internal static string ReportServicesHeader {
get {
return ResourceManager.GetString("ReportServicesHeader", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на —.
/// </summary>
internal static string ReportServicesNoChanges {
get {
return ResourceManager.GetString("ReportServicesNoChanges", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на За указанный период услуги не найдены..
/// </summary>
internal static string ReportServicesNoData {
get {
return ResourceManager.GetString("ReportServicesNoData", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Период: с {0} по {1}.
/// </summary>
internal static string ReportServicesPeriod {
get {
return ResourceManager.GetString("ReportServicesPeriod", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата изменения.
/// </summary>
internal static string ReportServicesTableChangeDate {
get {
return ResourceManager.GetString("ReportServicesTableChangeDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Текущая цена.
/// </summary>
internal static string ReportServicesTableCurrentPrice {
get {
return ResourceManager.GetString("ReportServicesTableCurrentPrice", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Старая цена.
/// </summary>
internal static string ReportServicesTableOldPrice {
get {
return ResourceManager.GetString("ReportServicesTableOldPrice", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Услуга.
/// </summary>
internal static string ReportServicesTableService {
get {
return ResourceManager.GetString("ReportServicesTableService", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Тип.
/// </summary>
internal static string ReportServicesTableType {
get {
return ResourceManager.GetString("ReportServicesTableType", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Ошибка при работе с хранилищем: {0}.
/// </summary>
internal static string StorageExceptionMessage {
get {
return ResourceManager.GetString("StorageExceptionMessage", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Дата трудоустройства не может быть раньше даты рождения.
/// </summary>
internal static string ValidationExceptionMessageEmploymentDateBeforeBirthDate {
get {
return ResourceManager.GetString("ValidationExceptionMessageEmploymentDateBeforeBirthDate", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Значение поле {0} пусто.
/// </summary>
internal static string ValidationExceptionMessageEmptyField {
get {
return ResourceManager.GetString("ValidationExceptionMessageEmptyField", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Поле {0} имеет значение по умолчанию.
/// </summary>
internal static string ValidationExceptionMessageFieldIsDefault {
get {
return ResourceManager.GetString("ValidationExceptionMessageFieldIsDefault", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Поле {0} имеет значение None.
/// </summary>
internal static string ValidationExceptionMessageFieldIsNone {
get {
return ResourceManager.GetString("ValidationExceptionMessageFieldIsNone", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Значение поля {0} равно нулю.
/// </summary>
internal static string ValidationExceptionMessageFieldIsZero {
get {
return ResourceManager.GetString("ValidationExceptionMessageFieldIsZero", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Значение поля {0} меньше или равно нулю.
/// </summary>
internal static string ValidationExceptionMessageFieldLessOrEqualZero {
get {
return ResourceManager.GetString("ValidationExceptionMessageFieldLessOrEqualZero", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Поле {0} не инициализировано.
/// </summary>
internal static string ValidationExceptionMessageFieldNotInitialized {
get {
return ResourceManager.GetString("ValidationExceptionMessageFieldNotInitialized", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Значение в поле {0} не является уникальным идентификатором.
/// </summary>
internal static string ValidationExceptionMessageIncorrectField {
get {
return ResourceManager.GetString("ValidationExceptionMessageIncorrectField", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Значение в поле ФИО не является ФИО.
/// </summary>
internal static string ValidationExceptionMessageIncorrectFIO {
get {
return ResourceManager.GetString("ValidationExceptionMessageIncorrectFIO", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Несовершеннолетние не могут быть приняты на работу (Дата трудоустройства - {0}, Дата рождения - {1}).
/// </summary>
internal static string ValidationExceptionMessageMinorAgeAtEmployment {
get {
return ResourceManager.GetString("ValidationExceptionMessageMinorAgeAtEmployment", resourceCulture);
}
}
/// <summary>
/// Ищет локализованную строку, похожую на Несовершеннолетние не могут быть приняты на работу (Дата рождения = {0}).
/// </summary>
internal static string ValidationExceptionMessageMinorCannotBeHired {
get {
return ResourceManager.GetString("ValidationExceptionMessageMinorCannotBeHired", resourceCulture);
}
}
}
}

View File

@@ -1,360 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ValidationExceptionMessageIncorrectFIO" xml:space="preserve">
<value>Value in field FIO is not FIO</value>
</data>
<data name="ValidationExceptionMessageEmptyField" xml:space="preserve">
<value>Value in field {0} is empty</value>
</data>
<data name="ValidationExceptionMessageMinorCannotBeHired" xml:space="preserve">
<value>Minors cannot be hired (Birth date = {0})</value>
</data>
<data name="ValidationExceptionMessageEmploymentDateBeforeBirthDate" xml:space="preserve">
<value>Employment date cannot be earlier than birth date</value>
</data>
<data name="ValidationExceptionMessageMinorAgeAtEmployment" xml:space="preserve">
<value>Minors cannot be hired (Employment date - {0}, Birth date - {1})</value>
</data>
<data name="ValidationExceptionMessageIncorrectField" xml:space="preserve">
<value>Value in field {0} is not a unique identifier</value>
</data>
<data name="ValidationExceptionMessageFieldLessOrEqualZero" xml:space="preserve">
<value>Field {0} value is less than or equal to zero</value>
</data>
<data name="ValidationExceptionMessageFieldNotInitialized" xml:space="preserve">
<value>Field {0} is not initialized</value>
</data>
<data name="ValidationExceptionMessageFieldIsZero" xml:space="preserve">
<value>Field {0} value is zero</value>
</data>
<data name="ValidationExceptionMessageFieldIsDefault" xml:space="preserve">
<value>Field {0} has default value</value>
</data>
<data name="ValidationExceptionMessageFieldIsNone" xml:space="preserve">
<value>Field {0} has None value</value>
</data>
<data name="ElementDeletedExceptionMessage" xml:space="preserve">
<value>Cannot modify deleted element (id: {0})</value>
</data>
<data name="ElementExistsExceptionMessage" xml:space="preserve">
<value>Element with value {0} of parameter {1} already exists</value>
</data>
<data name="ElementNotFoundExceptionMessage" xml:space="preserve">
<value>Element not found with value = {0}</value>
</data>
<data name="IncorrectDatesExceptionMessage" xml:space="preserve">
<value>End date must be later than start date. Start date: {0}. End date: {1}</value>
</data>
<data name="StorageExceptionMessage" xml:space="preserve">
<value>Storage error: {0}</value>
</data>
<data name="DocumentDocCaptionDate" xml:space="preserve">
<value>Date</value>
</data>
<data name="DocumentExcelCaptionOrder" xml:space="preserve">
<value>Order</value>
</data>
<data name="DocumentExcelCaptionSum" xml:space="preserve">
<value>Sum</value>
</data>
<data name="DocumentExcelCaptionService" xml:space="preserve">
<value>Service</value>
</data>
<data name="DocumentExcelCaptionCount" xml:space="preserve">
<value>Count</value>
</data>
<data name="DocumentDocHeader" xml:space="preserve">
<value>Masters Report</value>
</data>
<data name="DocumentDocPeriodFromTo" xml:space="preserve">
<value>Period: from {0} to {1}</value>
</data>
<data name="DocumentDocGeneratedOn" xml:space="preserve">
<value>Report generated: {0}</value>
</data>
<data name="DocumentDocNoMastersFound" xml:space="preserve">
<value>No masters found for the specified period.</value>
</data>
<data name="DocumentDocMasterFIO" xml:space="preserve">
<value>Master Full Name</value>
</data>
<data name="DocumentDocEmploymentDate" xml:space="preserve">
<value>Employment Date</value>
</data>
<data name="DocumentDocStatus" xml:space="preserve">
<value>Status</value>
</data>
<data name="DocumentDocOrdersCount" xml:space="preserve">
<value>Orders Count</value>
</data>
<data name="DocumentDocStatusFired" xml:space="preserve">
<value>Fired</value>
</data>
<data name="DocumentDocStatusWorking" xml:space="preserve">
<value>Working</value>
</data>
<data name="DocumentExcelOrderDate" xml:space="preserve">
<value>Order Date</value>
</data>
<data name="DocumentExcelRoomType" xml:space="preserve">
<value>Room Type</value>
</data>
<data name="DocumentExcelOrderId" xml:space="preserve">
<value>Order ID</value>
</data>
<data name="DocumentExcelOrdersByPeriod" xml:space="preserve">
<value>Orders for Period</value>
</data>
<data name="DocumentExcelPeriodFromToShort" xml:space="preserve">
<value>from {0} to {1}</value>
</data>
<data name="DocumentPdfSalaryStatement" xml:space="preserve">
<value>Salary Statement</value>
</data>
<data name="DocumentPdfSalaryPeriodFromTo" xml:space="preserve">
<value>for period from {0} to {1}</value>
</data>
<data name="DocumentPdfAccruals" xml:space="preserve">
<value>Accruals</value>
</data>
<data name="DocumentPdfUnknownMaster" xml:space="preserve">
<value>Unknown Master</value>
</data>
<data name="AdapterMessageListNotInitialized" xml:space="preserve">
<value>List not initialized</value>
</data>
<data name="AdapterMessageDataIsEmpty" xml:space="preserve">
<value>Data is empty</value>
</data>
<data name="AdapterMessageIdIsEmpty" xml:space="preserve">
<value>Identifier is empty</value>
</data>
<data name="AdapterMessageIncorrectDataTransmitted" xml:space="preserve">
<value>Incorrect data provided: {0}</value>
</data>
<data name="AdapterMessageIncorrectDates" xml:space="preserve">
<value>Incorrect dates: {0}</value>
</data>
<data name="AdapterMessageErrorWhileWorkingWithStorage" xml:space="preserve">
<value>Data storage error: {0}</value>
</data>
<data name="AdapterMessageNotFoundElementByData" xml:space="preserve">
<value>Element not found by data {0}</value>
</data>
<data name="AdapterMessageNotFoundElementById" xml:space="preserve">
<value>Element not found by identifier {0}</value>
</data>
<data name="AdapterMessageElementWasDeleted" xml:space="preserve">
<value>Element with identifier {0} was deleted</value>
</data>
<data name="AdapterMessageElementWasDeletedByData" xml:space="preserve">
<value>Element with data {0} was deleted</value>
</data>
<data name="AdapterMessageElementNotFound" xml:space="preserve">
<value>Element not found: {0}</value>
</data>
<data name="ReportServicesHeader" xml:space="preserve">
<value>Services and Price History Report</value>
</data>
<data name="ReportServicesPeriod" xml:space="preserve">
<value>Period: from {0} to {1}</value>
</data>
<data name="ReportServicesGenerated" xml:space="preserve">
<value>Report generated: {0}</value>
</data>
<data name="ReportServicesNoData" xml:space="preserve">
<value>No services found for the specified period.</value>
</data>
<data name="ReportServicesTableService" xml:space="preserve">
<value>Service</value>
</data>
<data name="ReportServicesTableType" xml:space="preserve">
<value>Type</value>
</data>
<data name="ReportServicesTableCurrentPrice" xml:space="preserve">
<value>Current Price</value>
</data>
<data name="ReportServicesTableChangeDate" xml:space="preserve">
<value>Change Date</value>
</data>
<data name="ReportServicesTableOldPrice" xml:space="preserve">
<value>Old Price</value>
</data>
<data name="ReportServicesNoChanges" xml:space="preserve">
<value>—</value>
</data>
<data name="ReportOrdersHeader" xml:space="preserve">
<value>Orders for Period</value>
</data>
<data name="ReportOrdersPeriod" xml:space="preserve">
<value>from {0} to {1}</value>
</data>
<data name="ReportOrdersTableOrderDate" xml:space="preserve">
<value>Order Date</value>
</data>
<data name="ReportOrdersTableStatus" xml:space="preserve">
<value>Status</value>
</data>
<data name="ReportOrdersTableRoomType" xml:space="preserve">
<value>Room Type</value>
</data>
<data name="ReportOrdersTableMaster" xml:space="preserve">
<value>Master</value>
</data>
<data name="ReportOrdersTableService" xml:space="preserve">
<value>Service</value>
</data>
<data name="ReportOrdersTableWorkTime" xml:space="preserve">
<value>Work Time</value>
</data>
<data name="ReportOrdersTableAmount" xml:space="preserve">
<value>Amount</value>
</data>
<data name="ReportOrdersNotAssigned" xml:space="preserve">
<value>Not Assigned</value>
</data>
<data name="ReportOrdersNoServices" xml:space="preserve">
<value>No Services</value>
</data>
<data name="ReportOrdersHours" xml:space="preserve">
<value>hrs</value>
</data>
<data name="ReportSalaryHeader" xml:space="preserve">
<value>Salary Statement</value>
</data>
<data name="ReportSalaryPeriod" xml:space="preserve">
<value>for period from {0} to {1}</value>
</data>
<data name="ReportSalaryAccruals" xml:space="preserve">
<value>Accruals</value>
</data>
<data name="ReportSalaryTableMaster" xml:space="preserve">
<value>Master</value>
</data>
<data name="ReportSalaryTableAmount" xml:space="preserve">
<value>Amount</value>
</data>
<data name="ReportSalaryTableDate" xml:space="preserve">
<value>Date</value>
</data>
<data name="ReportSalaryUnknownMaster" xml:space="preserve">
<value>Unknown Master</value>
</data>
</root>

View File

@@ -1,364 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ValidationExceptionMessageIncorrectFIO" xml:space="preserve">
<value>La valeur dans le champ Nom complet n'est pas un nom complet</value>
</data>
<data name="ValidationExceptionMessageEmptyField" xml:space="preserve">
<value>La valeur du champ {0} est vide</value>
</data>
<data name="ValidationExceptionMessageMinorCannotBeHired" xml:space="preserve">
<value>Les mineurs ne peuvent pas être embauchés (Date de naissance = {0})</value>
</data>
<data name="ValidationExceptionMessageEmploymentDateBeforeBirthDate" xml:space="preserve">
<value>La date d'embauche ne peut pas être antérieure à la date de naissance</value>
</data>
<data name="ValidationExceptionMessageMinorAgeAtEmployment" xml:space="preserve">
<value>Les mineurs ne peuvent pas être embauchés (Date d'embauche - {0}, Date de naissance - {1})</value>
</data>
<data name="ValidationExceptionMessageIncorrectField" xml:space="preserve">
<value>La valeur dans le champ {0} n'est pas un identifiant unique</value>
</data>
<data name="ValidationExceptionMessageFieldLessOrEqualZero" xml:space="preserve">
<value>La valeur du champ {0} est inférieure ou égale à zéro</value>
</data>
<data name="ValidationExceptionMessageFieldNotInitialized" xml:space="preserve">
<value>Le champ {0} n'est pas initialisé</value>
</data>
<data name="ValidationExceptionMessageFieldIsZero" xml:space="preserve">
<value>La valeur du champ {0} est zéro</value>
</data>
<data name="ValidationExceptionMessageFieldIsDefault" xml:space="preserve">
<value>Le champ {0} a une valeur par défaut</value>
</data>
<data name="ValidationExceptionMessageFieldIsNone" xml:space="preserve">
<value>Le champ {0} a la valeur None</value>
</data>
<data name="ElementDeletedExceptionMessage" xml:space="preserve">
<value>Impossible de modifier un élément supprimé (id: {0})</value>
</data>
<data name="ElementExistsExceptionMessage" xml:space="preserve">
<value>Un élément avec la valeur {0} du paramètre {1} existe déjà</value>
</data>
<data name="ElementNotFoundExceptionMessage" xml:space="preserve">
<value>Élément non trouvé avec la valeur = {0}</value>
</data>
<data name="IncorrectDatesExceptionMessage" xml:space="preserve">
<value>La date de fin doit être postérieure à la date de début. Date de début: {0}. Date de fin: {1}</value>
</data>
<data name="StorageExceptionMessage" xml:space="preserve">
<value>Erreur lors du travail avec le stockage: {0}</value>
</data>
<data name="DocumentDocCaptionDate" xml:space="preserve">
<value>Date</value>
</data>
<data name="DocumentExcelCaptionOrder" xml:space="preserve">
<value>Commande</value>
</data>
<data name="DocumentExcelCaptionSum" xml:space="preserve">
<value>Somme</value>
</data>
<data name="DocumentExcelCaptionService" xml:space="preserve">
<value>Service</value>
</data>
<data name="DocumentExcelCaptionCount" xml:space="preserve">
<value>Quantité</value>
</data>
<data name="DocumentDocHeader" xml:space="preserve">
<value>Rapport sur les maîtres</value>
</data>
<data name="DocumentDocPeriodFromTo" xml:space="preserve">
<value>Période: du {0} au {1}</value>
</data>
<data name="DocumentDocGeneratedOn" xml:space="preserve">
<value>Rapport généré: {0}</value>
</data>
<data name="DocumentDocNoMastersFound" xml:space="preserve">
<value>Aucun maître trouvé pour la période spécifiée.</value>
</data>
<data name="DocumentDocMasterFIO" xml:space="preserve">
<value>Nom complet du maître</value>
</data>
<data name="DocumentDocEmploymentDate" xml:space="preserve">
<value>Date d'embauche</value>
</data>
<data name="DocumentDocStatus" xml:space="preserve">
<value>Statut</value>
</data>
<data name="DocumentDocOrdersCount" xml:space="preserve">
<value>Nombre de commandes</value>
</data>
<data name="DocumentDocStatusFired" xml:space="preserve">
<value>Licencié</value>
</data>
<data name="DocumentDocStatusWorking" xml:space="preserve">
<value>En activité</value>
</data>
<data name="DocumentExcelOrderDate" xml:space="preserve">
<value>Date de commande</value>
</data>
<data name="DocumentExcelRoomType" xml:space="preserve">
<value>Type de pièce</value>
</data>
<data name="DocumentExcelOrderId" xml:space="preserve">
<value>ID de commande</value>
</data>
<data name="DocumentExcelOrdersByPeriod" xml:space="preserve">
<value>Commandes par période</value>
</data>
<data name="DocumentExcelPeriodFromToShort" xml:space="preserve">
<value>du {0} au {1}</value>
</data>
<data name="DocumentPdfSalaryStatement" xml:space="preserve">
<value>Bulletin de salaire</value>
</data>
<data name="DocumentPdfSalaryPeriodFromTo" xml:space="preserve">
<value>pour la période du {0} au {1}</value>
</data>
<data name="DocumentPdfAccruals" xml:space="preserve">
<value>Accruals</value>
</data>
<data name="DocumentPdfUnknownMaster" xml:space="preserve">
<value>Maître inconnu</value>
</data>
<data name="AdapterMessageListNotInitialized" xml:space="preserve">
<value>Liste non initialisée</value>
</data>
<data name="AdapterMessageDataIsEmpty" xml:space="preserve">
<value>Les données sont vides</value>
</data>
<data name="AdapterMessageIdIsEmpty" xml:space="preserve">
<value>L'identifiant est vide</value>
</data>
<data name="AdapterMessageIncorrectDataTransmitted" xml:space="preserve">
<value>Données incorrectes transmises: {0}</value>
</data>
<data name="AdapterMessageIncorrectDates" xml:space="preserve">
<value>Dates incorrectes: {0}</value>
</data>
<data name="AdapterMessageErrorWhileWorkingWithStorage" xml:space="preserve">
<value>Erreur lors du travail avec le stockage de données: {0}</value>
</data>
<data name="AdapterMessageNotFoundElementByData" xml:space="preserve">
<value>Élément non trouvé par les données {0}</value>
</data>
<data name="AdapterMessageNotFoundElementById" xml:space="preserve">
<value>Élément non trouvé par l'identifiant {0}</value>
</data>
<data name="AdapterMessageElementWasDeleted" xml:space="preserve">
<value>L'élément avec l'identifiant {0} a été supprimé</value>
</data>
<data name="AdapterMessageElementWasDeletedByData" xml:space="preserve">
<value>L'élément avec les données {0} a été supprimé</value>
</data>
<data name="AdapterMessageElementNotFound" xml:space="preserve">
<value>Élément non trouvé: {0}</value>
</data>
<!-- Rapports -->
<data name="ReportServicesHeader" xml:space="preserve">
<value>Rapport sur les services et leur historique des modifications</value>
</data>
<data name="ReportServicesPeriod" xml:space="preserve">
<value>Période: du {0} au {1}</value>
</data>
<data name="ReportServicesGenerated" xml:space="preserve">
<value>Rapport généré: {0}</value>
</data>
<data name="ReportServicesNoData" xml:space="preserve">
<value>Aucun service trouvé pour la période spécifiée.</value>
</data>
<data name="ReportServicesTableService" xml:space="preserve">
<value>Service</value>
</data>
<data name="ReportServicesTableType" xml:space="preserve">
<value>Type</value>
</data>
<data name="ReportServicesTableCurrentPrice" xml:space="preserve">
<value>Prix actuel</value>
</data>
<data name="ReportServicesTableChangeDate" xml:space="preserve">
<value>Date de modification</value>
</data>
<data name="ReportServicesTableOldPrice" xml:space="preserve">
<value>Ancien prix</value>
</data>
<data name="ReportServicesNoChanges" xml:space="preserve">
<value>—</value>
</data>
<data name="ReportOrdersHeader" xml:space="preserve">
<value>Commandes par période</value>
</data>
<data name="ReportOrdersPeriod" xml:space="preserve">
<value>du {0} au {1}</value>
</data>
<data name="ReportOrdersTableOrderDate" xml:space="preserve">
<value>Date de commande</value>
</data>
<data name="ReportOrdersTableStatus" xml:space="preserve">
<value>Statut</value>
</data>
<data name="ReportOrdersTableRoomType" xml:space="preserve">
<value>Type de pièce</value>
</data>
<data name="ReportOrdersTableMaster" xml:space="preserve">
<value>Maître</value>
</data>
<data name="ReportOrdersTableService" xml:space="preserve">
<value>Service</value>
</data>
<data name="ReportOrdersTableWorkTime" xml:space="preserve">
<value>Temps de travail</value>
</data>
<data name="ReportOrdersTableAmount" xml:space="preserve">
<value>Montant</value>
</data>
<data name="ReportOrdersNotAssigned" xml:space="preserve">
<value>Non assigné</value>
</data>
<data name="ReportOrdersNoServices" xml:space="preserve">
<value>Aucun service</value>
</data>
<data name="ReportOrdersHours" xml:space="preserve">
<value>h</value>
</data>
<data name="ReportSalaryHeader" xml:space="preserve">
<value>Bulletin de salaire</value>
</data>
<data name="ReportSalaryPeriod" xml:space="preserve">
<value>pour la période du {0} au {1}</value>
</data>
<data name="ReportSalaryAccruals" xml:space="preserve">
<value>Accruals</value>
</data>
<data name="ReportSalaryTableMaster" xml:space="preserve">
<value>Maître</value>
</data>
<data name="ReportSalaryTableAmount" xml:space="preserve">
<value>Montant</value>
</data>
<data name="ReportSalaryTableDate" xml:space="preserve">
<value>Date</value>
</data>
<data name="ReportSalaryUnknownMaster" xml:space="preserve">
<value>Maître inconnu</value>
</data>
</root>

View File

@@ -1,361 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ValidationExceptionMessageIncorrectFIO" xml:space="preserve">
<value>Значение в поле ФИО не является ФИО</value>
</data>
<data name="ValidationExceptionMessageEmptyField" xml:space="preserve">
<value>Значение поле {0} пусто</value>
</data>
<data name="ValidationExceptionMessageMinorCannotBeHired" xml:space="preserve">
<value>Несовершеннолетние не могут быть приняты на работу (Дата рождения = {0})</value>
</data>
<data name="ValidationExceptionMessageEmploymentDateBeforeBirthDate" xml:space="preserve">
<value>Дата трудоустройства не может быть раньше даты рождения</value>
</data>
<data name="ValidationExceptionMessageMinorAgeAtEmployment" xml:space="preserve">
<value>Несовершеннолетние не могут быть приняты на работу (Дата трудоустройства - {0}, Дата рождения - {1})</value>
</data>
<data name="ValidationExceptionMessageIncorrectField" xml:space="preserve">
<value>Значение в поле {0} не является уникальным идентификатором</value>
</data>
<data name="ValidationExceptionMessageFieldLessOrEqualZero" xml:space="preserve">
<value>Значение поля {0} меньше или равно нулю</value>
</data>
<data name="ValidationExceptionMessageFieldNotInitialized" xml:space="preserve">
<value>Поле {0} не инициализировано</value>
</data>
<data name="ValidationExceptionMessageFieldIsZero" xml:space="preserve">
<value>Значение поля {0} равно нулю</value>
</data>
<data name="ValidationExceptionMessageFieldIsDefault" xml:space="preserve">
<value>Поле {0} имеет значение по умолчанию</value>
</data>
<data name="ValidationExceptionMessageFieldIsNone" xml:space="preserve">
<value>Поле {0} имеет значение None</value>
</data>
<data name="ElementDeletedExceptionMessage" xml:space="preserve">
<value>Нельзя изменить удаленный элемент (id: {0})</value>
</data>
<data name="ElementExistsExceptionMessage" xml:space="preserve">
<value>Элемент со значением {0} параметра {1} уже существует</value>
</data>
<data name="ElementNotFoundExceptionMessage" xml:space="preserve">
<value>Элемент не найден со значением = {0}</value>
</data>
<data name="IncorrectDatesExceptionMessage" xml:space="preserve">
<value>Дата окончания должна быть позже даты начала. Дата начала: {0}. Дата окончания: {1}</value>
</data>
<data name="StorageExceptionMessage" xml:space="preserve">
<value>Ошибка при работе с хранилищем: {0}</value>
</data>
<data name="DocumentDocCaptionDate" xml:space="preserve">
<value>Дата</value>
</data>
<data name="DocumentExcelCaptionOrder" xml:space="preserve">
<value>Заказ</value>
</data>
<data name="DocumentExcelCaptionSum" xml:space="preserve">
<value>Сумма</value>
</data>
<data name="DocumentExcelCaptionService" xml:space="preserve">
<value>Услуга</value>
</data>
<data name="DocumentExcelCaptionCount" xml:space="preserve">
<value>Количество</value>
</data>
<data name="DocumentDocHeader" xml:space="preserve">
<value>Отчет по мастерам</value>
</data>
<data name="DocumentDocPeriodFromTo" xml:space="preserve">
<value>Период: с {0} по {1}</value>
</data>
<data name="DocumentDocGeneratedOn" xml:space="preserve">
<value>Отчёт сформирован: {0}</value>
</data>
<data name="DocumentDocNoMastersFound" xml:space="preserve">
<value>За указанный период мастера не найдены.</value>
</data>
<data name="DocumentDocMasterFIO" xml:space="preserve">
<value>ФИО мастера</value>
</data>
<data name="DocumentDocEmploymentDate" xml:space="preserve">
<value>Дата трудоустройства</value>
</data>
<data name="DocumentDocStatus" xml:space="preserve">
<value>Статус</value>
</data>
<data name="DocumentDocOrdersCount" xml:space="preserve">
<value>Количество заказов</value>
</data>
<data name="DocumentDocStatusFired" xml:space="preserve">
<value>Уволен</value>
</data>
<data name="DocumentDocStatusWorking" xml:space="preserve">
<value>Работает</value>
</data>
<data name="DocumentExcelOrderDate" xml:space="preserve">
<value>Дата заказа</value>
</data>
<data name="DocumentExcelRoomType" xml:space="preserve">
<value>Тип помещения</value>
</data>
<data name="DocumentExcelOrderId" xml:space="preserve">
<value>ID заказа</value>
</data>
<data name="DocumentExcelOrdersByPeriod" xml:space="preserve">
<value>Заказы за период</value>
</data>
<data name="DocumentExcelPeriodFromToShort" xml:space="preserve">
<value>с {0} по {1}</value>
</data>
<data name="DocumentPdfSalaryStatement" xml:space="preserve">
<value>Зарплатная ведомость</value>
</data>
<data name="DocumentPdfSalaryPeriodFromTo" xml:space="preserve">
<value>за период с {0} по {1}</value>
</data>
<data name="DocumentPdfAccruals" xml:space="preserve">
<value>Начисления</value>
</data>
<data name="DocumentPdfUnknownMaster" xml:space="preserve">
<value>Неизвестный мастер</value>
</data>
<data name="AdapterMessageListNotInitialized" xml:space="preserve">
<value>Список не инициализирован</value>
</data>
<data name="AdapterMessageDataIsEmpty" xml:space="preserve">
<value>Данные пусты</value>
</data>
<data name="AdapterMessageIdIsEmpty" xml:space="preserve">
<value>Идентификатор пуст</value>
</data>
<data name="AdapterMessageIncorrectDataTransmitted" xml:space="preserve">
<value>Переданы некорректные данные: {0}</value>
</data>
<data name="AdapterMessageIncorrectDates" xml:space="preserve">
<value>Некорректные даты: {0}</value>
</data>
<data name="AdapterMessageErrorWhileWorkingWithStorage" xml:space="preserve">
<value>Ошибка при работе с хранилищем данных: {0}</value>
</data>
<data name="AdapterMessageNotFoundElementByData" xml:space="preserve">
<value>Элемент не найден по данным {0}</value>
</data>
<data name="AdapterMessageNotFoundElementById" xml:space="preserve">
<value>Элемент не найден по идентификатору {0}</value>
</data>
<data name="AdapterMessageElementWasDeleted" xml:space="preserve">
<value>Элемент с идентификатором {0} был удален</value>
</data>
<data name="AdapterMessageElementWasDeletedByData" xml:space="preserve">
<value>Элемент с данными {0} был удален</value>
</data>
<data name="AdapterMessageElementNotFound" xml:space="preserve">
<value>Элемент не найден: {0}</value>
</data>
<!-- Отчеты -->
<data name="ReportServicesHeader" xml:space="preserve">
<value>Отчет по услугам и их истории изменений</value>
</data>
<data name="ReportServicesPeriod" xml:space="preserve">
<value>Период: с {0} по {1}</value>
</data>
<data name="ReportServicesGenerated" xml:space="preserve">
<value>Отчёт сформирован: {0}</value>
</data>
<data name="ReportServicesNoData" xml:space="preserve">
<value>За указанный период услуги не найдены.</value>
</data>
<data name="ReportServicesTableService" xml:space="preserve">
<value>Услуга</value>
</data>
<data name="ReportServicesTableType" xml:space="preserve">
<value>Тип</value>
</data>
<data name="ReportServicesTableCurrentPrice" xml:space="preserve">
<value>Текущая цена</value>
</data>
<data name="ReportServicesTableChangeDate" xml:space="preserve">
<value>Дата изменения</value>
</data>
<data name="ReportServicesTableOldPrice" xml:space="preserve">
<value>Старая цена</value>
</data>
<data name="ReportServicesNoChanges" xml:space="preserve">
<value>—</value>
</data>
<data name="ReportOrdersHeader" xml:space="preserve">
<value>Заказы за период</value>
</data>
<data name="ReportOrdersPeriod" xml:space="preserve">
<value>с {0} по {1}</value>
</data>
<data name="ReportOrdersTableOrderDate" xml:space="preserve">
<value>Дата заказа</value>
</data>
<data name="ReportOrdersTableStatus" xml:space="preserve">
<value>Статус</value>
</data>
<data name="ReportOrdersTableRoomType" xml:space="preserve">
<value>Тип помещения</value>
</data>
<data name="ReportOrdersTableMaster" xml:space="preserve">
<value>Мастер</value>
</data>
<data name="ReportOrdersTableService" xml:space="preserve">
<value>Услуга</value>
</data>
<data name="ReportOrdersTableWorkTime" xml:space="preserve">
<value>Время работы</value>
</data>
<data name="ReportOrdersTableAmount" xml:space="preserve">
<value>Сумма</value>
</data>
<data name="ReportOrdersNotAssigned" xml:space="preserve">
<value>Не назначен</value>
</data>
<data name="ReportOrdersNoServices" xml:space="preserve">
<value>Нет услуг</value>
</data>
<data name="ReportOrdersHours" xml:space="preserve">
<value>ч.</value>
</data>
<data name="ReportSalaryHeader" xml:space="preserve">
<value>Зарплатная ведомость</value>
</data>
<data name="ReportSalaryPeriod" xml:space="preserve">
<value>за период с {0} по {1}</value>
</data>
<data name="ReportSalaryAccruals" xml:space="preserve">
<value>Начисления</value>
</data>
<data name="ReportSalaryTableMaster" xml:space="preserve">
<value>Мастер</value>
</data>
<data name="ReportSalaryTableAmount" xml:space="preserve">
<value>Сумма</value>
</data>
<data name="ReportSalaryTableDate" xml:space="preserve">
<value>Дата</value>
</data>
<data name="ReportSalaryUnknownMaster" xml:space="preserve">
<value>Неизвестный мастер</value>
</data>
</root>

View File

@@ -7,7 +7,7 @@ using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.StorageContracts;
internal interface IMasterStorageContract
public interface IMasterStorageContract
{
List<MasterDataModel> GetList(bool onlyActive = true, string? postId =
null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime?

View File

@@ -8,12 +8,10 @@ using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.StorageContracts;
internal interface IOrderStorageContract
public interface IOrderStorageContract
{
List<OrderDataModel> GetList();
Task<List<OrderDataModel>> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct);
OrderDataModel? GetElementById(string id);
OrderDataModel? GetElementByDate(DateTime date);
@@ -25,6 +23,4 @@ internal interface IOrderStorageContract
void UpdElement(OrderDataModel orderDataModel);
void DelElement(string id);
Task<List<(string MasterFIO, string ServiceName, int TimeOfWorking, decimal TotalAmount)>> GetOrderDetailsAsync(string orderId, CancellationToken ct);
}

View File

@@ -7,7 +7,7 @@ using TwoFromTheCasketContratcs.DataModels;
namespace TwoFromTheCasketContratcs.StorageContracts;
internal interface IPostStorageContract
public interface IPostStorageContract
{
List<PostDataModel> GetList();

View File

@@ -8,18 +8,18 @@ using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.StorageContracts;
internal interface ISalaryStorageContract
public interface ISalaryStorageContract
{
List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string?
masterId = null);
Task<List<SalaryDataModel>> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct);
workerId = null);
SalaryDataModel? GetElementByMasterId(string masterId);
SalaryDataModel? GetElementBySalaryDate(DateTime salaryDate);
void AddElement(SalaryDataModel salaryDataModel);
void SaveChanges();
void UpdElement(SalaryDataModel salaryDataModel);
void DelElement(string id);
}

View File

@@ -8,12 +8,10 @@ using TwoFromTheCasketContratcs.Enums;
namespace TwoFromTheCasketContratcs.StorageContracts;
internal interface IServiceStorageContract
public interface IServiceStorageContract
{
List<ServiceDataModel> GetList();
List<ServiceDataModel> GetList(bool onlyActive);
Task<List<ServiceDataModel>> GetListAsync();
Task<List<ServiceDataModel>> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct);
List<ServiceHistoryDataModel> GetHistoryByServiceId(string serviceId);
ServiceDataModel? GetElementById(string id);

View File

@@ -6,31 +6,4 @@
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Mvc.Abstractions" Version="2.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.3.0" />
<PackageReference Include="Microsoft.Extensions.Localization.Abstractions" Version="9.0.9" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="TwoFromTheCasketTest" />
<InternalsVisibleTo Include="TwoFromTheCasketWebApi" />
<InternalsVisibleTo Include="TwoFromTheCasketBuisnessLogic" />
<InternalsVisibleTo Include="TwoFromTheCasketDatabase" />
<InternalsVisibleTo Include="DynamicProxyGenAssembly2" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources\Messages.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Messages.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources\Messages.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Messages.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

@@ -1,19 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class MasterSalaryByPeriodViewModel
{
public required string MasterFIO { get; set; }
public double TotalSalary { get; set; }
public DateTime FromPeriod { get; set; }
public DateTime ToPeriod { get; set; }
}

View File

@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class MasterViewModel
{
public required string Id { get; set; }
public required string FIO { get; set; }
public required string PostId { get; set; }
public required DateTime BirthDate { get; set; }
public required DateTime EmploymentDate { get; set; }
public required bool IsDeleted { get; set; }
}

View File

@@ -1,15 +0,0 @@
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class OrderViewModel
{
[AlternativeName("Id")]
public string? Id { get; set; }
public DateTime Date { get; set; }
public StatusType Status { get; set; }
public RoomType RoomType { get; set; }
}

View File

@@ -1,22 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class PostViewModel
{
[AlternativeName("PostId")]
public required string Id { get; set; }
public required string PostName { get; set; }
public required string PostType { get; set; }
[AlternativeName("ConfigurationJson")]
[AlternativeName("Configuration")]
public required string Configuration { get; set; }
}

View File

@@ -1,16 +0,0 @@
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class SalaryViewModel
{
public required string Id { get; set; }
public required string MasterId { get; set; }
public required DateTime SalaryDate { get; set; }
[AlternativeName("Salary")]
public required double SalarySize { get; set; }
public required double Prize { get; set; }
}

View File

@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class ServiceHistoryViewModel
{
public string ServiceId { get; set; } = string.Empty;
public double OldPrice { get; set; }
public DateTime ChangeDate { get; set; }
}

View File

@@ -1,14 +0,0 @@
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class ServiceOderViewModel
{
public required string OrderId { get; set; }
public required string ServiceId { get; set; }
public required string MasterId { get; set; }
public required int TimeOfWorking { get; set; }
}

View File

@@ -1,20 +0,0 @@
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class ServiceViewModel
{
public required string Id { get; set; }
public required string ServiceName { get; set; }
public required ServiceType ServiceType { get; set; }
[AlternativeName("MasterID")]
public required string MasterId { get; set; }
public required double Price { get; set; }
public required bool IsDeleted { get; set; }
}

View File

@@ -1,17 +0,0 @@
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Mapper;
namespace TwoFromTheCasketContratcs.ViewModels;
public class ServiceWithHistoryViewModel
{
public string Id { get; set; } = string.Empty;
public string ServiceName { get; set; } = string.Empty;
public ServiceType ServiceType { get; set; }
public double Price { get; set; }
[AlternativeName("MasterID")]
public string MasterId { get; set; } = string.Empty;
public DateTime CreatedAt { get; set; }
public bool IsDeleted { get; set; }
public List<ServiceHistoryViewModel> History { get; set; } = new();
}

View File

@@ -1,13 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TwoFromTheCasketContratcs.Infrastructure;
namespace TwoFromTheCasketDatabase;
public class DefaultConfigurationDatabase : IConfigurationDatabase
{
public string ConnectionString => "";
}

View File

@@ -1,157 +0,0 @@

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Mapper;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class MasterStorageContract(TwoFromTheCasketDbContext dbContext, IStringLocalizer<Messages> localizer) : IMasterStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext = dbContext;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<MasterDataModel> GetList(bool onlyActive = true, string? postId = null, DateTime? fromBirthDate = null, DateTime? toBirthDate = null, DateTime? fromEmploymentDate = null, DateTime? toEmploymentDate = null)
{
try
{
var query = _dbContext.Masters.AsQueryable();
if (onlyActive) query = query.Where(x => !x.IsDeleted);
if (postId is not null) query = query.Where(x => x.PostId == postId);
if (fromBirthDate is not null && toBirthDate is not null)
query = query.Where(x => x.BirthDate >= fromBirthDate && x.BirthDate <= toBirthDate);
if (fromEmploymentDate is not null && toEmploymentDate is not null)
query = query.Where(x => x.EmploymentDate >= fromEmploymentDate
&& x.EmploymentDate <= toEmploymentDate);
return [.. query.Select(x => CustomMapper.MapObject<MasterDataModel>(x))];
}
catch(Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public MasterDataModel? GetElementById(string id)
{
try
{
return CustomMapper.MapObjectWithNull<MasterDataModel>(GetMasterById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public MasterDataModel? GetElementByFIO(string name)
{
try
{
return CustomMapper.MapObjectWithNull<MasterDataModel>(_dbContext.Masters.FirstOrDefault(x => x.FIO == name));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public MasterDataModel? GetElementByPostId(string postId)
{
try
{
return CustomMapper.MapObjectWithNull<MasterDataModel>(_dbContext.Masters.FirstOrDefault(x => x.PostId == postId));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void AddElement(MasterDataModel masterDataModel)
{
try
{
_dbContext.Masters.Add(CustomMapper.MapObject<Master>(masterDataModel));
_dbContext.SaveChanges();
}
catch(InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", masterDataModel.Id, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName : "IX_Master_FIO" } )
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("FIO", masterDataModel.FIO, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void UpdElement(MasterDataModel masterDataModel)
{
try
{
var element = GetMasterById(masterDataModel.Id) ?? throw new ElementNotFoundException(masterDataModel.Id, _localizer);
_dbContext.Masters.Update(CustomMapper.MapObject(masterDataModel,element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Master_FIO" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("FIO", masterDataModel.FIO, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void DelElement(string id)
{
try
{
var element = GetMasterById(id) ?? throw new ElementNotFoundException(id, _localizer);
element.IsDeleted = true;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
private Master? GetMasterById(string id) => _dbContext.Masters.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
}

View File

@@ -1,171 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Enums;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Mapper;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class OrderStorageContract(TwoFromTheCasketDbContext dbContext, IStringLocalizer<Messages> localizer) : IOrderStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext = dbContext;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<OrderDataModel> GetList()
{
try
{
return [.. _dbContext.Orders.Select(x => CustomMapper.MapObject<OrderDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public OrderDataModel? GetElementById(string id)
{
try
{
return CustomMapper.MapObjectWithNull<OrderDataModel>(GetOrderById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public OrderDataModel? GetElementByDate(DateTime date)
{
try
{
return CustomMapper.MapObjectWithNull<OrderDataModel>(_dbContext.Orders.FirstOrDefault(x => x.Date == date));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public OrderDataModel? GetElementByStatus(StatusType status)
{
try
{
return CustomMapper.MapObjectWithNull<OrderDataModel>(_dbContext.Orders.FirstOrDefault(x => x.Status == status));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void AddElement(OrderDataModel orderDataModel)
{
try
{
_dbContext.Orders.Add(CustomMapper.MapObject<Order>(orderDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", orderDataModel.Id, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void UpdElement(OrderDataModel orderDataModel)
{
try
{
var element = GetOrderById(orderDataModel.Id) ?? throw new ElementNotFoundException(orderDataModel.Id, _localizer);
_dbContext.Orders.Update(CustomMapper.MapObject(orderDataModel, element));
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void DelElement(string id)
{
try
{
var element = GetOrderById(id) ?? throw new ElementNotFoundException(id, _localizer);
_dbContext.Orders.Remove(element);
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
private Order? GetOrderById(string id) => _dbContext.Orders.FirstOrDefault(x => x.Id == id);
public async Task<List<(string MasterFIO, string ServiceName, int TimeOfWorking, decimal TotalAmount)>> GetOrderDetailsAsync(string orderId, CancellationToken ct)
{
try
{
var orderDetails = await _dbContext.ServiceOrders
.Where(so => so.OrderId == orderId)
.Join(_dbContext.Masters, so => so.MasterId, m => m.Id, (so, m) => new { so, m })
.Join(_dbContext.Services, x => x.so.ServiceId, s => s.Id, (x, s) => new
{
MasterFIO = x.m.FIO,
ServiceName = s.ServiceName,
TimeOfWorking = x.so.TimeOfWorking,
ServicePrice = s.Price
})
.ToListAsync(ct);
return orderDetails.Select(x => (
x.MasterFIO,
x.ServiceName,
x.TimeOfWorking,
(decimal)(x.ServicePrice * x.TimeOfWorking) // Explicit cast to decimal
)).ToList();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public async Task<List<OrderDataModel>> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct)
{
try
{
return [.. await _dbContext.Orders
.Where(x => x.Date >= startDate && x.Date <= endDate)
.Select(x => CustomMapper.MapObject<OrderDataModel>(x))
.ToListAsync(ct)];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
}

View File

@@ -1,216 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Mapper;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class PostStorageContract(TwoFromTheCasketDbContext dbContext, IStringLocalizer<Messages> localizer) : IPostStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext = dbContext;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<PostDataModel> GetList()
{
try
{
return [.. _dbContext.Posts.Select(x => CustomMapper.MapObject<PostDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public List<PostDataModel> GetPostWithHistory(string postId)
{
try
{
return [.. _dbContext.Posts.Where(x => x.PostId == postId).Select(x => CustomMapper.MapObject<PostDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public PostDataModel? GetElementById(string id)
{
try
{
return CustomMapper.MapObjectWithNull<PostDataModel>(GetPostById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public PostDataModel? GetElementByName(string name)
{
try
{
return CustomMapper.MapObjectWithNull<PostDataModel>(_dbContext.Posts.FirstOrDefault(x => x.PostName == name && x.IsActual));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void AddElement(PostDataModel postDataModel)
{
try
{
// Проверяем дубликаты перед добавлением
var existingByName = _dbContext.Posts.FirstOrDefault(x => x.PostName == postDataModel.PostName && x.IsActual);
if (existingByName != null)
{
throw new ElementExistsException("PostName", postDataModel.PostName, _localizer);
}
var existingById = _dbContext.Posts.FirstOrDefault(x => x.PostId == postDataModel.Id && x.IsActual);
if (existingById != null)
{
throw new ElementExistsException("PostId", postDataModel.Id, _localizer);
}
_dbContext.Posts.Add(CustomMapper.MapObject<Post>(postDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostId", postDataModel.Id, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostName", postDataModel.PostName, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostId_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostId", postDataModel.Id, _localizer);
}
catch (Exception ex) when (!(ex is ElementExistsException))
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void UpdElement(PostDataModel postDataModel)
{
try
{
var transaction = _dbContext.Database.BeginTransaction();
try
{
var element = GetPostByIdWithoutActualFilter(postDataModel.Id) ?? throw new ElementNotFoundException(postDataModel.Id, _localizer);
if (!element.IsActual) throw new ElementDeletedException(postDataModel.Id, _localizer);
// Проверяем дубликаты перед обновлением
var existingByName = _dbContext.Posts.FirstOrDefault(x => x.PostName == postDataModel.PostName && x.IsActual && x.PostId != postDataModel.Id);
if (existingByName != null)
{
throw new ElementExistsException("PostName", postDataModel.PostName, _localizer);
}
var existingById = _dbContext.Posts.FirstOrDefault(x => x.PostId == postDataModel.Id && x.IsActual && x.PostId != postDataModel.Id);
if (existingById != null)
{
throw new ElementExistsException("PostId", postDataModel.Id, _localizer);
}
element.IsActual = false;
_dbContext.SaveChanges();
var newElement = CustomMapper.MapObject<Post>(postDataModel);
_dbContext.Posts.Add(newElement);
_dbContext.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Posts_PostName_IsActual" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("PostName", postDataModel.PostName, _localizer);
}
catch (Exception ex) when (ex is ElementDeletedException || ex is ElementNotFoundException || ex is ElementExistsException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void DelElement(string id)
{
try
{
var element = GetPostByIdWithoutActualFilter(id) ?? throw new ElementNotFoundException(id, _localizer);
if (!element.IsActual) throw new ElementDeletedException(id, _localizer);
element.IsActual = false;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (ElementDeletedException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void ResElement(string id)
{
try
{
var element = GetPostByIdWithoutActualFilter(id) ?? throw new ElementNotFoundException(id, _localizer);
element.IsActual = true;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
private Post? GetPostById(string id) => _dbContext.Posts.Where(x => x.PostId == id && x.IsActual)
.OrderByDescending(x => x.ChangeDate).FirstOrDefault();
private Post? GetPostByIdWithoutActualFilter(string id) => _dbContext.Posts.Where(x => x.PostId == id)
.OrderByDescending(x => x.ChangeDate).FirstOrDefault();
}

View File

@@ -1,99 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Mapper;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class SalaryStorageContract(TwoFromTheCasketDbContext dbContext, IStringLocalizer<Messages> localizer) : ISalaryStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext = dbContext;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<SalaryDataModel> GetList(DateTime startDate, DateTime endDate, string? masterId = null)
{
try
{
var query = _dbContext.Salaries.Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate);
if (masterId is not null) query = query.Where(x => x.MasterId == masterId);
return [.. query.Select(x => CustomMapper.MapObject<SalaryDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public SalaryDataModel? GetElementByMasterId(string masterId)
{
try
{
return CustomMapper.MapObjectWithNull<SalaryDataModel>(_dbContext.Salaries.FirstOrDefault(x => x.MasterId == masterId));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public SalaryDataModel? GetElementBySalaryDate(DateTime salaryDate)
{
try
{
return CustomMapper.MapObjectWithNull<SalaryDataModel>(_dbContext.Salaries.FirstOrDefault(x => x.SalaryDate == salaryDate));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void AddElement(SalaryDataModel salaryDataModel)
{
try
{
_dbContext.Salaries.Add(CustomMapper.MapObject<Salary>(salaryDataModel));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void SaveChanges()
{
try
{
_dbContext.SaveChanges();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public async Task<List<SalaryDataModel>> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct)
{
try
{
var salaries = await _dbContext.Salaries
.Where(x => x.SalaryDate >= startDate && x.SalaryDate <= endDate)
.ToListAsync(ct);
return salaries.Select(x => CustomMapper.MapObject<SalaryDataModel>(x)).ToList();
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
}

View File

@@ -1,223 +0,0 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Npgsql;
using TwoFromTheCasketContratcs.DataModels;
using TwoFromTheCasketContratcs.Exceptions;
using TwoFromTheCasketContratcs.Mapper;
using TwoFromTheCasketContratcs.Resources;
using TwoFromTheCasketContratcs.StorageContracts;
using TwoFromTheCasketDatabase.Models;
namespace TwoFromTheCasketDatabase.Implementation;
internal class ServiceStorageContract(TwoFromTheCasketDbContext dbContext, IStringLocalizer<Messages> localizer) : IServiceStorageContract
{
private readonly TwoFromTheCasketDbContext _dbContext = dbContext;
private readonly IStringLocalizer<Messages> _localizer = localizer;
public List<ServiceDataModel> GetList()
{
try
{
return [.. _dbContext.Services.Where(x => !x.IsDeleted).Select(x => CustomMapper.MapObject<ServiceDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public List<ServiceDataModel> GetList(bool onlyActive)
{
try
{
if (onlyActive)
{
return [.. _dbContext.Services.Where(x => !x.IsDeleted).Select(x => CustomMapper.MapObject<ServiceDataModel>(x))];
}
else
{
return [.. _dbContext.Services.Select(x => CustomMapper.MapObject<ServiceDataModel>(x))];
}
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public ServiceDataModel? GetElementById(string id)
{
try
{
return CustomMapper.MapObjectWithNull<ServiceDataModel>(GetServiceById(id));
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public List<ServiceDataModel>? GetElementByMasterId(string masterId)
{
try
{
return [.. _dbContext.Services.Where(x => x.MasterId == masterId && !x.IsDeleted).Select(x => CustomMapper.MapObject<ServiceDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public List<ServiceDataModel>? GetElementByServiceName(string name)
{
try
{
return [.. _dbContext.Services.Where(x => x.ServiceName == name && !x.IsDeleted).Select(x => CustomMapper.MapObject<ServiceDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public List<ServiceHistoryDataModel> GetHistoryByServiceId(string serviceId)
{
try
{
return [.. _dbContext.ServiceHistories.Where(x => x.ServiceId == serviceId).OrderByDescending(x => x.ChangeDate).Select(x => CustomMapper.MapObject<ServiceHistoryDataModel>(x))];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void AddElement(ServiceDataModel serviceDataModel)
{
try
{
_dbContext.Services.Add(CustomMapper.MapObject<Service>(serviceDataModel));
_dbContext.SaveChanges();
}
catch (InvalidOperationException ex) when (ex.TargetSite?.Name == "ThrowIdentityConflict")
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("Id", serviceDataModel.Id, _localizer);
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Service_ServiceName_IsDeleted" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("ServiceName", serviceDataModel.ServiceName, _localizer);
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void UpdElement(ServiceDataModel serviceDataModel)
{
try
{
var transaction = _dbContext.Database.BeginTransaction();
try
{
var element = GetServiceById(serviceDataModel.Id) ?? throw new ElementNotFoundException(serviceDataModel.Id, _localizer);
if (element.Price != serviceDataModel.Price)
{
_dbContext.ServiceHistories.Add(new ServiceHistory() { ServiceId = element.Id, OldPrice = element.Price });
_dbContext.SaveChanges();
}
_dbContext.Services.Update(CustomMapper.MapObject(serviceDataModel, element));
_dbContext.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
catch (DbUpdateException ex) when (ex.InnerException is PostgresException { ConstraintName: "IX_Service_ServiceName_IsDeleted" })
{
_dbContext.ChangeTracker.Clear();
throw new ElementExistsException("ServiceName", serviceDataModel.ServiceName, _localizer);
}
catch (Exception ex) when (ex is ElementDeletedException || ex is ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public void DelElement(string id)
{
try
{
var element = GetServiceById(id) ?? throw new ElementNotFoundException(id, _localizer);
element.IsDeleted = true;
_dbContext.SaveChanges();
}
catch (ElementNotFoundException)
{
_dbContext.ChangeTracker.Clear();
throw;
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
private Service? GetServiceById(string id) => _dbContext.Services.FirstOrDefault(x => x.Id == id && !x.IsDeleted);
public async Task<List<ServiceDataModel>> GetListAsync()
{
try
{
return [.. await _dbContext.Services
.Include(x => x.ServiceHistory)
.Where(x => !x.IsDeleted)
.Select(x => CustomMapper.MapObject<ServiceDataModel>(x))
.ToListAsync()];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
public async Task<List<ServiceDataModel>> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct)
{
try
{
return [.. await _dbContext.Services
.Include(x => x.ServiceHistory)
.Where(x => !x.IsDeleted)
.Select(x => CustomMapper.MapObject<ServiceDataModel>(x))
.ToListAsync(ct)];
}
catch (Exception ex)
{
_dbContext.ChangeTracker.Clear();
throw new StorageException(ex, _localizer);
}
}
}

View File

@@ -1,219 +0,0 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
/// <inheritdoc />
public partial class FirstMigration : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Masters",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
FIO = table.Column<string>(type: "text", nullable: false),
PostId = table.Column<string>(type: "text", nullable: false),
BirthDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
EmploymentDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
IsDeleted = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Masters", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Orders",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
Date = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
Status = table.Column<int>(type: "integer", nullable: false),
RoomType = table.Column<int>(type: "integer", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Orders", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Posts",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
PostId = table.Column<string>(type: "text", nullable: false),
PostName = table.Column<string>(type: "text", nullable: false),
PostType = table.Column<int>(type: "integer", nullable: false),
Salary = table.Column<double>(type: "double precision", nullable: false),
IsActual = table.Column<bool>(type: "boolean", nullable: false),
ChangeDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Posts", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Salaries",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
MasterId = table.Column<string>(type: "text", nullable: false),
SalaryDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false),
SalarySize = table.Column<double>(type: "double precision", nullable: false),
Prize = table.Column<double>(type: "double precision", nullable: false),
SalaryId = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Salaries", x => x.Id);
table.ForeignKey(
name: "FK_Salaries_Masters_SalaryId",
column: x => x.SalaryId,
principalTable: "Masters",
principalColumn: "Id");
});
migrationBuilder.CreateTable(
name: "ServiceOrders",
columns: table => new
{
OrderId = table.Column<string>(type: "text", nullable: false),
ServiceId = table.Column<string>(type: "text", nullable: false),
MasterId = table.Column<string>(type: "text", nullable: false),
TimeOfWorking = table.Column<int>(type: "integer", nullable: false),
ServiceOrderId = table.Column<string>(type: "text", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ServiceOrders", x => new { x.ServiceId, x.MasterId, x.OrderId });
table.ForeignKey(
name: "FK_ServiceOrders_Masters_ServiceOrderId",
column: x => x.ServiceOrderId,
principalTable: "Masters",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "Services",
columns: table => new
{
Id = table.Column<string>(type: "text", nullable: false),
ServiceName = table.Column<string>(type: "text", nullable: false),
ServiceType = table.Column<int>(type: "integer", nullable: false),
MasterId = table.Column<string>(type: "text", nullable: false),
Price = table.Column<double>(type: "double precision", nullable: false),
IsDeleted = table.Column<bool>(type: "boolean", nullable: false),
ServiceId = table.Column<string>(type: "text", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Services", x => x.Id);
table.ForeignKey(
name: "FK_Services_Masters_ServiceId",
column: x => x.ServiceId,
principalTable: "Masters",
principalColumn: "Id");
});
migrationBuilder.CreateTable(
name: "ServiceHistories",
columns: table => new
{
ServiceId = table.Column<string>(type: "text", nullable: false),
OldPrice = table.Column<double>(type: "double precision", nullable: false),
ChangeDate = table.Column<DateTime>(type: "timestamp with time zone", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ServiceHistories", x => x.ServiceId);
table.ForeignKey(
name: "FK_ServiceHistories_Services_ServiceId",
column: x => x.ServiceId,
principalTable: "Services",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_Masters_Id_IsDeleted",
table: "Masters",
columns: new[] { "Id", "IsDeleted" },
unique: true,
filter: "\"IsDeleted\" = FALSE");
migrationBuilder.CreateIndex(
name: "IX_Orders_Id",
table: "Orders",
column: "Id",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_Posts_PostId_IsActual",
table: "Posts",
columns: new[] { "PostId", "IsActual" },
unique: true,
filter: "\"IsActual\" = TRUE");
migrationBuilder.CreateIndex(
name: "IX_Posts_PostName_IsActual",
table: "Posts",
columns: new[] { "PostName", "IsActual" },
unique: true,
filter: "\"IsActual\" = TRUE");
migrationBuilder.CreateIndex(
name: "IX_Salaries_SalaryId",
table: "Salaries",
column: "SalaryId");
migrationBuilder.CreateIndex(
name: "IX_ServiceOrders_ServiceOrderId",
table: "ServiceOrders",
column: "ServiceOrderId");
migrationBuilder.CreateIndex(
name: "IX_Services_ServiceId",
table: "Services",
column: "ServiceId");
migrationBuilder.CreateIndex(
name: "IX_Services_ServiceName_IsDeleted",
table: "Services",
columns: new[] { "ServiceName", "IsDeleted" },
unique: true,
filter: "\"IsDeleted\" = FALSE");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Orders");
migrationBuilder.DropTable(
name: "Posts");
migrationBuilder.DropTable(
name: "Salaries");
migrationBuilder.DropTable(
name: "ServiceHistories");
migrationBuilder.DropTable(
name: "ServiceOrders");
migrationBuilder.DropTable(
name: "Services");
migrationBuilder.DropTable(
name: "Masters");
}
}
}

View File

@@ -1,277 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using TwoFromTheCasketDatabase;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
[DbContext(typeof(TwoFromTheCasketDbContext))]
[Migration("20250907135104_ChangeFieldsInPost")]
partial class ChangeFieldsInPost
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("BirthDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("EmploymentDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("Id", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Masters");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Order", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<int>("RoomType")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("Id")
.IsUnique();
b.ToTable("Orders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Post", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Configuration")
.IsRequired()
.HasColumnType("jsonb");
b.Property<bool>("IsActual")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PostName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("PostType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("PostId", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.HasIndex("PostName", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.ToTable("Posts");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Prize")
.HasColumnType("double precision");
b.Property<DateTime>("SalaryDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("SalaryId")
.HasColumnType("text");
b.Property<double>("SalarySize")
.HasColumnType("double precision");
b.HasKey("Id");
b.HasIndex("SalaryId");
b.ToTable("Salaries");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("ServiceName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ServiceType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ServiceId");
b.HasIndex("ServiceName", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("OldPrice")
.HasColumnType("double precision");
b.HasKey("ServiceId");
b.ToTable("ServiceHistories");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("MasterId")
.HasColumnType("text");
b.Property<string>("OrderId")
.HasColumnType("text");
b.Property<string>("ServiceOrderId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TimeOfWorking")
.HasColumnType("integer");
b.HasKey("ServiceId", "MasterId", "OrderId");
b.HasIndex("ServiceOrderId");
b.ToTable("ServiceOrders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", "Master")
.WithMany("Salaries")
.HasForeignKey("SalaryId");
b.Navigation("Master");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("Services")
.HasForeignKey("ServiceId");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Service", "Service")
.WithMany("ServiceHistory")
.HasForeignKey("ServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Service");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("ServiceOrders")
.HasForeignKey("ServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Navigation("Salaries");
b.Navigation("ServiceOrders");
b.Navigation("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Navigation("ServiceHistory");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,40 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
/// <inheritdoc />
public partial class ChangeFieldsInPost : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Salary",
table: "Posts");
migrationBuilder.AddColumn<string>(
name: "Configuration",
table: "Posts",
type: "jsonb",
nullable: false,
defaultValue: "{\"Rate\" : 0, \"Type\" : \"PostConfiguration\"}");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Configuration",
table: "Posts");
migrationBuilder.AddColumn<double>(
name: "Salary",
table: "Posts",
type: "double precision",
nullable: false,
defaultValue: 0.0);
}
}
}

View File

@@ -1,280 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using TwoFromTheCasketDatabase;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
[DbContext(typeof(TwoFromTheCasketDbContext))]
[Migration("20250907172931_AddDateOfDeleteToMasterAndIdToSalary")]
partial class AddDateOfDeleteToMasterAndIdToSalary
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("BirthDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime?>("DateOfDelete")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("EmploymentDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("Id", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Masters");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Order", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<int>("RoomType")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("Id")
.IsUnique();
b.ToTable("Orders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Post", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Configuration")
.IsRequired()
.HasColumnType("jsonb");
b.Property<bool>("IsActual")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PostName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("PostType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("PostId", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.HasIndex("PostName", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.ToTable("Posts");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Prize")
.HasColumnType("double precision");
b.Property<DateTime>("SalaryDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("SalaryId")
.HasColumnType("text");
b.Property<double>("SalarySize")
.HasColumnType("double precision");
b.HasKey("Id");
b.HasIndex("SalaryId");
b.ToTable("Salaries");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("ServiceName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ServiceType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ServiceId");
b.HasIndex("ServiceName", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("OldPrice")
.HasColumnType("double precision");
b.HasKey("ServiceId");
b.ToTable("ServiceHistories");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("MasterId")
.HasColumnType("text");
b.Property<string>("OrderId")
.HasColumnType("text");
b.Property<string>("ServiceOrderId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TimeOfWorking")
.HasColumnType("integer");
b.HasKey("ServiceId", "MasterId", "OrderId");
b.HasIndex("ServiceOrderId");
b.ToTable("ServiceOrders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", "Master")
.WithMany("Salaries")
.HasForeignKey("SalaryId");
b.Navigation("Master");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("Services")
.HasForeignKey("ServiceId");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Service", "Service")
.WithMany("ServiceHistory")
.HasForeignKey("ServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Service");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("ServiceOrders")
.HasForeignKey("ServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Navigation("Salaries");
b.Navigation("ServiceOrders");
b.Navigation("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Navigation("ServiceHistory");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,59 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
/// <inheritdoc />
public partial class AddDateOfDeleteToMasterAndIdToSalary : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Salaries_Masters_MasterId",
table: "Salaries");
migrationBuilder.DropIndex(
name: "IX_Salaries_MasterId",
table: "Salaries");
migrationBuilder.CreateIndex(
name: "IX_Salaries_SalaryId",
table: "Salaries",
column: "SalaryId");
migrationBuilder.AddForeignKey(
name: "FK_Salaries_Masters_SalaryId",
table: "Salaries",
column: "SalaryId",
principalTable: "Masters",
principalColumn: "Id");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Salaries_Masters_SalaryId",
table: "Salaries");
migrationBuilder.DropIndex(
name: "IX_Salaries_SalaryId",
table: "Salaries");
migrationBuilder.CreateIndex(
name: "IX_Salaries_MasterId",
table: "Salaries",
column: "MasterId");
migrationBuilder.AddForeignKey(
name: "FK_Salaries_Masters_MasterId",
table: "Salaries",
column: "MasterId",
principalTable: "Masters",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
}

View File

@@ -1,285 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using TwoFromTheCasketDatabase;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
[DbContext(typeof(TwoFromTheCasketDbContext))]
[Migration("20250907182212_AddSalaryForeignKey")]
partial class AddSalaryForeignKey
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("BirthDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("EmploymentDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("Id", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Masters");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Order", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<int>("RoomType")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("Id")
.IsUnique();
b.ToTable("Orders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Post", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Configuration")
.IsRequired()
.HasColumnType("jsonb");
b.Property<bool>("IsActual")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PostName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("PostType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("PostId", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.HasIndex("PostName", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.ToTable("Posts");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Prize")
.HasColumnType("double precision");
b.Property<DateTime>("SalaryDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("SalaryId")
.HasColumnType("text");
b.Property<double>("SalarySize")
.HasColumnType("double precision");
b.HasKey("Id");
b.HasIndex("MasterId");
b.HasIndex("SalaryId");
b.ToTable("Salaries");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("ServiceName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ServiceType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ServiceId");
b.HasIndex("ServiceName", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("OldPrice")
.HasColumnType("double precision");
b.HasKey("ServiceId");
b.ToTable("ServiceHistories");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("MasterId")
.HasColumnType("text");
b.Property<string>("OrderId")
.HasColumnType("text");
b.Property<string>("ServiceOrderId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TimeOfWorking")
.HasColumnType("integer");
b.HasKey("ServiceId", "MasterId", "OrderId");
b.HasIndex("ServiceOrderId");
b.ToTable("ServiceOrders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", "Master")
.WithMany()
.HasForeignKey("MasterId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("Salaries")
.HasForeignKey("SalaryId");
b.Navigation("Master");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("Services")
.HasForeignKey("ServiceId");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Service", "Service")
.WithMany("ServiceHistory")
.HasForeignKey("ServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Service");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("ServiceOrders")
.HasForeignKey("ServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Navigation("Salaries");
b.Navigation("ServiceOrders");
b.Navigation("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Navigation("ServiceHistory");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -1,39 +0,0 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
/// <inheritdoc />
public partial class AddSalaryForeignKey : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateIndex(
name: "IX_Salaries_MasterId",
table: "Salaries",
column: "MasterId");
migrationBuilder.AddForeignKey(
name: "FK_Salaries_Masters_MasterId",
table: "Salaries",
column: "MasterId",
principalTable: "Masters",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Salaries_Masters_MasterId",
table: "Salaries");
migrationBuilder.DropIndex(
name: "IX_Salaries_MasterId",
table: "Salaries");
}
}
}

View File

@@ -1,280 +0,0 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using TwoFromTheCasketDatabase;
#nullable disable
namespace TwoFromTheCasketDatabase.Migrations
{
[DbContext(typeof(TwoFromTheCasketDbContext))]
[Migration("20250907183927_FixSalaryForeignKeyConfiguration")]
partial class FixSalaryForeignKeyConfiguration
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "9.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("BirthDate")
.HasColumnType("timestamp with time zone");
b.Property<DateTime>("EmploymentDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("FIO")
.IsRequired()
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.HasKey("Id");
b.HasIndex("Id", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Masters");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Order", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("Date")
.HasColumnType("timestamp with time zone");
b.Property<int>("RoomType")
.HasColumnType("integer");
b.Property<int>("Status")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("Id")
.IsUnique();
b.ToTable("Orders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Post", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("Configuration")
.IsRequired()
.HasColumnType("jsonb");
b.Property<bool>("IsActual")
.HasColumnType("boolean");
b.Property<string>("PostId")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PostName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("PostType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("PostId", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.HasIndex("PostName", "IsActual")
.IsUnique()
.HasFilter("\"IsActual\" = TRUE");
b.ToTable("Posts");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Prize")
.HasColumnType("double precision");
b.Property<DateTime>("SalaryDate")
.HasColumnType("timestamp with time zone");
b.Property<string>("SalaryId")
.HasColumnType("text");
b.Property<double>("SalarySize")
.HasColumnType("double precision");
b.HasKey("Id");
b.HasIndex("MasterId", "SalaryDate")
.IsUnique();
b.ToTable("Salaries");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Property<string>("Id")
.HasColumnType("text");
b.Property<bool>("IsDeleted")
.HasColumnType("boolean");
b.Property<string>("MasterId")
.IsRequired()
.HasColumnType("text");
b.Property<double>("Price")
.HasColumnType("double precision");
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("ServiceName")
.IsRequired()
.HasColumnType("text");
b.Property<int>("ServiceType")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("ServiceId");
b.HasIndex("ServiceName", "IsDeleted")
.IsUnique()
.HasFilter("\"IsDeleted\" = FALSE");
b.ToTable("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<DateTime>("ChangeDate")
.HasColumnType("timestamp with time zone");
b.Property<double>("OldPrice")
.HasColumnType("double precision");
b.HasKey("ServiceId");
b.ToTable("ServiceHistories");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.Property<string>("ServiceId")
.HasColumnType("text");
b.Property<string>("MasterId")
.HasColumnType("text");
b.Property<string>("OrderId")
.HasColumnType("text");
b.Property<string>("ServiceOrderId")
.IsRequired()
.HasColumnType("text");
b.Property<int>("TimeOfWorking")
.HasColumnType("integer");
b.HasKey("ServiceId", "MasterId", "OrderId");
b.HasIndex("ServiceOrderId");
b.ToTable("ServiceOrders");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Salary", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", "Master")
.WithMany("Salaries")
.HasForeignKey("MasterId")
.OnDelete(DeleteBehavior.Restrict)
.IsRequired();
b.Navigation("Master");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("Services")
.HasForeignKey("ServiceId");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceHistory", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Service", "Service")
.WithMany("ServiceHistory")
.HasForeignKey("ServiceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Service");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.ServiceOrder", b =>
{
b.HasOne("TwoFromTheCasketDatabase.Models.Master", null)
.WithMany("ServiceOrders")
.HasForeignKey("ServiceOrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Master", b =>
{
b.Navigation("Salaries");
b.Navigation("ServiceOrders");
b.Navigation("Services");
});
modelBuilder.Entity("TwoFromTheCasketDatabase.Models.Service", b =>
{
b.Navigation("ServiceHistory");
});
#pragma warning restore 612, 618
}
}
}

Some files were not shown because too many files have changed in this diff Show More