11 Commits

Author SHA1 Message Date
981c70e934 победа 2023-05-26 01:02:14 +04:00
f63f0c8329 Merge LabWork04_Hard && LabWork04 2023-05-25 23:00:32 +04:00
f12ae5329c пофиксила метод AddRepair в логике магазина, из-за которого не могла пополнить остальные магазины, если самый первый забит 2023-05-25 22:52:19 +04:00
97adf46248 добавление классов для магазина 2023-05-25 20:04:42 +04:00
7ad8a26a9f Merge branch 'LabWork03' into LabWork03_Hard 2023-05-18 14:33:15 +04:00
ecf6fa3119 теперь точно все 2023-05-18 14:25:53 +04:00
78f5355d79 Готово 2023-05-17 00:48:51 +04:00
f433134c5f вроде только формы осталось 2023-05-16 01:18:00 +04:00
4827d81834 merge LabWork02_Hard && LabWork02 2023-05-16 00:34:33 +04:00
f0ce0785f4 ура, теперь все нормально пополняется 2023-05-16 00:24:08 +04:00
dcb32fa09d оч умный список изделий в магазинах шутит шутки при пополнении конкретным изделием) 2023-05-04 14:57:02 +04:00
59 changed files with 3920 additions and 83 deletions

1
.gitignore vendored
View File

@@ -398,3 +398,4 @@ FodyWeavers.xsd
# JetBrains Rider # JetBrains Rider
*.sln.iml *.sln.iml
/CarRepairShop/ImplementationExtensions

View File

@@ -12,11 +12,15 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
private readonly IShopLogic _shopLogic;
private readonly IRepairStorage _repairStorage;
public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage) public OrderLogic(ILogger<OrderLogic> logger, IOrderStorage orderStorage, IShopLogic shopLogic, IRepairStorage repairStorage)
{ {
_logger = logger; _logger = logger;
_orderStorage = orderStorage; _orderStorage = orderStorage;
_shopLogic = shopLogic;
_repairStorage = repairStorage;
} }
public bool CreateOrder(OrderBindingModel model) public bool CreateOrder(OrderBindingModel model)
{ {
@@ -48,7 +52,19 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
return false; return false;
} }
model.Status = newStatus; model.Status = newStatus;
if (model.Status == OrderStatus.Готов) model.DateImplement = DateTime.Now; if (model.Status == OrderStatus.Готов)
{
model.DateImplement = DateTime.Now;
var repair = _repairStorage.GetElement(new() { Id = viewModel.RepairId });
if (repair == null)
{
throw new ArgumentNullException(nameof(repair));
}
if (!_shopLogic.AddRepair(repair, viewModel.Count))
{
throw new Exception($"AddRepair operation failed. Shop is full.");
}
}
else else
{ {
model.DateImplement = viewModel.DateImplement; model.DateImplement = viewModel.DateImplement;

View File

@@ -13,16 +13,24 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
private readonly IOilStorage _oilStorage; private readonly IOilStorage _oilStorage;
private readonly IRepairStorage _repairStorage; private readonly IRepairStorage _repairStorage;
private readonly IOrderStorage _orderStorage; private readonly IOrderStorage _orderStorage;
private readonly IShopStorage _shopStorage;
private readonly AbstractSaveToExcel _saveToExcel; private readonly AbstractSaveToExcel _saveToExcel;
private readonly AbstractSaveToWord _saveToWord; private readonly AbstractSaveToWord _saveToWord;
private readonly AbstractSaveToPdf _saveToPdf; private readonly AbstractSaveToPdf _saveToPdf;
public ReportLogic(IOilStorage oilStorage, IRepairStorage repairStorage, IOrderStorage orderStorage, AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf) public ReportLogic(IOilStorage oilStorage,
IRepairStorage repairStorage,
IOrderStorage orderStorage,
IShopStorage shopStorage,
AbstractSaveToExcel saveToExcel,
AbstractSaveToWord saveToWord,
AbstractSaveToPdf saveToPdf)
{ {
_oilStorage = oilStorage; _oilStorage = oilStorage;
_repairStorage = repairStorage; _repairStorage = repairStorage;
_orderStorage = orderStorage; _orderStorage = orderStorage;
_shopStorage = shopStorage;
_saveToExcel = saveToExcel; _saveToExcel = saveToExcel;
_saveToWord = saveToWord; _saveToWord = saveToWord;
_saveToPdf = saveToPdf; _saveToPdf = saveToPdf;
@@ -47,6 +55,19 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
.ToList(); .ToList();
} }
public List<ReportOrdersGroupDateViewModel> GetOrdersGroupDate()
{
return _orderStorage.GetFullList()
.GroupBy(x => x.DateCreate.Date)
.Select(x => new ReportOrdersGroupDateViewModel
{
DateCreate = x.Key,
Count = x.Count(),
Sum = x.Sum(x => x.Sum)
})
.ToList();
}
public List<ReportRepairOilViewModel> GetRepairOil() public List<ReportRepairOilViewModel> GetRepairOil()
{ {
var oils = _oilStorage.GetFullList(); var oils = _oilStorage.GetFullList();
@@ -74,6 +95,34 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
return list; return list;
} }
/// <summary>
/// Получение списка ремонтов с указанием, в каких магазинах используются
/// </summary>
/// <returns></returns>
public List<ReportShopRepairsViewModel> GetShopRepairs()
{
var shops = _shopStorage.GetFullList();
var list = new List<ReportShopRepairsViewModel>();
foreach (var shop in shops)
{
var record = new ReportShopRepairsViewModel
{
ShopName = shop.ShopName,
Repairs = new(),
TotalCount = 0
};
foreach (var repair in shop.Repairs)
{
record.Repairs.Add(new(repair.Value.Item1.RepairName, repair.Value.Item2));
record.TotalCount += repair.Value.Item2;
}
list.Add(record);
}
return list;
}
/// <summary> /// <summary>
/// Сохранение ингредиентов в файл-Word /// Сохранение ингредиентов в файл-Word
/// </summary> /// </summary>
@@ -88,6 +137,20 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
}); });
} }
/// <summary>
/// Сохранение заказов в файл-Pdf
/// </summary>
/// <param name="model"></param>
public void SaveOrdersGroupDateToPdfFile(ReportBindingModel model)
{
_saveToPdf.CreateOrdersGroupDateDoc(new PdfInfo
{
FileName = model.FileName,
Title = "Список заказов",
OrdersGroupDate = GetOrdersGroupDate()
});
}
/// <summary> /// <summary>
/// Сохранение заказов в файл-Pdf /// Сохранение заказов в файл-Pdf
/// </summary> /// </summary>
@@ -117,5 +180,33 @@ namespace CarRepairShopBusinessLogic.BusinessLogics
RepairOils = GetRepairOil() RepairOils = GetRepairOil()
}); });
} }
/// <summary>
/// Сохранение ремонтов с указаеним магазина в файл-Excel
/// </summary>
/// <param name="model"></param>
public void SaveShopRepairsToExcelFile(ReportBindingModel model)
{
_saveToExcel.CreateShopReport(new ExcelInfo
{
FileName = model.FileName,
Title = "Список магазинов",
ShopRepairs = GetShopRepairs()
});
}
/// <summary>
/// Сохранение магазинов в файл-Word
/// </summary>
/// <param name="model"></param>
public void SaveShopsToWordFile(ReportBindingModel model)
{
_saveToWord.CreateShopsDoc(new WordInfo
{
FileName = model.FileName,
Title = "Список магазинов",
Shops = _shopStorage.GetFullList()
});
}
} }
} }

View File

@@ -0,0 +1,224 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.BusinessLogicsContracts;
using CarRepairShopContracts.SearchModels;
using CarRepairShopContracts.StoragesContracts;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
using Microsoft.Extensions.Logging;
using System.Reflection;
namespace CarRepairShopBusinessLogic.BusinessLogics
{
public class ShopLogic : IShopLogic
{
private readonly ILogger _logger;
private readonly IShopStorage _shopStorage;
public ShopLogic(ILogger<ShopLogic> logger, IShopStorage shopStorage)
{
_logger = logger;
_shopStorage = shopStorage;
}
public bool AddRepair(IRepairModel repair, int count)
{
if (repair == null)
{
throw new ArgumentNullException(nameof(repair));
}
if (count <= 0)
{
throw new ArgumentException("Количество ремонтов должно быть больше 0", nameof(count));
}
var freeCount = _shopStorage.GetFullList()
.Select(x => x.MaxCountRepairs - x.Repairs
.Select(p => p.Value.Item2).Sum()).Sum() - count;
if (freeCount < 0)
{
_logger.LogInformation("AddRepair. Не удалось добавить изделия в магазины, они переполнены.");
return false;
}
foreach (var shop in _shopStorage.GetFullList())
{
int countFree = shop.MaxCountRepairs - shop.Repairs.Select(x => x.Value.Item2).Sum();
if (countFree <= 0) { continue; }
if (countFree < count)
{
if (!AddRepairInShop(new() { Id = shop.Id }, repair, countFree))
{
_logger.LogWarning("AddRepairInShop operation failed.");
return false;
}
count -= countFree;
}
else
{
if (!AddRepairInShop(new() { Id = shop.Id }, repair, count))
{
_logger.LogWarning("AddRepairInShop operation failed.");
return false;
}
count = 0;
}
if (count == 0)
{
return true;
}
}
return false;
}
public bool AddRepairInShop(ShopSearchModel model, IRepairModel repair, int count)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (count<= 0)
{
throw new ArgumentException("Количество ремонтов должно быть больше 0", nameof(count));
}
_logger.LogInformation("AddRepairInShop. ShopName:{ShopName}.Id:{Id}",
model.ShopName, model.Id);
var element = _shopStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("AddRepairInShop element not found");
return false;
}
if (element.MaxCountRepairs - element.Repairs.Select(x => x.Value.Item2).Sum() < count)
{
throw new ArgumentNullException("Магазин переполнен", nameof(count));
}
_logger.LogInformation("AddRepairInShop find. Id:{Id}", element.Id);
if(element.Repairs.TryGetValue(repair.Id, out var pair))
{
element.Repairs[repair.Id] = (repair, count + pair.Item2);
_logger.LogInformation(
"AddRepairInShop. Added {count} {repair} to '{ShopName}' shop",
count, repair.RepairName, element.ShopName);
}
else
{
element.Repairs[repair.Id] = (repair, count);
_logger.LogInformation(
"AddRepairInShop. Added {count} new repair {repair} to '{ShopName}' shop",
count, repair.RepairName, element.ShopName);
}
_shopStorage.Update(new()
{
Id = element.Id,
Address = element.Address,
ShopName = element.ShopName,
DateOpening = element.DateOpening,
MaxCountRepairs = element.MaxCountRepairs,
Repairs = element.Repairs
});
return true;
}
public bool Create(ShopBindingModel model)
{
CheckModel(model);
if (_shopStorage.Insert(model) == null)
{
_logger.LogWarning("Insert operation failed");
return false;
}
return true;
}
public bool Delete(ShopBindingModel model)
{
CheckModel(model, false);
_logger.LogInformation("Delete. Id: {Id}", model.Id);
if (_shopStorage.Delete(model) == null)
{
_logger.LogWarning("Delete operation failed");
return false;
}
return true;
}
public ShopViewModel? ReadElement(ShopSearchModel model)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
_logger.LogInformation("ReadElement. ShopName: {ShopName}. Id: {Id}",
model.ShopName, model.Id);
var element = _shopStorage.GetElement(model);
if (element == null)
{
_logger.LogWarning("ReadElement element not found");
return null;
}
_logger.LogInformation("ReadElement find. Id: {Id}", element.Id);
return element;
}
public List<ShopViewModel>? ReadList(ShopSearchModel? model)
{
_logger.LogInformation("ReadList. ShopName: {ShopName}. Id: {Id}",
model?.ShopName, model?.Id);
var list = model == null ? _shopStorage.GetFullList() :
_shopStorage.GetFilteredList(model);
if (list == null)
{
_logger.LogWarning("ReadList return null list");
return null;
}
_logger.LogInformation("ReadList. Count: {Count}", list.Count);
return list;
}
public bool SellRepair(IRepairModel repair, int count)
{
return _shopStorage.SellRepair(repair, count);
}
public bool Update(ShopBindingModel model)
{
CheckModel(model, false);
if (_shopStorage.Update(model) == null)
{
_logger.LogWarning("Update operation failed");
return false;
}
return true;
}
private void CheckModel(ShopBindingModel model, bool withParams = true)
{
if (model == null)
{
throw new ArgumentNullException(nameof(model));
}
if (!withParams)
{
return;
}
if (string.IsNullOrEmpty(model.ShopName))
{
throw new ArgumentNullException("Нет названия магазина", nameof(model.ShopName));
}
if (model.MaxCountRepairs < 0)
{
throw new ArgumentException(
"Максимальное количество ремонтов в магазине не может быть меньше нуля",
nameof(model.MaxCountRepairs));
}
_logger.LogInformation("Shop. ShopName:{0}.Address:{1}. Id: {2}",
model.ShopName, model.Address, model.Id);
var element = _shopStorage.GetElement(new ShopSearchModel
{
ShopName = model.ShopName
});
if (element != null && element.Id != model.Id && element.ShopName == model.ShopName)
{
throw new InvalidOperationException("Магазин с таким названием уже есть");
}
}
}
}

View File

@@ -78,6 +78,81 @@ ExcelStyleInfoType.TextWithBroder
SaveExcel(info); SaveExcel(info);
} }
/// <summary>
/// Создание отчета по суши в магазинах
/// </summary>
/// <param name="info"></param>
public void CreateShopReport(ExcelInfo info)
{
CreateExcel(info);
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "A",
RowIndex = 1,
Text = info.Title,
StyleInfo = ExcelStyleInfoType.Title
});
MergeCells(new ExcelMergeParameters
{
CellFromName = "A1",
CellToName = "C1"
});
uint rowIndex = 2;
foreach (var sr in info.ShopRepairs)
{
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "A",
RowIndex = rowIndex,
Text = sr.ShopName,
StyleInfo = ExcelStyleInfoType.Text
});
rowIndex++;
foreach (var (Repair, Count) in sr.Repairs)
{
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "B",
RowIndex = rowIndex,
Text = Repair,
StyleInfo = ExcelStyleInfoType.TextWithBroder
});
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "C",
RowIndex = rowIndex,
Text = Count.ToString(),
StyleInfo = ExcelStyleInfoType.TextWithBroder
});
rowIndex++;
}
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "A",
RowIndex = rowIndex,
Text = "Итого",
StyleInfo = ExcelStyleInfoType.Text
});
InsertCellInWorksheet(new ExcelCellParameters
{
ColumnName = "C",
RowIndex = rowIndex,
Text = sr.TotalCount.ToString(),
StyleInfo = ExcelStyleInfoType.Text
});
rowIndex++;
}
SaveExcel(info);
}
/// <summary> /// <summary>
/// Создание excel-файла /// Создание excel-файла
/// </summary> /// </summary>

View File

@@ -52,6 +52,33 @@ PdfParagraphAlignmentType.Right
SavePdf(info); SavePdf(info);
} }
public void CreateOrdersGroupDateDoc(PdfInfo info)
{
CreatePdf(info);
CreateParagraph(new PdfParagraph { Text = info.Title, Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center });
CreateTable(new List<string> { "3cm", "3cm", "3cm" });
CreateRow(new PdfRowParameters
{
Texts = new List<string> { "Дата заказов", "Количество заказов", "Сумма" },
Style = "NormalTitle",
ParagraphAlignment = PdfParagraphAlignmentType.Center
});
foreach (var order in info.OrdersGroupDate)
{
CreateRow(new PdfRowParameters
{
Texts = new List<string> { order.DateCreate.ToShortDateString(), order.Count.ToString(), order.Sum.ToString() },
Style = "Normal",
ParagraphAlignment = PdfParagraphAlignmentType.Left
});
}
SavePdf(info);
}
/// <summary> /// <summary>
/// Создание doc-файла /// Создание doc-файла
/// </summary> /// </summary>

View File

@@ -40,12 +40,58 @@ namespace CarRepairShopBusinessLogic.OfficePackage
SaveWord(info); SaveWord(info);
} }
public void CreateShopsDoc(WordInfo info)
{
CreateWord(info);
CreateParagraph(new WordParagraph
{
Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24" }) },
TextProperties = new WordTextProperties
{
Size = "24",
JustificationType = WordJustificationType.Center
}
});
List<WordRow> rows = new List<WordRow>();
rows.Add(new WordRow
{
Rows = new List<(string, WordTextProperties)> {
("Название", new WordTextProperties { Size = "24", Bold = true }),
("Адрес", new WordTextProperties { Size = "24", Bold = true }),
("Дата открытия", new WordTextProperties { Size = "24", Bold = true })
}
});
foreach (var shop in info.Shops)
{
rows.Add(new WordRow
{
Rows = new List<(string, WordTextProperties)> {
(shop.ShopName, new WordTextProperties { Size = "24" }),
(shop.Address, new WordTextProperties { Size = "24" }),
(shop.DateOpening.ToShortDateString(), new WordTextProperties { Size = "24" })
}
});
}
CreateTable(rows);
SaveWord(info);
}
/// <summary> /// <summary>
/// Создание doc-файла /// Создание doc-файла
/// </summary> /// </summary>
/// <param name="info"></param> /// <param name="info"></param>
protected abstract void CreateWord(WordInfo info); protected abstract void CreateWord(WordInfo info);
/// <summary> /// <summary>
/// Создание таблицы
/// </summary>
/// <param name="rows"></param>
protected abstract void CreateTable(List<WordRow> rows);
/// <summary>
/// Создание абзаца с текстом /// Создание абзаца с текстом
/// </summary> /// </summary>
/// <param name="paragraph"></param> /// <param name="paragraph"></param>

View File

@@ -11,6 +11,7 @@ namespace CarRepairShopBusinessLogic.OfficePackage.HelperModels
get; get;
set; set;
} = new(); } = new();
public List<ReportShopRepairsViewModel> ShopRepairs { get; set; } = new();
} }
} }

View File

@@ -9,5 +9,6 @@ namespace CarRepairShopBusinessLogic.OfficePackage.HelperModels
public DateTime DateFrom { get; set; } public DateTime DateFrom { get; set; }
public DateTime DateTo { get; set; } public DateTime DateTo { get; set; }
public List<ReportOrdersViewModel> Orders { get; set; } = new(); public List<ReportOrdersViewModel> Orders { get; set; } = new();
public List<ReportOrdersGroupDateViewModel> OrdersGroupDate { get; set; } = new();
} }
} }

View File

@@ -9,5 +9,6 @@ namespace CarRepairShopBusinessLogic.OfficePackage.HelperModels
public string Title { get; set; } = string.Empty; public string Title { get; set; } = string.Empty;
public List<RepairViewModel> Repairs { get; set; } = new(); public List<RepairViewModel> Repairs { get; set; } = new();
public List<ShopViewModel> Shops { get; set; } = new();
} }
} }

View File

@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarRepairShopBusinessLogic.OfficePackage.HelperModels
{
public class WordRow
{
public List<(string, WordTextProperties)> Rows { get; set; } = new();
}
}

View File

@@ -135,5 +135,59 @@ namespace CarRepairShopBusinessLogic.OfficePackage.Implements
_wordDocument.Close(); _wordDocument.Close();
} }
protected override void CreateTable(List<WordRow> rows)
{
if (_docBody == null || rows == null)
{
return;
}
Table table = new Table();
var tableProp = new TableProperties();
tableProp.AppendChild(new TableLayout { Type = TableLayoutValues.Fixed });
tableProp.AppendChild(new TableBorders(
new TopBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 },
new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 4 }
));
tableProp.AppendChild(new TableWidth { Type = TableWidthUnitValues.Auto });
table.AppendChild(tableProp);
TableGrid tableGrid = new TableGrid();
for (int j = 0; j < rows[0].Rows.Count; ++j)
{
tableGrid.AppendChild(new GridColumn() { Width = "3200" });
}
table.AppendChild(tableGrid);
for (int i = 0; i < rows.Count; ++i)
{
TableRow docRow = new TableRow();
for (int j = 0; j < rows[i].Rows.Count; ++j)
{
var docParagraph = new Paragraph();
var docRun = new Run();
var runProperties = new RunProperties();
docParagraph.AppendChild(CreateParagraphProperties(rows[i].Rows[j].Item2));
runProperties.AppendChild(new RunFonts() { Ascii = "Times New Roman", ComplexScript = "Times New Roman", HighAnsi = "Times New Roman" });
runProperties.AppendChild(new FontSize { Val = rows[i].Rows[j].Item2.Size == null ? rows[i].Rows[j].Item2.Size : "24" });
if (rows[i].Rows[j].Item2.Bold)
runProperties.AppendChild(new Bold());
docRun.AppendChild(runProperties);
docRun.AppendChild(new Text { Text = rows[i].Rows[j].Item1.ToString(), Space = SpaceProcessingModeValues.Preserve });
docParagraph.AppendChild(docRun);
TableCell docCell = new TableCell();
docCell.AppendChild(docParagraph);
docRow.AppendChild(docCell);
}
table.AppendChild(docRow);
}
_docBody.AppendChild(table);
}
} }
} }

View File

@@ -0,0 +1,19 @@
using CarRepairShopDataModels.Models;
namespace CarRepairShopContracts.BindingModels
{
public class ShopBindingModel : IShopModel
{
public string ShopName { get; set; } = string.Empty;
public string Address { get; set; } = string.Empty;
public DateTime DateOpening { get; set; }
public Dictionary<int, (IRepairModel, int)> Repairs { get; set; } = new();
public int Id { get; set; }
public int MaxCountRepairs { get; set; }
}
}

View File

@@ -11,17 +11,42 @@ namespace CarRepairShopContracts.BusinessLogicsContracts
/// <returns></returns> /// <returns></returns>
List<ReportRepairOilViewModel> GetRepairOil(); List<ReportRepairOilViewModel> GetRepairOil();
/// <summary>
/// Получение списка ремонтов с указанием, в каких магазинах используются
/// </summary>
/// <returns></returns>
List<ReportShopRepairsViewModel> GetShopRepairs();
/// <summary> /// <summary>
/// Получение списка заказов за определенный период /// Получение списка заказов за определенный период
/// </summary> /// </summary>
/// <param name="model"></param> /// <param name="model"></param>
/// <returns></returns> /// <returns></returns>
List<ReportOrdersViewModel> GetOrders(ReportBindingModel model); List<ReportOrdersViewModel> GetOrders(ReportBindingModel model);
/// <summary>
/// Получение списка заказов, сгруппированных по дате
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
List<ReportOrdersGroupDateViewModel> GetOrdersGroupDate();
/// <summary> /// <summary>
/// Сохранение компонент в файл-Word /// Сохранение компонент в файл-Word
/// </summary> /// </summary>
/// <param name="model"></param> /// <param name="model"></param>
void SaveOilsToWordFile(ReportBindingModel model); void SaveOilsToWordFile(ReportBindingModel model);
/// <summary>
/// Сохранение магазинов в файл-Word
/// </summary>
/// <param name="model"></param>
void SaveShopsToWordFile(ReportBindingModel model);
/// <summary>
/// Сохранение ремонтов с указаеним магазинов в файл-Excel
/// </summary>
/// <param name="model"></param>
void SaveShopRepairsToExcelFile(ReportBindingModel model);
/// <summary> /// <summary>
/// Сохранение компонент с указаеним продуктов в файл-Excel /// Сохранение компонент с указаеним продуктов в файл-Excel
/// </summary> /// </summary>
@@ -33,5 +58,11 @@ namespace CarRepairShopContracts.BusinessLogicsContracts
/// <param name="model"></param> /// <param name="model"></param>
void SaveOrdersToPdfFile(ReportBindingModel model); void SaveOrdersToPdfFile(ReportBindingModel model);
/// <summary>
/// Сохранение сгруппированных заказов в файл-Pdf
/// </summary>
/// <param name="model"></param>
void SaveOrdersGroupDateToPdfFile(ReportBindingModel model);
} }
} }

View File

@@ -0,0 +1,19 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.SearchModels;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
namespace CarRepairShopContracts.BusinessLogicsContracts
{
public interface IShopLogic
{
List<ShopViewModel>? ReadList(ShopSearchModel? model);
ShopViewModel? ReadElement(ShopSearchModel model);
bool Create(ShopBindingModel model);
bool Update(ShopBindingModel model);
bool Delete(ShopBindingModel model);
bool AddRepairInShop(ShopSearchModel model, IRepairModel repair, int count);
bool AddRepair(IRepairModel repair, int count);
bool SellRepair(IRepairModel repair, int count);
}
}

View File

@@ -0,0 +1,8 @@
namespace CarRepairShopContracts.SearchModels
{
public class ShopSearchModel
{
public int? Id { get; set; }
public string? ShopName { get; set; }
}
}

View File

@@ -0,0 +1,18 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.SearchModels;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
namespace CarRepairShopContracts.StoragesContracts
{
public interface IShopStorage
{
List<ShopViewModel> GetFullList();
List<ShopViewModel> GetFilteredList(ShopSearchModel model);
ShopViewModel? GetElement(ShopSearchModel model);
ShopViewModel? Insert(ShopBindingModel model);
ShopViewModel? Update(ShopBindingModel model);
ShopViewModel? Delete(ShopBindingModel model);
bool SellRepair(IRepairModel model, int count);
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarRepairShopContracts.ViewModels
{
public class ReportOrdersGroupDateViewModel
{
public DateTime DateCreate { get; set; }
public int Count { get; set; }
public double Sum { get; set; }
}
}

View File

@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarRepairShopContracts.ViewModels
{
public class ReportShopRepairsViewModel
{
public string ShopName { get; set; } = string.Empty;
public int TotalCount { get; set; }
public List<(string Repair, int Count)> Repairs { get; set; } = new();
}
}

View File

@@ -0,0 +1,21 @@
using CarRepairShopDataModels.Models;
using System.ComponentModel;
namespace CarRepairShopContracts.ViewModels
{
public class ShopViewModel : IShopModel
{
[DisplayName("Название магазина")]
public string ShopName { get; set; } = string.Empty;
[DisplayName("Адрес магазина")]
public string Address { get; set; } = string.Empty;
[DisplayName("Дата открытия")]
public DateTime DateOpening { get; set; } = DateTime.Now;
public Dictionary<int, (IRepairModel, int)> Repairs { get; set; } = new();
public int Id { get; set; }
[DisplayName("Максимальное количество ремонтов")]
public int MaxCountRepairs { get; set; }
}
}

View File

@@ -0,0 +1,11 @@
namespace CarRepairShopDataModels.Models
{
public interface IShopModel : IId
{
string ShopName { get; }
string Address { get; }
DateTime DateOpening { get; }
Dictionary<int, (IRepairModel, int)> Repairs { get; }
int MaxCountRepairs { get; }
}
}

View File

@@ -10,7 +10,7 @@ namespace CarRepairShopDatabaseImplement
{ {
if (optionsBuilder.IsConfigured == false) if (optionsBuilder.IsConfigured == false)
{ {
optionsBuilder.UseSqlServer(@"Data Source=LAPTOP-L5HJ0T5Q\SQLEXPRESS;Initial Catalog=CarRepairShopDatabaseFull;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True"); optionsBuilder.UseSqlServer(@"Data Source=LAPTOP-L5HJ0T5Q\SQLEXPRESS;Initial Catalog=CarRepairShopDatabaseHard;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True");
} }
base.OnConfiguring(optionsBuilder); base.OnConfiguring(optionsBuilder);
} }
@@ -22,5 +22,9 @@ namespace CarRepairShopDatabaseImplement
public virtual DbSet<RepairOil> RepairOils { set; get; } public virtual DbSet<RepairOil> RepairOils { set; get; }
public virtual DbSet<Order> Orders { set; get; } public virtual DbSet<Order> Orders { set; get; }
public virtual DbSet<Shop> Shops { set; get; }
public virtual DbSet<ShopRepair> ShopRepairs { set; get; }
} }
} }

View File

@@ -0,0 +1,156 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.SearchModels;
using CarRepairShopContracts.StoragesContracts;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDatabaseImplement.Models;
using CarRepairShopDataModels.Models;
using Microsoft.EntityFrameworkCore;
namespace CarRepairShopDatabaseImplement.Implements
{
public class ShopStorage : IShopStorage
{
public ShopViewModel? Delete(ShopBindingModel model)
{
using var context = new CarRepairShopDatabase();
var element = context.Shops
.Include(x => x.RepairsFk)
.FirstOrDefault(rec => rec.Id == model.Id);
if (element != null)
{
context.Shops.Remove(element);
context.SaveChanges();
return element.GetViewModel;
}
return null;
}
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
{
return null;
}
using var context = new CarRepairShopDatabase();
return context.Shops
.Include(x => x.RepairsFk)
.ThenInclude(x => x.Repair)
.FirstOrDefault(x => (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName) ||
(model.Id.HasValue && x.Id == model.Id))
?.GetViewModel;
}
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName))
{
return new();
}
using var context = new CarRepairShopDatabase();
return context.Shops
.Include(x => x.RepairsFk)
.ThenInclude(x => x.Repair)
.Where(x => x.ShopName.Contains(model.ShopName))
.ToList()
.Select(x => x.GetViewModel)
.ToList();
}
public List<ShopViewModel> GetFullList()
{
using var context = new CarRepairShopDatabase();
return context.Shops
.Include(x => x.RepairsFk)
.ThenInclude(x => x.Repair)
.ToList()
.Select(x => x.GetViewModel)
.ToList();
}
public ShopViewModel? Insert(ShopBindingModel model)
{
using var context = new CarRepairShopDatabase();
var newShop = Shop.Create(context, model);
if (newShop == null)
{
return null;
}
context.Shops.Add(newShop);
context.SaveChanges();
return newShop.GetViewModel;
}
public bool SellRepair(IRepairModel model, int count)
{
using var context = new CarRepairShopDatabase();
using var transaction = context.Database.BeginTransaction();
try
{
foreach (var shop in context.Shops
.Include(x => x.RepairsFk)
.ThenInclude(x => x.Repair)
.ToList()
.Where(x => x.Repairs.ContainsKey(model.Id)))
{
int countInCurrentShop = shop.Repairs[model.Id].Item2;
if (countInCurrentShop <= count)
{
var elem = context.ShopRepairs
.Where(x => x.RepairId == model.Id)
.FirstOrDefault(x => x.ShopId == shop.Id);
context.ShopRepairs.Remove(elem);
shop.Repairs.Remove(model.Id);
count -= countInCurrentShop;
}
else
{
shop.Repairs[model.Id] = (shop.Repairs[model.Id].Item1, countInCurrentShop - count);
count = 0;
shop.UpdateRepairs(context, new()
{
Id = shop.Id,
Repairs = shop.Repairs,
});
}
if (count == 0)
{
context.SaveChanges();
transaction.Commit();
return true;
}
}
transaction.Rollback();
return false;
}
catch
{
transaction.Rollback();
throw;
}
}
public ShopViewModel? Update(ShopBindingModel model)
{
using var context = new CarRepairShopDatabase();
using var transaction = context.Database.BeginTransaction();
try
{
var shop = context.Shops.FirstOrDefault(rec => rec.Id == model.Id);
if (shop == null)
{
return null;
}
shop.Update(model);
context.SaveChanges();
shop.UpdateRepairs(context, model);
transaction.Commit();
return shop.GetViewModel;
}
catch
{
transaction.Rollback();
throw;
}
}
}
}

View File

@@ -12,8 +12,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace CarRepairShopDatabaseImplement.Migrations namespace CarRepairShopDatabaseImplement.Migrations
{ {
[DbContext(typeof(CarRepairShopDatabase))] [DbContext(typeof(CarRepairShopDatabase))]
[Migration("20230323085938_InitialCreate")] [Migration("20230525164021_shopMigration")]
partial class InitialCreate partial class shopMigration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@@ -124,6 +124,59 @@ namespace CarRepairShopDatabaseImplement.Migrations
b.ToTable("RepairOils"); b.ToTable("RepairOils");
}); });
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Shop", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Address")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("DateOpening")
.HasColumnType("datetime2");
b.Property<int>("MaxCountRepairs")
.HasColumnType("int");
b.Property<string>("ShopName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Shops");
});
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.ShopRepair", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("RepairId")
.HasColumnType("int");
b.Property<int>("ShopId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("RepairId");
b.HasIndex("ShopId");
b.ToTable("ShopRepairs");
});
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Order", b => modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Order", b =>
{ {
b.HasOne("CarRepairShopDatabaseImplement.Models.Repair", "Repair") b.HasOne("CarRepairShopDatabaseImplement.Models.Repair", "Repair")
@@ -154,6 +207,25 @@ namespace CarRepairShopDatabaseImplement.Migrations
b.Navigation("Repair"); b.Navigation("Repair");
}); });
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.ShopRepair", b =>
{
b.HasOne("CarRepairShopDatabaseImplement.Models.Repair", "Repair")
.WithMany()
.HasForeignKey("RepairId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("CarRepairShopDatabaseImplement.Models.Shop", "Shop")
.WithMany("RepairsFk")
.HasForeignKey("ShopId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Repair");
b.Navigation("Shop");
});
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Oil", b => modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Oil", b =>
{ {
b.Navigation("RepairOils"); b.Navigation("RepairOils");
@@ -165,6 +237,11 @@ namespace CarRepairShopDatabaseImplement.Migrations
b.Navigation("Orders"); b.Navigation("Orders");
}); });
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Shop", b =>
{
b.Navigation("RepairsFk");
});
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }
} }

View File

@@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations;
namespace CarRepairShopDatabaseImplement.Migrations namespace CarRepairShopDatabaseImplement.Migrations
{ {
/// <inheritdoc /> /// <inheritdoc />
public partial class InitialCreate : Migration public partial class shopMigration : Migration
{ {
/// <inheritdoc /> /// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder) protected override void Up(MigrationBuilder migrationBuilder)
@@ -39,6 +39,22 @@ namespace CarRepairShopDatabaseImplement.Migrations
table.PrimaryKey("PK_Repairs", x => x.Id); table.PrimaryKey("PK_Repairs", x => x.Id);
}); });
migrationBuilder.CreateTable(
name: "Shops",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
ShopName = table.Column<string>(type: "nvarchar(max)", nullable: false),
Address = table.Column<string>(type: "nvarchar(max)", nullable: false),
DateOpening = table.Column<DateTime>(type: "datetime2", nullable: false),
MaxCountRepairs = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Shops", x => x.Id);
});
migrationBuilder.CreateTable( migrationBuilder.CreateTable(
name: "Orders", name: "Orders",
columns: table => new columns: table => new
@@ -90,6 +106,33 @@ namespace CarRepairShopDatabaseImplement.Migrations
onDelete: ReferentialAction.Cascade); onDelete: ReferentialAction.Cascade);
}); });
migrationBuilder.CreateTable(
name: "ShopRepairs",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
RepairId = table.Column<int>(type: "int", nullable: false),
ShopId = table.Column<int>(type: "int", nullable: false),
Count = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ShopRepairs", x => x.Id);
table.ForeignKey(
name: "FK_ShopRepairs_Repairs_RepairId",
column: x => x.RepairId,
principalTable: "Repairs",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_ShopRepairs_Shops_ShopId",
column: x => x.ShopId,
principalTable: "Shops",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Orders_RepairId", name: "IX_Orders_RepairId",
table: "Orders", table: "Orders",
@@ -104,6 +147,16 @@ namespace CarRepairShopDatabaseImplement.Migrations
name: "IX_RepairOils_RepairId", name: "IX_RepairOils_RepairId",
table: "RepairOils", table: "RepairOils",
column: "RepairId"); column: "RepairId");
migrationBuilder.CreateIndex(
name: "IX_ShopRepairs_RepairId",
table: "ShopRepairs",
column: "RepairId");
migrationBuilder.CreateIndex(
name: "IX_ShopRepairs_ShopId",
table: "ShopRepairs",
column: "ShopId");
} }
/// <inheritdoc /> /// <inheritdoc />
@@ -115,11 +168,17 @@ namespace CarRepairShopDatabaseImplement.Migrations
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "RepairOils"); name: "RepairOils");
migrationBuilder.DropTable(
name: "ShopRepairs");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Oils"); name: "Oils");
migrationBuilder.DropTable( migrationBuilder.DropTable(
name: "Repairs"); name: "Repairs");
migrationBuilder.DropTable(
name: "Shops");
} }
} }
} }

View File

@@ -121,6 +121,59 @@ namespace CarRepairShopDatabaseImplement.Migrations
b.ToTable("RepairOils"); b.ToTable("RepairOils");
}); });
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Shop", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<string>("Address")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("DateOpening")
.HasColumnType("datetime2");
b.Property<int>("MaxCountRepairs")
.HasColumnType("int");
b.Property<string>("ShopName")
.IsRequired()
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("Shops");
});
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.ShopRepair", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("Id"));
b.Property<int>("Count")
.HasColumnType("int");
b.Property<int>("RepairId")
.HasColumnType("int");
b.Property<int>("ShopId")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("RepairId");
b.HasIndex("ShopId");
b.ToTable("ShopRepairs");
});
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Order", b => modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Order", b =>
{ {
b.HasOne("CarRepairShopDatabaseImplement.Models.Repair", "Repair") b.HasOne("CarRepairShopDatabaseImplement.Models.Repair", "Repair")
@@ -151,6 +204,25 @@ namespace CarRepairShopDatabaseImplement.Migrations
b.Navigation("Repair"); b.Navigation("Repair");
}); });
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.ShopRepair", b =>
{
b.HasOne("CarRepairShopDatabaseImplement.Models.Repair", "Repair")
.WithMany()
.HasForeignKey("RepairId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("CarRepairShopDatabaseImplement.Models.Shop", "Shop")
.WithMany("RepairsFk")
.HasForeignKey("ShopId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Repair");
b.Navigation("Shop");
});
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Oil", b => modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Oil", b =>
{ {
b.Navigation("RepairOils"); b.Navigation("RepairOils");
@@ -162,6 +234,11 @@ namespace CarRepairShopDatabaseImplement.Migrations
b.Navigation("Orders"); b.Navigation("Orders");
}); });
modelBuilder.Entity("CarRepairShopDatabaseImplement.Models.Shop", b =>
{
b.Navigation("RepairsFk");
});
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }
} }

View File

@@ -0,0 +1,109 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CarRepairShopDatabaseImplement.Models
{
public class Shop : IShopModel
{
public int Id { get; private set; }
[Required]
public string ShopName { get; private set; } = string.Empty;
[Required]
public string Address { get; private set; } = string.Empty;
[Required]
public DateTime DateOpening { get; private set; }
[Required]
public int MaxCountRepairs { get; private set; }
private Dictionary<int, (IRepairModel, int)>? _shopRepairs = null;
[NotMapped]
public Dictionary<int, (IRepairModel, int)> Repairs
{
get
{
if (_shopRepairs == null)
{
_shopRepairs = RepairsFk
.ToDictionary(recPC => recPC.RepairId, recPC => (recPC.Repair as IRepairModel, recPC.Count));
}
return _shopRepairs;
}
}
[ForeignKey("ShopId")]
public virtual List<ShopRepair> RepairsFk { get; set; } = new();
public static Shop Create(CarRepairShopDatabase context, ShopBindingModel model)
{
return new Shop()
{
Id = model.Id,
ShopName = model.ShopName,
Address = model.Address,
DateOpening = model.DateOpening,
MaxCountRepairs = model.MaxCountRepairs,
RepairsFk = model.Repairs.Select(x => new ShopRepair
{
Repair = context.Repairs.First(y => y.Id == x.Key),
Count = x.Value.Item2
}).ToList()
};
}
public void Update(ShopBindingModel model)
{
ShopName = model.ShopName;
Address = model.Address;
DateOpening = model.DateOpening;
MaxCountRepairs = model.MaxCountRepairs;
}
public ShopViewModel GetViewModel => new()
{
Id = Id,
ShopName = ShopName,
Address = Address,
DateOpening = DateOpening,
MaxCountRepairs = MaxCountRepairs,
Repairs = Repairs
};
public void UpdateRepairs(CarRepairShopDatabase context, ShopBindingModel model)
{
var shopRepairs = context.ShopRepairs.Where(rec => rec.ShopId == model.Id).ToList();
if (shopRepairs != null && shopRepairs.Count > 0)
{ // удалили те, которых нет в модели
context.ShopRepairs.RemoveRange(shopRepairs.Where(rec => !model.Repairs.ContainsKey(rec.RepairId)));
context.SaveChanges();
// обновили количество у существующих записей
foreach (var updateRepair in shopRepairs)
{
updateRepair.Count = model.Repairs[updateRepair.RepairId].Item2;
model.Repairs.Remove(updateRepair.RepairId);
}
context.SaveChanges();
}
var shop = context.Shops.First(x => x.Id == Id);
foreach (var ss in model.Repairs)
{
context.ShopRepairs.Add(new ShopRepair
{
Shop = shop,
Repair = context.Repairs.First(x => x.Id == ss.Key),
Count = ss.Value.Item2
});
context.SaveChanges();
}
_shopRepairs = null;
}
}
}

View File

@@ -0,0 +1,23 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace CarRepairShopDatabaseImplement.Models
{
public class ShopRepair
{
public int Id { get; set; }
[Required]
public int RepairId { get; set; }
[Required]
public int ShopId { get; set; }
[Required]
public int Count { get; set; }
public virtual Shop Shop { get; set; } = new();
public virtual Repair Repair { get; set; } = new();
}
}

View File

@@ -10,9 +10,11 @@ namespace CarRepairShopFileImplement
private readonly string OilFileName = "Oil.xml"; private readonly string OilFileName = "Oil.xml";
private readonly string OrderFileName = "Order.xml"; private readonly string OrderFileName = "Order.xml";
private readonly string RepairFileName = "Repair.xml"; private readonly string RepairFileName = "Repair.xml";
private readonly string ShopFileName = "Shop.xml";
public List<Oil> Oils { get; private set; } public List<Oil> Oils { get; private set; }
public List<Order> Orders { get; private set; } public List<Order> Orders { get; private set; }
public List<Repair> Repairs { get; private set; } public List<Repair> Repairs { get; private set; }
public List<Shop> Shops { get; private set; }
public static DataFileSingleton GetInstance() public static DataFileSingleton GetInstance()
{ {
if (instance == null) if (instance == null)
@@ -30,7 +32,8 @@ namespace CarRepairShopFileImplement
public void SaveOrders() => SaveData(Orders, OrderFileName, public void SaveOrders() => SaveData(Orders, OrderFileName,
"Orders", x => x.GetXElement); "Orders", x => x.GetXElement);
public void SaveShops() => SaveData(Shops, ShopFileName,
"Shops", x => x.GetXElement);
private DataFileSingleton() private DataFileSingleton()
{ {
Oils = LoadData(OilFileName, "Oil", x => Oils = LoadData(OilFileName, "Oil", x =>
@@ -39,6 +42,8 @@ namespace CarRepairShopFileImplement
Repair.Create(x)!)!; Repair.Create(x)!)!;
Orders = LoadData(OrderFileName, "Order", x => Orders = LoadData(OrderFileName, "Order", x =>
Order.Create(x)!)!; Order.Create(x)!)!;
Shops = LoadData(ShopFileName, "Shop", x =>
Shop.Create(x)!)!;
} }
private static List<T>? LoadData<T>(string filename, string xmlNodeName, private static List<T>? LoadData<T>(string filename, string xmlNodeName,

View File

@@ -49,13 +49,10 @@ namespace CarRepairShopFileImplement.Implements
private OrderViewModel GetViewModel(Order order) private OrderViewModel GetViewModel(Order order)
{ {
var viewModel = order.GetViewModel; var viewModel = order.GetViewModel;
foreach (var repair in source.Repairs) var repair = source.Repairs.FirstOrDefault(x => x.Id == order.RepairId);
if(repair != null)
{ {
if (repair.Id == order.RepairId) viewModel.RepairName = repair.RepairName;
{
viewModel.RepairName = repair.RepairName;
break;
}
} }
return viewModel; return viewModel;
} }

View File

@@ -0,0 +1,107 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.SearchModels;
using CarRepairShopContracts.StoragesContracts;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
using CarRepairShopFileImplement.Models;
namespace CarRepairShopFileImplement.Implements
{
public class ShopStorage : IShopStorage
{
private readonly DataFileSingleton source;
public ShopStorage()
{
source = DataFileSingleton.GetInstance();
}
public ShopViewModel? Delete(ShopBindingModel model)
{
var element = source.Shops.FirstOrDefault(x => x.Id == model.Id);
if (element != null)
{
source.Shops.Remove(element);
source.SaveShops();
return element.GetViewModel;
}
return null;
}
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
{
return null;
}
return source.Shops.FirstOrDefault(x =>
(!string.IsNullOrEmpty(model.ShopName) && x.ShopName ==
model.ShopName) || (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
}
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName))
{
return new();
}
return source.Shops.Where(x =>
x.ShopName.Contains(model.ShopName)).Select(x => x.GetViewModel).ToList();
}
public List<ShopViewModel> GetFullList()
{
return source.Shops.Select(x => x.GetViewModel).ToList();
}
public ShopViewModel? Insert(ShopBindingModel model)
{
model.Id = source.Shops.Count > 0 ? source.Shops.Max(x => x.Id) + 1 : 1;
var newShop = Shop.Create(model);
if (newShop == null)
{
return null;
}
source.Shops.Add(newShop);
source.SaveShops();
return newShop.GetViewModel;
}
public bool SellRepair(IRepairModel model, int count)
{
if (source.Shops.Select(x => x.Repairs.FirstOrDefault(y => y.Key == model.Id).Value.Item2).Sum() < count)
{
return false;
}
foreach (var shop in source.Shops.Where(x => x.Repairs.ContainsKey(model.Id)))
{
int countInCurrentShop = shop.Repairs[model.Id].Item2;
if (countInCurrentShop <= count)
{
shop.Repairs.Remove(model.Id);
count -= countInCurrentShop;
}
else
{
shop.Repairs[model.Id] = (shop.Repairs[model.Id].Item1, countInCurrentShop - count);
count = 0;
}
if (count == 0)
{
return true;
}
}
return false;
}
public ShopViewModel? Update(ShopBindingModel model)
{
var shop = source.Shops.FirstOrDefault(x => x.Id == model.Id);
if (shop == null)
{
return null;
}
shop.Update(model);
source.SaveShops();
return shop.GetViewModel;
}
}
}

View File

@@ -0,0 +1,108 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
using System.Xml.Linq;
namespace CarRepairShopFileImplement.Models
{
public class Shop : IShopModel
{
public string ShopName { get; private set; } = string.Empty;
public string Address { get; private set; } = string.Empty;
public DateTime DateOpening { get; private set; }
public Dictionary<int, int> CountRepairs
{
get;
private set;
} = new();
public Dictionary<int, (IRepairModel, int)> Repairs
{
get
{
if (_shopRepairs == null)
{
var source = DataFileSingleton.GetInstance();
_shopRepairs = CountRepairs.ToDictionary(x => x.Key,
y => ((source.Repairs.FirstOrDefault(z => z.Id == y.Key) as IRepairModel)!, y.Value));
}
return _shopRepairs;
}
}
public int MaxCountRepairs { get; private set; }
public int Id { get; private set; }
private Dictionary<int, (IRepairModel, int)>? _shopRepairs = null;
public static Shop? Create(ShopBindingModel? model)
{
if (model == null)
{
return null;
}
return new Shop()
{
Id = model.Id,
ShopName = model.ShopName,
Address = model.Address,
MaxCountRepairs = model.MaxCountRepairs,
DateOpening = model.DateOpening,
CountRepairs = model.Repairs.ToDictionary(x => x.Key, x => x.Value.Item2)
};
}
public static Shop? Create(XElement element)
{
if (element == null)
{
return null;
}
return new()
{
Id = Convert.ToInt32(element.Attribute("Id")!.Value),
ShopName = element.Element("ShopName")!.Value,
Address = element.Element("Address")!.Value,
DateOpening = Convert.ToDateTime(element.Element("DateOpening")!.Value),
MaxCountRepairs = Convert.ToInt32(element.Element("MaxCountRepairs")!.Value),
CountRepairs = element.Element("Repairs")!.Elements("Repair").ToDictionary(
x => Convert.ToInt32(x.Element("Key")?.Value),
x => Convert.ToInt32(x.Element("Value")?.Value))
};
}
public void Update(ShopBindingModel? model)
{
if (model == null)
{
return;
}
ShopName = model.ShopName;
Address = model.Address;
DateOpening = model.DateOpening;
MaxCountRepairs = model.MaxCountRepairs;
CountRepairs = model.Repairs.ToDictionary(x => x.Key, x => x.Value.Item2);
_shopRepairs = null;
}
public ShopViewModel GetViewModel => new()
{
Id = Id,
ShopName = ShopName,
Address = Address,
Repairs = Repairs,
DateOpening = DateOpening,
MaxCountRepairs = MaxCountRepairs,
};
public XElement GetXElement => new("Shop",
new XAttribute("Id", Id),
new XElement("ShopName", ShopName),
new XElement("Address", Address),
new XElement("DateOpening", DateOpening),
new XElement("MaxCountRepairs", MaxCountRepairs),
new XElement("Repairs", CountRepairs
.Select(x => new XElement("Repair",
new XElement("Key", x.Key),
new XElement("Value", x.Value))
).ToArray()));
}
}

View File

@@ -9,11 +9,13 @@ namespace CarRepairShopListImplement
public List<Oil> Oils { get; set; } public List<Oil> Oils { get; set; }
public List<Order> Orders { get; set; } public List<Order> Orders { get; set; }
public List<Repair> Repairs { get; set; } public List<Repair> Repairs { get; set; }
public List<Shop> Shops { get; set; }
private DataListSingleton() private DataListSingleton()
{ {
Oils = new List<Oil>(); Oils = new List<Oil>();
Orders = new List<Order>(); Orders = new List<Order>();
Repairs = new List<Repair>(); Repairs = new List<Repair>();
Shops = new List<Shop>();
} }
public static DataListSingleton GetInstance() public static DataListSingleton GetInstance()
{ {

View File

@@ -0,0 +1,114 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.SearchModels;
using CarRepairShopContracts.StoragesContracts;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
using CarRepairShopListImplement.Models;
namespace CarRepairShopListImplement.Implements
{
public class ShopStorage : IShopStorage
{
private readonly DataListSingleton _source;
public ShopStorage()
{
_source = DataListSingleton.GetInstance();
}
public ShopViewModel? Delete(ShopBindingModel model)
{
for (int i = 0; i < _source.Shops.Count; ++i)
{
if (_source.Shops[i].Id == model.Id)
{
var element = _source.Shops[i];
_source.Shops.RemoveAt(i);
return element.GetViewModel;
}
}
return null;
}
public ShopViewModel? GetElement(ShopSearchModel model)
{
if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
{
return null;
}
foreach (var shop in _source.Shops)
{
if ((!string.IsNullOrEmpty(model.ShopName) &&
shop.ShopName == model.ShopName) ||
(model.Id.HasValue && shop.Id == model.Id))
{
return shop.GetViewModel;
}
}
return null;
}
public List<ShopViewModel> GetFilteredList(ShopSearchModel model)
{
var result = new List<ShopViewModel>();
if (string.IsNullOrEmpty(model.ShopName))
{
return result;
}
foreach (var shop in _source.Shops)
{
if (shop.ShopName.Contains(model.ShopName ?? string.Empty))
{
result.Add(shop.GetViewModel);
}
}
return result;
}
public List<ShopViewModel> GetFullList()
{
var result = new List<ShopViewModel>();
foreach (var shop in _source.Shops)
{
result.Add(shop.GetViewModel);
}
return result;
}
public ShopViewModel? Insert(ShopBindingModel model)
{
model.Id = 1;
foreach (var shop in _source.Shops)
{
if (model.Id <= shop.Id)
{
model.Id = shop.Id + 1;
}
}
var newShop = Shop.Create(model);
if (newShop == null)
{
return null;
}
_source.Shops.Add(newShop);
return newShop.GetViewModel;
}
public bool SellRepair(IRepairModel model, int count)
{
throw new NotImplementedException();
}
public ShopViewModel? Update(ShopBindingModel model)
{
foreach (var shop in _source.Shops)
{
if (shop.Id == model.Id)
{
shop.Update(model);
return shop.GetViewModel;
}
}
return null;
}
}
}

View File

@@ -0,0 +1,57 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.ViewModels;
using CarRepairShopDataModels.Models;
namespace CarRepairShopListImplement.Models
{
public class Shop : IShopModel
{
public string ShopName { get; private set; } = string.Empty;
public string Address { get; private set; } = string.Empty;
public DateTime DateOpening { get; private set; }
public Dictionary<int, (IRepairModel, int)> Repairs { get; private set; } = new();
public int Id { get; private set; }
public static Shop? Create(ShopBindingModel? model)
{
if (model == null)
{
return null;
}
return new Shop()
{
Id = model.Id,
ShopName = model.ShopName,
Address = model.Address,
DateOpening = model.DateOpening,
Repairs = new()
};
}
public void Update(ShopBindingModel? model)
{
if (model == null)
{
return;
}
ShopName = model.ShopName;
Address = model.Address;
DateOpening = model.DateOpening;
Repairs = model.Repairs;
}
public ShopViewModel GetViewModel => new()
{
Id = Id,
ShopName = ShopName,
Address = Address,
Repairs = Repairs,
DateOpening = DateOpening,
};
public int MaxCountRepairs => throw new NotImplementedException();
}
}

View File

@@ -38,11 +38,17 @@
this.ToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton(); this.ToolStripDropDownButton = new System.Windows.Forms.ToolStripDropDownButton();
this.OilsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.OilsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.RepairsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.RepairsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ShopsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ButtonAddRepairInShop = new System.Windows.Forms.ToolStripButton();
this.ButtonSellRepair = new System.Windows.Forms.ToolStripButton();
this.DataGridView = new System.Windows.Forms.DataGridView();
this.toolStripSplitButtonReports = new System.Windows.Forms.ToolStripSplitButton(); this.toolStripSplitButtonReports = new System.Windows.Forms.ToolStripSplitButton();
this.OilToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.RepairToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.OilRepairToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.OilRepairToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.OrdersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.OrdersToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.DataGridView = new System.Windows.Forms.DataGridView(); this.ShopsListStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.ShopsRepairsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.OrdersGroupDateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1.SuspendLayout(); this.toolStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.DataGridView)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.DataGridView)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
@@ -102,6 +108,8 @@
this.toolStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.toolStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.ToolStripDropDownButton, this.ToolStripDropDownButton,
this.ButtonAddRepairInShop,
this.ButtonSellRepair,
this.toolStripSplitButtonReports}); this.toolStripSplitButtonReports});
this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Location = new System.Drawing.Point(0, 0);
this.toolStrip1.Name = "toolStrip1"; this.toolStrip1.Name = "toolStrip1";
@@ -114,7 +122,8 @@
this.ToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.ToolStripDropDownButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.ToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ToolStripDropDownButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.OilsToolStripMenuItem, this.OilsToolStripMenuItem,
this.RepairsToolStripMenuItem}); this.RepairsToolStripMenuItem,
this.ShopsToolStripMenuItem});
this.ToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta; this.ToolStripDropDownButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.ToolStripDropDownButton.Name = "ToolStripDropDownButton"; this.ToolStripDropDownButton.Name = "ToolStripDropDownButton";
this.ToolStripDropDownButton.Size = new System.Drawing.Size(117, 24); this.ToolStripDropDownButton.Size = new System.Drawing.Size(117, 24);
@@ -123,50 +132,43 @@
// OilsToolStripMenuItem // OilsToolStripMenuItem
// //
this.OilsToolStripMenuItem.Name = "OilsToolStripMenuItem"; this.OilsToolStripMenuItem.Name = "OilsToolStripMenuItem";
this.OilsToolStripMenuItem.Size = new System.Drawing.Size(193, 26); this.OilsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
this.OilsToolStripMenuItem.Text = "Масла"; this.OilsToolStripMenuItem.Text = "Масла";
this.OilsToolStripMenuItem.Click += new System.EventHandler(this.OilsToolStripMenuItem_Click); this.OilsToolStripMenuItem.Click += new System.EventHandler(this.OilsToolStripMenuItem_Click);
// //
// RepairsToolStripMenuItem // RepairsToolStripMenuItem
// //
this.RepairsToolStripMenuItem.Name = "RepairsToolStripMenuItem"; this.RepairsToolStripMenuItem.Name = "RepairsToolStripMenuItem";
this.RepairsToolStripMenuItem.Size = new System.Drawing.Size(193, 26); this.RepairsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
this.RepairsToolStripMenuItem.Text = "Виды ремонта"; this.RepairsToolStripMenuItem.Text = "Виды ремонта";
this.RepairsToolStripMenuItem.Click += new System.EventHandler(this.RepairsToolStripMenuItem_Click); this.RepairsToolStripMenuItem.Click += new System.EventHandler(this.RepairsToolStripMenuItem_Click);
// //
// toolStripSplitButtonReports // ShopsToolStripMenuItem
// //
this.toolStripSplitButtonReports.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; this.ShopsToolStripMenuItem.Name = "ShopsToolStripMenuItem";
this.toolStripSplitButtonReports.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ShopsToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
this.OilToolStripMenuItem, this.ShopsToolStripMenuItem.Text = "Магазины";
this.OilRepairToolStripMenuItem, this.ShopsToolStripMenuItem.Click += new System.EventHandler(this.ShopsToolStripMenuItem_Click);
this.OrdersToolStripMenuItem});
this.toolStripSplitButtonReports.Image = ((System.Drawing.Image)(resources.GetObject("toolStripSplitButtonReports.Image")));
this.toolStripSplitButtonReports.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripSplitButtonReports.Name = "toolStripSplitButtonReports";
this.toolStripSplitButtonReports.Size = new System.Drawing.Size(78, 24);
this.toolStripSplitButtonReports.Text = "Отчёты";
// //
// OilToolStripMenuItem // ButtonAddRepairInShop
// //
this.OilToolStripMenuItem.Name = "OilToolStripMenuItem"; this.ButtonAddRepairInShop.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.OilToolStripMenuItem.Size = new System.Drawing.Size(233, 26); this.ButtonAddRepairInShop.Image = ((System.Drawing.Image)(resources.GetObject("ButtonAddRepairInShop.Image")));
this.OilToolStripMenuItem.Text = "Список масел"; this.ButtonAddRepairInShop.ImageTransparentColor = System.Drawing.Color.Magenta;
this.OilToolStripMenuItem.Click += new System.EventHandler(this.OilToolStripMenuItem_Click); this.ButtonAddRepairInShop.Name = "ButtonAddRepairInShop";
this.ButtonAddRepairInShop.Size = new System.Drawing.Size(172, 24);
this.ButtonAddRepairInShop.Text = "Пополнение магазина";
this.ButtonAddRepairInShop.Click += new System.EventHandler(this.ButtonAddRepairInShop_Click);
// //
// OilRepairToolStripMenuItem // ButtonSellRepair
// //
this.OilRepairToolStripMenuItem.Name = "OilRepairToolStripMenuItem"; this.ButtonSellRepair.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.OilRepairToolStripMenuItem.Size = new System.Drawing.Size(233, 26); this.ButtonSellRepair.Image = ((System.Drawing.Image)(resources.GetObject("ButtonSellRepair.Image")));
this.OilRepairToolStripMenuItem.Text = "Масла по ремонтам"; this.ButtonSellRepair.ImageTransparentColor = System.Drawing.Color.Magenta;
this.OilRepairToolStripMenuItem.Click += new System.EventHandler(this.OilRepairToolStripMenuItem_Click); this.ButtonSellRepair.Name = "ButtonSellRepair";
// this.ButtonSellRepair.Size = new System.Drawing.Size(141, 24);
// OrdersToolStripMenuItem this.ButtonSellRepair.Text = "Продажа ремонта";
// this.ButtonSellRepair.Click += new System.EventHandler(this.ButtonSellRepair_Click);
this.OrdersToolStripMenuItem.Name = "OrdersToolStripMenuItem";
this.OrdersToolStripMenuItem.Size = new System.Drawing.Size(233, 26);
this.OrdersToolStripMenuItem.Text = "Список заказов";
this.OrdersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click);
// //
// DataGridView // DataGridView
// //
@@ -179,6 +181,64 @@
this.DataGridView.Size = new System.Drawing.Size(809, 455); this.DataGridView.Size = new System.Drawing.Size(809, 455);
this.DataGridView.TabIndex = 7; this.DataGridView.TabIndex = 7;
// //
// toolStripSplitButtonReports
//
this.toolStripSplitButtonReports.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.toolStripSplitButtonReports.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.RepairToolStripMenuItem,
this.OilRepairToolStripMenuItem,
this.OrdersToolStripMenuItem,
this.ShopsListStripMenuItem,
this.ShopsRepairsToolStripMenuItem,
this.OrdersGroupDateToolStripMenuItem});
this.toolStripSplitButtonReports.Image = ((System.Drawing.Image)(resources.GetObject("toolStripSplitButtonReports.Image")));
this.toolStripSplitButtonReports.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripSplitButtonReports.Name = "toolStripSplitButtonReports";
this.toolStripSplitButtonReports.Size = new System.Drawing.Size(78, 24);
this.toolStripSplitButtonReports.Text = "Отчёты";
//
// RepairToolStripMenuItem
//
this.RepairToolStripMenuItem.Name = "RepairToolStripMenuItem";
this.RepairToolStripMenuItem.Size = new System.Drawing.Size(267, 26);
this.RepairToolStripMenuItem.Text = "Список ремонтов";
this.RepairToolStripMenuItem.Click += new System.EventHandler(this.RepairToolStripMenuItem_Click);
//
// OilRepairToolStripMenuItem
//
this.OilRepairToolStripMenuItem.Name = "OilRepairToolStripMenuItem";
this.OilRepairToolStripMenuItem.Size = new System.Drawing.Size(267, 26);
this.OilRepairToolStripMenuItem.Text = "Масла по ремонтам";
this.OilRepairToolStripMenuItem.Click += new System.EventHandler(this.OilRepairToolStripMenuItem_Click_1);
//
// OrdersToolStripMenuItem
//
this.OrdersToolStripMenuItem.Name = "OrdersToolStripMenuItem";
this.OrdersToolStripMenuItem.Size = new System.Drawing.Size(267, 26);
this.OrdersToolStripMenuItem.Text = "Список заказов";
this.OrdersToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click_1);
//
// ShopsListStripMenuItem
//
this.ShopsListStripMenuItem.Name = "ShopsListStripMenuItem";
this.ShopsListStripMenuItem.Size = new System.Drawing.Size(267, 26);
this.ShopsListStripMenuItem.Text = "Список магазинов";
this.ShopsListStripMenuItem.Click += new System.EventHandler(this.ShopsListStripMenuItem_Click);
//
// ShopsRepairsToolStripMenuItem
//
this.ShopsRepairsToolStripMenuItem.Name = "ShopsRepairsToolStripMenuItem";
this.ShopsRepairsToolStripMenuItem.Size = new System.Drawing.Size(267, 26);
this.ShopsRepairsToolStripMenuItem.Text = "Ремонты в магазинах";
this.ShopsRepairsToolStripMenuItem.Click += new System.EventHandler(this.ShopsRepairsToolStripMenuItem_Click);
//
// OrdersGroupDateToolStripMenuItem
//
this.OrdersGroupDateToolStripMenuItem.Name = "OrdersGroupDateToolStripMenuItem";
this.OrdersGroupDateToolStripMenuItem.Size = new System.Drawing.Size(267, 26);
this.OrdersGroupDateToolStripMenuItem.Text = "Список заказов по датам";
this.OrdersGroupDateToolStripMenuItem.Click += new System.EventHandler(this.OrdersGroupDateToolStripMenuItem_Click);
//
// FormMain // FormMain
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
@@ -213,9 +273,15 @@
private ToolStripMenuItem OilsToolStripMenuItem; private ToolStripMenuItem OilsToolStripMenuItem;
private ToolStripMenuItem RepairsToolStripMenuItem; private ToolStripMenuItem RepairsToolStripMenuItem;
private DataGridView DataGridView; private DataGridView DataGridView;
private ToolStripMenuItem ShopsToolStripMenuItem;
private ToolStripButton ButtonAddRepairInShop;
private ToolStripButton ButtonSellRepair;
private ToolStripSplitButton toolStripSplitButtonReports; private ToolStripSplitButton toolStripSplitButtonReports;
private ToolStripMenuItem OilToolStripMenuItem; private ToolStripMenuItem RepairToolStripMenuItem;
private ToolStripMenuItem OilRepairToolStripMenuItem; private ToolStripMenuItem OilRepairToolStripMenuItem;
private ToolStripMenuItem OrdersToolStripMenuItem; private ToolStripMenuItem OrdersToolStripMenuItem;
private ToolStripMenuItem ShopsListStripMenuItem;
private ToolStripMenuItem ShopsRepairsToolStripMenuItem;
private ToolStripMenuItem OrdersGroupDateToolStripMenuItem;
} }
} }

View File

@@ -159,6 +159,34 @@ namespace CarRepairShopView
LoadData(); LoadData();
} }
private void ShopsToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormShops));
if(service is FormShops form)
{
form.ShowDialog();
}
}
private void ButtonAddRepairInShop_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormShopRepairs));
if (service is FormShopRepairs form)
{
form.ShowDialog();
}
}
private void ButtonSellRepair_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormSellRepair));
if (service is FormSellRepair form)
{
form.ShowDialog();
LoadData();
}
}
private void OilToolStripMenuItem_Click(object sender, EventArgs e) private void OilToolStripMenuItem_Click(object sender, EventArgs e)
{ {
using var dialog = new SaveFileDialog { Filter = "docx|*.docx" }; using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
@@ -191,5 +219,61 @@ namespace CarRepairShopView
} }
} }
private void RepairToolStripMenuItem_Click(object sender, EventArgs e)
{
using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
if (dialog.ShowDialog() == DialogResult.OK)
{
_reportLogic.SaveOilsToWordFile(new ReportBindingModel { FileName = dialog.FileName });
MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void OilRepairToolStripMenuItem_Click_1(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormReportRepairOils));
if (service is FormReportRepairOils form)
{
form.ShowDialog();
}
}
private void OrdersToolStripMenuItem_Click_1(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders));
if (service is FormReportOrders form)
{
form.ShowDialog();
}
}
private void ShopsListStripMenuItem_Click(object sender, EventArgs e)
{
using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
if (dialog.ShowDialog() == DialogResult.OK)
{
_reportLogic.SaveShopsToWordFile(new ReportBindingModel { FileName = dialog.FileName });
MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void ShopsRepairsToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormReportShopRepairs));
if (service is FormReportShopRepairs form)
{
form.ShowDialog();
}
}
private void OrdersGroupDateToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormReportOrdersGroupDate));
if (service is FormReportOrdersGroupDate form)
{
form.ShowDialog();
}
}
} }
} }

View File

@@ -61,7 +61,7 @@
<value>17, 17</value> <value>17, 17</value>
</metadata> </metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="toolStripSplitButtonReports.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="ButtonAddRepairInShop.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEKSURBVEhL3ZG9DsFQHMXvczDZvIOtXsHObuhqkViI3Quw YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEKSURBVEhL3ZG9DsFQHMXvczDZvIOtXsHObuhqkViI3Quw
@@ -70,6 +70,28 @@
U87f4aUApcXhnrI9Jzg/laQKFntXlHM+lSQK5psL5fvbp/JvJLGCQqmSWM5JkiCT84igXGtSrruKLQ0T U87f4aUApcXhnrI9Jzg/laQKFntXlHM+lSQK5psL5fvbp/JvJLGCQqmSWM5JkiCT84igXGtSrruKLQ0T
luAdmZxHBG37FFuWBC/j5XKOmX8WAH7rcI6ZMffPgjQwN2bXJgDo/COBTpjneQ2dML0PY3cISreGe8HM luAdmZxHBG37FFuWBC/j5XKOmX8WAH7rcI6ZMffPgjQwN2bXJgDo/COBTpjneQ2dML0PY3cISreGe8HM
qgAAAABJRU5ErkJggg== qgAAAABJRU5ErkJggg==
</value>
</data>
<data name="ButtonSellRepair.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEKSURBVEhL3ZG9DsFQHMXvczDZvIOtXsHObuhqkViI3Quw
6CYmNoMYJJ0NBiFFIoIytOuf0+TeXP3yde+iyS+3OcP53Z4y3/dJJ4HAsiwyTVMp6BQCBIZhKAWdEcHV
vSlBmeB82NFy1KLluEWOPRC5MoHdMWhazwi4RJlALgf4EuT6BI+5kCsTrGddUY658E+QvyXYHq9UnRyC
U87f4aUApcXhnrI9Jzg/laQKFntXlHM+lSQK5psL5fvbp/JvJLGCQqmSWM5JkiCT84igXGtSrruKLQ0T
luAdmZxHBG37FFuWBC/j5XKOmX8WAH7rcI6ZMffPgjQwN2bXJgDo/COBTpjneQ2dML0PY3cISreGe8HM
qgAAAABJRU5ErkJggg==
</value>
</data>
<data name="toolStripSplitButtonReports.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEISURBVEhL3ZErDsJAGIR7DlA47oArV8CDR9RiSDAQPBcA
Qx1BgUMQBEk1ooJAKE0I4Wlqf5gmu1n6oqW7hiZfthkx33aqeZ5HKvEFpmmSYRhSQScXINB1XSroDAke
96cUpAmupyPZsx7Z8x4drAnPpQmsgU7LdoHDJNIEYjnAlyBXJ3jPhVyaYLca8nLMhX+CPJXAOT+ouTj5
p5in4asApdWpS8XRwT+zShIFG/fOyxlZJbGC9f5G5bHzUf6LJFJQqTViyxlxEmRiHhLUW10qDbeRpUGC
ErwjE/OQoG9dIsviYGWsXMwxc24BYLcO5pgZc+cWJIG5MbsyAUDnHwlUAkFHJZraR9NeMVq3zi+WF/0A
AAAASUVORK5CYII=
</value> </value>
</data> </data>
</root> </root>

View File

@@ -29,12 +29,12 @@
private void InitializeComponent() private void InitializeComponent()
{ {
this.panel = new System.Windows.Forms.Panel(); this.panel = new System.Windows.Forms.Panel();
this.dateTimePickerFrom = new System.Windows.Forms.DateTimePicker(); this.LabelTo = new System.Windows.Forms.Label();
this.dateTimePickerTo = new System.Windows.Forms.DateTimePicker();
this.ButtonMake = new System.Windows.Forms.Button();
this.ButtonToPdf = new System.Windows.Forms.Button(); this.ButtonToPdf = new System.Windows.Forms.Button();
this.LabelFrom = new System.Windows.Forms.Label(); this.LabelFrom = new System.Windows.Forms.Label();
this.LabelTo = new System.Windows.Forms.Label(); this.ButtonMake = new System.Windows.Forms.Button();
this.dateTimePickerTo = new System.Windows.Forms.DateTimePicker();
this.dateTimePickerFrom = new System.Windows.Forms.DateTimePicker();
this.panel.SuspendLayout(); this.panel.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
@@ -51,29 +51,14 @@
this.panel.Size = new System.Drawing.Size(1043, 43); this.panel.Size = new System.Drawing.Size(1043, 43);
this.panel.TabIndex = 0; this.panel.TabIndex = 0;
// //
// dateTimePickerFrom // LabelTo
// //
this.dateTimePickerFrom.Location = new System.Drawing.Point(39, 8); this.LabelTo.AutoSize = true;
this.dateTimePickerFrom.Name = "dateTimePickerFrom"; this.LabelTo.Location = new System.Drawing.Point(295, 13);
this.dateTimePickerFrom.Size = new System.Drawing.Size(250, 27); this.LabelTo.Name = "LabelTo";
this.dateTimePickerFrom.TabIndex = 0; this.LabelTo.Size = new System.Drawing.Size(27, 20);
// this.LabelTo.TabIndex = 5;
// dateTimePickerTo this.LabelTo.Text = "по";
//
this.dateTimePickerTo.Location = new System.Drawing.Point(328, 8);
this.dateTimePickerTo.Name = "dateTimePickerTo";
this.dateTimePickerTo.Size = new System.Drawing.Size(250, 27);
this.dateTimePickerTo.TabIndex = 1;
//
// ButtonMake
//
this.ButtonMake.Location = new System.Drawing.Point(654, 8);
this.ButtonMake.Name = "ButtonMake";
this.ButtonMake.Size = new System.Drawing.Size(127, 29);
this.ButtonMake.TabIndex = 2;
this.ButtonMake.Text = "Сформировать";
this.ButtonMake.UseVisualStyleBackColor = true;
this.ButtonMake.Click += new System.EventHandler(this.ButtonMake_Click);
// //
// ButtonToPdf // ButtonToPdf
// //
@@ -94,20 +79,35 @@
this.LabelFrom.TabIndex = 4; this.LabelFrom.TabIndex = 4;
this.LabelFrom.Text = "С"; this.LabelFrom.Text = "С";
// //
// LabelTo // ButtonMake
// //
this.LabelTo.AutoSize = true; this.ButtonMake.Location = new System.Drawing.Point(654, 8);
this.LabelTo.Location = new System.Drawing.Point(295, 13); this.ButtonMake.Name = "ButtonMake";
this.LabelTo.Name = "LabelTo"; this.ButtonMake.Size = new System.Drawing.Size(127, 29);
this.LabelTo.Size = new System.Drawing.Size(27, 20); this.ButtonMake.TabIndex = 2;
this.LabelTo.TabIndex = 5; this.ButtonMake.Text = "Сформировать";
this.LabelTo.Text = "по"; this.ButtonMake.UseVisualStyleBackColor = true;
this.ButtonMake.Click += new System.EventHandler(this.ButtonMake_Click);
//
// dateTimePickerTo
//
this.dateTimePickerTo.Location = new System.Drawing.Point(328, 8);
this.dateTimePickerTo.Name = "dateTimePickerTo";
this.dateTimePickerTo.Size = new System.Drawing.Size(250, 27);
this.dateTimePickerTo.TabIndex = 1;
//
// dateTimePickerFrom
//
this.dateTimePickerFrom.Location = new System.Drawing.Point(39, 8);
this.dateTimePickerFrom.Name = "dateTimePickerFrom";
this.dateTimePickerFrom.Size = new System.Drawing.Size(250, 27);
this.dateTimePickerFrom.TabIndex = 0;
// //
// FormReportOrders // FormReportOrders
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1043, 450); this.ClientSize = new System.Drawing.Size(1043, 595);
this.Controls.Add(this.panel); this.Controls.Add(this.panel);
this.Name = "FormReportOrders"; this.Name = "FormReportOrders";
this.Text = "Заказы"; this.Text = "Заказы";

View File

@@ -0,0 +1,85 @@
namespace CarRepairShopView
{
partial class FormReportOrdersGroupDate
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.panel = new System.Windows.Forms.Panel();
this.buttonCreate = new System.Windows.Forms.Button();
this.buttonToPdf = new System.Windows.Forms.Button();
this.panel.SuspendLayout();
this.SuspendLayout();
//
// panel
//
this.panel.Controls.Add(this.buttonToPdf);
this.panel.Controls.Add(this.buttonCreate);
this.panel.Location = new System.Drawing.Point(0, 0);
this.panel.Name = "panel";
this.panel.Size = new System.Drawing.Size(1130, 50);
this.panel.TabIndex = 0;
//
// buttonCreate
//
this.buttonCreate.Location = new System.Drawing.Point(12, 12);
this.buttonCreate.Name = "buttonCreate";
this.buttonCreate.Size = new System.Drawing.Size(198, 29);
this.buttonCreate.TabIndex = 0;
this.buttonCreate.Text = "Создать";
this.buttonCreate.UseVisualStyleBackColor = true;
this.buttonCreate.Click += new System.EventHandler(this.buttonCreate_Click);
//
// buttonToPdf
//
this.buttonToPdf.Location = new System.Drawing.Point(921, 12);
this.buttonToPdf.Name = "buttonToPdf";
this.buttonToPdf.Size = new System.Drawing.Size(198, 29);
this.buttonToPdf.TabIndex = 1;
this.buttonToPdf.Text = "В Pdf";
this.buttonToPdf.UseVisualStyleBackColor = true;
this.buttonToPdf.Click += new System.EventHandler(this.buttonToPdf_Click);
//
// FormReportOrdersGroupDate
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1131, 644);
this.Controls.Add(this.panel);
this.Name = "FormReportOrdersGroupDate";
this.Text = "Группировка заказов по дате";
this.panel.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private Panel panel;
private Button buttonToPdf;
private Button buttonCreate;
}
}

View File

@@ -0,0 +1,70 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.BusinessLogicsContracts;
using Microsoft.Extensions.Logging;
using Microsoft.Reporting.WinForms;
namespace CarRepairShopView
{
public partial class FormReportOrdersGroupDate : Form
{
private readonly ReportViewer reportViewer;
private readonly ILogger _logger;
private readonly IReportLogic _logic;
public FormReportOrdersGroupDate(ILogger<FormReportOrdersGroupDate> logger, IReportLogic logic)
{
InitializeComponent();
_logger = logger;
_logic = logic;
reportViewer = new ReportViewer
{
Dock = DockStyle.Fill
};
reportViewer.LocalReport.LoadReportDefinition(new FileStream("D:\\CarRepairShop\\CarRepairShop\\CarRepairShopView\\ReportOrdersGroupDate.rdlc", FileMode.Open));
Controls.Clear();
Controls.Add(panel);
Controls.Add(reportViewer);
}
private void buttonCreate_Click(object sender, EventArgs e)
{
try
{
var dataSource = _logic.GetOrdersGroupDate();
var source = new ReportDataSource("DataSetOrders", dataSource);
reportViewer.LocalReport.DataSources.Clear();
reportViewer.LocalReport.DataSources.Add(source);
reportViewer.RefreshReport();
_logger.LogInformation("Загрузка списка заказов, сгруппированных по дате");
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка загрузки списка заказов, сгруппированных по дате");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonToPdf_Click(object sender, EventArgs e)
{
using var dialog = new SaveFileDialog { Filter = "pdf|*.pdf" };
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
_logic.SaveOrdersGroupDateToPdfFile(new ReportBindingModel
{
FileName = dialog.FileName
});
_logger.LogInformation("Сохранение списка заказов");
MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка сохранения списка заказов");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<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>
</root>

View File

@@ -0,0 +1,107 @@
namespace CarRepairShopView
{
partial class FormReportShopRepairs
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dataGridView = new System.Windows.Forms.DataGridView();
this.ButtonSaveToExcel = new System.Windows.Forms.Button();
this.ColumnShop = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnRepair = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnCount = new System.Windows.Forms.DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
this.SuspendLayout();
//
// dataGridView
//
this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ColumnShop,
this.ColumnRepair,
this.ColumnCount});
this.dataGridView.Location = new System.Drawing.Point(12, 12);
this.dataGridView.Name = "dataGridView";
this.dataGridView.RowHeadersWidth = 51;
this.dataGridView.RowTemplate.Height = 29;
this.dataGridView.Size = new System.Drawing.Size(487, 372);
this.dataGridView.TabIndex = 0;
//
// ButtonSaveToExcel
//
this.ButtonSaveToExcel.Location = new System.Drawing.Point(155, 390);
this.ButtonSaveToExcel.Name = "ButtonSaveToExcel";
this.ButtonSaveToExcel.Size = new System.Drawing.Size(183, 48);
this.ButtonSaveToExcel.TabIndex = 1;
this.ButtonSaveToExcel.Text = "Сохранить в Excel";
this.ButtonSaveToExcel.UseVisualStyleBackColor = true;
this.ButtonSaveToExcel.Click += new System.EventHandler(this.ButtonSaveToExcel_Click);
//
// ColumnShop
//
this.ColumnShop.HeaderText = "Магазин";
this.ColumnShop.MinimumWidth = 6;
this.ColumnShop.Name = "ColumnShop";
this.ColumnShop.Width = 125;
//
// ColumnRepair
//
this.ColumnRepair.HeaderText = "Вид ремонта";
this.ColumnRepair.MinimumWidth = 6;
this.ColumnRepair.Name = "ColumnRepair";
this.ColumnRepair.Width = 125;
//
// ColumnCount
//
this.ColumnCount.HeaderText = "Количество";
this.ColumnCount.MinimumWidth = 6;
this.ColumnCount.Name = "ColumnCount";
this.ColumnCount.Width = 125;
//
// FormReportShopRepairs
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(514, 450);
this.Controls.Add(this.ButtonSaveToExcel);
this.Controls.Add(this.dataGridView);
this.Name = "FormReportShopRepairs";
this.Text = "Магазины с ремонтами";
this.Load += new System.EventHandler(this.FormReportShopRepairs_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private DataGridView dataGridView;
private DataGridViewTextBoxColumn ColumnShop;
private DataGridViewTextBoxColumn ColumnRepair;
private DataGridViewTextBoxColumn ColumnCount;
private Button ButtonSaveToExcel;
}
}

View File

@@ -0,0 +1,78 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.BusinessLogicsContracts;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarRepairShopView
{
public partial class FormReportShopRepairs : Form
{
private readonly ILogger _logger;
private readonly IReportLogic _logic;
public FormReportShopRepairs(ILogger<FormReportShopRepairs> logger, IReportLogic logic)
{
InitializeComponent();
_logger = logger;
_logic = logic;
}
private void FormReportShopRepairs_Load(object sender, EventArgs e)
{
try
{
var dict = _logic.GetShopRepairs();
if (dict != null)
{
dataGridView.Rows.Clear();
foreach (var elem in dict)
{
dataGridView.Rows.Add(new object[] { elem.ShopName, "", "" });
foreach (var listElem in elem.Repairs)
{
dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 });
}
dataGridView.Rows.Add(new object[] { "Итого", "", elem.TotalCount });
dataGridView.Rows.Add(Array.Empty<object>());
}
}
_logger.LogInformation("Загрузка списка магазинов с ремонтами");
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка загрузки списка магазинов с ремонтами");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ButtonSaveToExcel_Click(object sender, EventArgs e)
{
using var dialog = new SaveFileDialog { Filter = "xlsx|*.xlsx" };
if (dialog.ShowDialog() == DialogResult.OK)
{
try
{
_logic.SaveShopRepairsToExcelFile(new ReportBindingModel
{
FileName = dialog.FileName
});
_logger.LogInformation("Сохранение списка магазинов с ремонтами");
MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка сохранения списка магазинов с ремонтами");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}

View File

@@ -0,0 +1,78 @@
<root>
<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>
<metadata name="ColumnShop.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnRepair.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnShop.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnRepair.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -0,0 +1,120 @@
namespace CarRepairShopView
{
partial class FormSellRepair
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.labelRepair = new System.Windows.Forms.Label();
this.labelCount = new System.Windows.Forms.Label();
this.comboBoxRepair = new System.Windows.Forms.ComboBox();
this.textBoxCount = new System.Windows.Forms.TextBox();
this.buttonSave = new System.Windows.Forms.Button();
this.buttonCancel = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// labelRepair
//
this.labelRepair.AutoSize = true;
this.labelRepair.Location = new System.Drawing.Point(21, 28);
this.labelRepair.Name = "labelRepair";
this.labelRepair.Size = new System.Drawing.Size(67, 20);
this.labelRepair.TabIndex = 0;
this.labelRepair.Text = "Ремонт :";
//
// labelCount
//
this.labelCount.AutoSize = true;
this.labelCount.Location = new System.Drawing.Point(21, 94);
this.labelCount.Name = "labelCount";
this.labelCount.Size = new System.Drawing.Size(97, 20);
this.labelCount.TabIndex = 1;
this.labelCount.Text = "Количество :";
//
// comboBoxRepair
//
this.comboBoxRepair.FormattingEnabled = true;
this.comboBoxRepair.Location = new System.Drawing.Point(137, 20);
this.comboBoxRepair.Name = "comboBoxRepair";
this.comboBoxRepair.Size = new System.Drawing.Size(151, 28);
this.comboBoxRepair.TabIndex = 2;
//
// textBoxCount
//
this.textBoxCount.Location = new System.Drawing.Point(163, 87);
this.textBoxCount.Name = "textBoxCount";
this.textBoxCount.Size = new System.Drawing.Size(125, 27);
this.textBoxCount.TabIndex = 3;
//
// buttonSave
//
this.buttonSave.Location = new System.Drawing.Point(21, 145);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(130, 29);
this.buttonSave.TabIndex = 4;
this.buttonSave.Text = "Сохранить";
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
//
// buttonCancel
//
this.buttonCancel.Location = new System.Drawing.Point(163, 145);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(135, 29);
this.buttonCancel.TabIndex = 5;
this.buttonCancel.Text = "Отмена";
this.buttonCancel.UseVisualStyleBackColor = true;
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
//
// FormSellRepair
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(319, 205);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonSave);
this.Controls.Add(this.textBoxCount);
this.Controls.Add(this.comboBoxRepair);
this.Controls.Add(this.labelCount);
this.Controls.Add(this.labelRepair);
this.Name = "FormSellRepair";
this.Text = "Продажа ремонтов";
this.Load += new System.EventHandler(this.FormSellRepair_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private Label labelRepair;
private Label labelCount;
private ComboBox comboBoxRepair;
private TextBox textBoxCount;
private Button buttonSave;
private Button buttonCancel;
}
}

View File

@@ -0,0 +1,81 @@
using CarRepairShopContracts.BusinessLogicsContracts;
using CarRepairShopContracts.SearchModels;
using Microsoft.Extensions.Logging;
namespace CarRepairShopView
{
public partial class FormSellRepair : Form
{
private readonly ILogger _logger;
private readonly IRepairLogic _logicRepair;
private readonly IShopLogic _logicShop;
public FormSellRepair(ILogger<FormSellRepair> logger, IRepairLogic logicRepair, IShopLogic logicShop)
{
InitializeComponent();
_logger = logger;
_logicRepair = logicRepair;
_logicShop = logicShop;
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxCount.Text))
{
MessageBox.Show("Заполните поле 'Количество'", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (comboBoxRepair.SelectedValue == null)
{
MessageBox.Show("Выберите ремонт", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_logger.LogInformation("Продажа суши");
try
{
var operationResult = _logicShop.SellRepair(_logicRepair.ReadElement(new RepairSearchModel()
{
Id = Convert.ToInt32(comboBoxRepair.SelectedValue)
})!, Convert.ToInt32(textBoxCount.Text));
if (!operationResult)
{
throw new Exception("Ошибка при продаже ремонта. Дополнительная информация в логах.");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка продажи ремонта");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
private void FormSellRepair_Load(object sender, EventArgs e)
{
_logger.LogInformation("Загрузка списка ремонтов для продажи");
try
{
var list = _logicRepair.ReadList(null);
if (list != null)
{
comboBoxRepair.DisplayMember = "RepairName";
comboBoxRepair.ValueMember = "Id";
comboBoxRepair.DataSource = list;
comboBoxRepair.SelectedItem = null;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка загрузки списка ремонтов");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<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>
</root>

View File

@@ -0,0 +1,212 @@
namespace CarRepairShopView
{
partial class FormShop
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dataGridView = new System.Windows.Forms.DataGridView();
this.ColumnId = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnRepairName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColumnCount = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.dateTimePicker = new System.Windows.Forms.DateTimePicker();
this.textBoxShop = new System.Windows.Forms.TextBox();
this.labelDate = new System.Windows.Forms.Label();
this.labelShopName = new System.Windows.Forms.Label();
this.labelAddress = new System.Windows.Forms.Label();
this.textBoxAddress = new System.Windows.Forms.TextBox();
this.buttonSave = new System.Windows.Forms.Button();
this.buttonCancel = new System.Windows.Forms.Button();
this.numericUpDownCount = new System.Windows.Forms.NumericUpDown();
this.labelCount = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownCount)).BeginInit();
this.SuspendLayout();
//
// dataGridView
//
this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ColumnId,
this.ColumnRepairName,
this.ColumnCount});
this.dataGridView.Location = new System.Drawing.Point(1, 1);
this.dataGridView.Name = "dataGridView";
this.dataGridView.RowHeadersWidth = 51;
this.dataGridView.RowTemplate.Height = 29;
this.dataGridView.Size = new System.Drawing.Size(487, 255);
this.dataGridView.TabIndex = 0;
//
// ColumnId
//
this.ColumnId.HeaderText = "Id";
this.ColumnId.MinimumWidth = 6;
this.ColumnId.Name = "ColumnId";
this.ColumnId.Visible = false;
this.ColumnId.Width = 125;
//
// ColumnRepairName
//
this.ColumnRepairName.HeaderText = "Вид ремонта";
this.ColumnRepairName.MinimumWidth = 6;
this.ColumnRepairName.Name = "ColumnRepairName";
this.ColumnRepairName.Width = 125;
//
// ColumnCount
//
this.ColumnCount.HeaderText = "Количество";
this.ColumnCount.MinimumWidth = 6;
this.ColumnCount.Name = "ColumnCount";
this.ColumnCount.Width = 125;
//
// dateTimePicker
//
this.dateTimePicker.Location = new System.Drawing.Point(665, 16);
this.dateTimePicker.Name = "dateTimePicker";
this.dateTimePicker.Size = new System.Drawing.Size(190, 27);
this.dateTimePicker.TabIndex = 1;
//
// textBoxShop
//
this.textBoxShop.Location = new System.Drawing.Point(665, 49);
this.textBoxShop.Name = "textBoxShop";
this.textBoxShop.Size = new System.Drawing.Size(190, 27);
this.textBoxShop.TabIndex = 2;
//
// labelDate
//
this.labelDate.AutoSize = true;
this.labelDate.Location = new System.Drawing.Point(517, 23);
this.labelDate.Name = "labelDate";
this.labelDate.Size = new System.Drawing.Size(117, 20);
this.labelDate.TabIndex = 3;
this.labelDate.Text = "Дата открытия :";
//
// labelShopName
//
this.labelShopName.AutoSize = true;
this.labelShopName.Location = new System.Drawing.Point(517, 56);
this.labelShopName.Name = "labelShopName";
this.labelShopName.Size = new System.Drawing.Size(84, 20);
this.labelShopName.TabIndex = 4;
this.labelShopName.Text = "Название :";
//
// labelAddress
//
this.labelAddress.AutoSize = true;
this.labelAddress.Location = new System.Drawing.Point(517, 89);
this.labelAddress.Name = "labelAddress";
this.labelAddress.Size = new System.Drawing.Size(58, 20);
this.labelAddress.TabIndex = 5;
this.labelAddress.Text = "Адрес :";
//
// textBoxAddress
//
this.textBoxAddress.Location = new System.Drawing.Point(665, 82);
this.textBoxAddress.Name = "textBoxAddress";
this.textBoxAddress.Size = new System.Drawing.Size(190, 27);
this.textBoxAddress.TabIndex = 6;
//
// buttonSave
//
this.buttonSave.Location = new System.Drawing.Point(557, 183);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(250, 29);
this.buttonSave.TabIndex = 7;
this.buttonSave.Text = "Сохранить";
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
//
// buttonCancel
//
this.buttonCancel.Location = new System.Drawing.Point(557, 218);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(250, 29);
this.buttonCancel.TabIndex = 8;
this.buttonCancel.Text = "Отмена";
this.buttonCancel.UseVisualStyleBackColor = true;
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
//
// numericUpDownCount
//
this.numericUpDownCount.Location = new System.Drawing.Point(665, 115);
this.numericUpDownCount.Name = "numericUpDownCount";
this.numericUpDownCount.Size = new System.Drawing.Size(190, 27);
this.numericUpDownCount.TabIndex = 9;
//
// labelCount
//
this.labelCount.AutoSize = true;
this.labelCount.Location = new System.Drawing.Point(517, 122);
this.labelCount.Name = "labelCount";
this.labelCount.Size = new System.Drawing.Size(107, 20);
this.labelCount.TabIndex = 10;
this.labelCount.Text = "Вместимость :";
//
// FormShop
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(879, 259);
this.Controls.Add(this.labelCount);
this.Controls.Add(this.numericUpDownCount);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonSave);
this.Controls.Add(this.textBoxAddress);
this.Controls.Add(this.labelAddress);
this.Controls.Add(this.labelShopName);
this.Controls.Add(this.labelDate);
this.Controls.Add(this.textBoxShop);
this.Controls.Add(this.dateTimePicker);
this.Controls.Add(this.dataGridView);
this.Name = "FormShop";
this.Text = "Создание магазина";
this.Load += new System.EventHandler(this.FormShop_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownCount)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private DataGridView dataGridView;
private DateTimePicker dateTimePicker;
private DataGridViewTextBoxColumn ColumnId;
private DataGridViewTextBoxColumn ColumnRepairName;
private DataGridViewTextBoxColumn ColumnCount;
private TextBox textBoxShop;
private Label labelDate;
private Label labelShopName;
private Label labelAddress;
private TextBox textBoxAddress;
private Button buttonSave;
private Button buttonCancel;
private NumericUpDown numericUpDownCount;
private Label labelCount;
}
}

View File

@@ -0,0 +1,121 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.BusinessLogicsContracts;
using CarRepairShopContracts.SearchModels;
using CarRepairShopDataModels.Models;
using Microsoft.Extensions.Logging;
namespace CarRepairShopView
{
public partial class FormShop : Form
{
private readonly ILogger _logger;
private readonly IShopLogic _logic;
private int? _id;
private Dictionary<int, (IRepairModel, int)> _shopRepairs;
public int Id { set { _id = value; } }
public FormShop(ILogger<FormShop> logger, IShopLogic logic)
{
InitializeComponent();
_logger = logger;
_logic = logic;
_shopRepairs = new();
}
private void FormShop_Load(object sender, EventArgs e)
{
if (_id.HasValue)
{
_logger.LogInformation("Загрузка магазина");
try
{
var view = _logic.ReadElement(new ShopSearchModel
{
Id = _id.Value
});
if (view != null)
{
textBoxShop.Text = view.ShopName;
textBoxAddress.Text = view.Address;
dateTimePicker.Text = view.DateOpening.ToString();
_shopRepairs = view.Repairs ?? new Dictionary<int, (IRepairModel, int)>();
numericUpDownCount.Value = view.MaxCountRepairs;
LoadData();
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка загрузки магазина");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
private void LoadData()
{
_logger.LogInformation("Загрузка автомастерской");
try
{
if (_shopRepairs != null)
{
dataGridView.Rows.Clear();
foreach (var elem in _shopRepairs)
{
dataGridView.Rows.Add(new object[] { elem.Key, elem.Value.Item1.RepairName, elem.Value.Item2 });
}
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка загрузки магазина");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxShop.Text))
{
MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (string.IsNullOrEmpty(textBoxAddress.Text))
{
MessageBox.Show("Заполните адрес", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_logger.LogInformation("Сохранение магазина");
try
{
var model = new ShopBindingModel
{
Id = _id ?? 0,
ShopName = textBoxShop.Text,
Address = textBoxAddress.Text,
DateOpening = dateTimePicker.Value.Date,
MaxCountRepairs = (int)numericUpDownCount.Value,
Repairs = _shopRepairs
};
var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model);
if (!operationResult)
{
throw new Exception("Ошибка при сохранении. Дополнительная информация в логах.");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка сохранения магазина");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

View File

@@ -0,0 +1,78 @@
<root>
<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>
<metadata name="ColumnId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnRepairName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnId.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnRepairName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColumnCount.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@@ -0,0 +1,144 @@
namespace CarRepairShopView
{
partial class FormShopRepairs
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.numericUpDownCount = new System.Windows.Forms.NumericUpDown();
this.comboBoxRepair = new System.Windows.Forms.ComboBox();
this.comboBoxShop = new System.Windows.Forms.ComboBox();
this.labelCount = new System.Windows.Forms.Label();
this.labelRepair = new System.Windows.Forms.Label();
this.labelShop = new System.Windows.Forms.Label();
this.buttonSave = new System.Windows.Forms.Button();
this.buttonCancel = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.numericUpDownCount)).BeginInit();
this.SuspendLayout();
//
// numericUpDownCount
//
this.numericUpDownCount.Location = new System.Drawing.Point(130, 80);
this.numericUpDownCount.Name = "numericUpDownCount";
this.numericUpDownCount.Size = new System.Drawing.Size(150, 27);
this.numericUpDownCount.TabIndex = 0;
//
// comboBoxRepair
//
this.comboBoxRepair.FormattingEnabled = true;
this.comboBoxRepair.Location = new System.Drawing.Point(130, 12);
this.comboBoxRepair.Name = "comboBoxRepair";
this.comboBoxRepair.Size = new System.Drawing.Size(150, 28);
this.comboBoxRepair.TabIndex = 1;
//
// comboBoxShop
//
this.comboBoxShop.FormattingEnabled = true;
this.comboBoxShop.Location = new System.Drawing.Point(130, 146);
this.comboBoxShop.Name = "comboBoxShop";
this.comboBoxShop.Size = new System.Drawing.Size(150, 28);
this.comboBoxShop.TabIndex = 2;
//
// labelCount
//
this.labelCount.AutoSize = true;
this.labelCount.Location = new System.Drawing.Point(12, 88);
this.labelCount.Name = "labelCount";
this.labelCount.Size = new System.Drawing.Size(97, 20);
this.labelCount.TabIndex = 3;
this.labelCount.Text = "Количество :";
//
// labelRepair
//
this.labelRepair.AutoSize = true;
this.labelRepair.Location = new System.Drawing.Point(12, 20);
this.labelRepair.Name = "labelRepair";
this.labelRepair.Size = new System.Drawing.Size(67, 20);
this.labelRepair.TabIndex = 4;
this.labelRepair.Text = "Ремонт :";
//
// labelShop
//
this.labelShop.AutoSize = true;
this.labelShop.Location = new System.Drawing.Point(12, 154);
this.labelShop.Name = "labelShop";
this.labelShop.Size = new System.Drawing.Size(76, 20);
this.labelShop.TabIndex = 5;
this.labelShop.Text = "Магазин :";
//
// buttonSave
//
this.buttonSave.Location = new System.Drawing.Point(79, 199);
this.buttonSave.Name = "buttonSave";
this.buttonSave.Size = new System.Drawing.Size(144, 29);
this.buttonSave.TabIndex = 6;
this.buttonSave.Text = "Сохранить";
this.buttonSave.UseVisualStyleBackColor = true;
this.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);
//
// buttonCancel
//
this.buttonCancel.Location = new System.Drawing.Point(79, 249);
this.buttonCancel.Name = "buttonCancel";
this.buttonCancel.Size = new System.Drawing.Size(144, 29);
this.buttonCancel.TabIndex = 7;
this.buttonCancel.Text = "Отмена";
this.buttonCancel.UseVisualStyleBackColor = true;
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);
//
// FormShopRepairs
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(295, 290);
this.Controls.Add(this.buttonCancel);
this.Controls.Add(this.buttonSave);
this.Controls.Add(this.labelShop);
this.Controls.Add(this.labelRepair);
this.Controls.Add(this.labelCount);
this.Controls.Add(this.comboBoxShop);
this.Controls.Add(this.comboBoxRepair);
this.Controls.Add(this.numericUpDownCount);
this.Name = "FormShopRepairs";
this.Text = "Добавить ремонт в магазин";
((System.ComponentModel.ISupportInitialize)(this.numericUpDownCount)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private NumericUpDown numericUpDownCount;
private ComboBox comboBoxRepair;
private ComboBox comboBoxShop;
private Label labelCount;
private Label labelRepair;
private Label labelShop;
private Button buttonSave;
private Button buttonCancel;
}
}

View File

@@ -0,0 +1,89 @@
using CarRepairShopContracts.BusinessLogicsContracts;
using CarRepairShopContracts.ViewModels;
using Microsoft.Extensions.Logging;
namespace CarRepairShopView
{
public partial class FormShopRepairs : Form
{
private readonly ILogger _logger;
private readonly IShopLogic _shopLogic;
private readonly IRepairLogic _repairLogic;
private readonly List<ShopViewModel>? _shops;
private readonly List<RepairViewModel>? _repairs;
public FormShopRepairs(ILogger<FormShopRepairs> logger, IShopLogic shopLogic, IRepairLogic repairLogic)
{
InitializeComponent();
_logger = logger;
_shopLogic = shopLogic;
_repairLogic = repairLogic;
_shops = shopLogic.ReadList(null);
if (_shops != null)
{
comboBoxShop.DisplayMember = "ShopName";
comboBoxShop.ValueMember = "Id";
comboBoxShop.DataSource = _shops;
comboBoxShop.SelectedItem = null;
}
_repairs = repairLogic.ReadList(null);
if (_repairs != null)
{
comboBoxRepair.DisplayMember = "RepairName";
comboBoxRepair.ValueMember = "Id";
comboBoxRepair.DataSource = _repairs;
comboBoxRepair.SelectedItem = null;
}
}
private void buttonSave_Click(object sender, EventArgs e)
{
if (comboBoxShop.SelectedValue == null)
{
MessageBox.Show("Выберите магазин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (comboBoxRepair.SelectedValue == null)
{
MessageBox.Show("Выберите ремонт", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_logger.LogInformation("Добавление ремонта в магазин");
try
{
var repair = _repairLogic.ReadElement(new()
{
Id = (int)comboBoxRepair.SelectedValue
});
if (repair == null)
{
throw new Exception("Ремонт не найден. Дополнительная информация в логах.");
}
var resultOperation = _shopLogic.AddRepairInShop(
model: new() { Id = (int)comboBoxShop.SelectedValue },
repair: repair,
count: (int)numericUpDownCount.Value
);
if (!resultOperation)
{
throw new Exception("Ошибка при добавлении. Дополнительная информация в логах.");
}
MessageBox.Show("Сохранение прошло успешно", "Сообщение",
MessageBoxButtons.OK, MessageBoxIcon.Information);
DialogResult = DialogResult.OK;
Close();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка сохранения ремонта");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<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>
</root>

View File

@@ -0,0 +1,115 @@
namespace CarRepairShopView
{
partial class FormShops
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.dataGridView = new System.Windows.Forms.DataGridView();
this.buttonAdd = new System.Windows.Forms.Button();
this.buttonDelete = new System.Windows.Forms.Button();
this.buttonEdit = new System.Windows.Forms.Button();
this.buttonUpdate = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
this.SuspendLayout();
//
// dataGridView
//
this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView.Location = new System.Drawing.Point(2, 2);
this.dataGridView.Name = "dataGridView";
this.dataGridView.RowHeadersWidth = 51;
this.dataGridView.RowTemplate.Height = 29;
this.dataGridView.Size = new System.Drawing.Size(522, 445);
this.dataGridView.TabIndex = 0;
//
// buttonAdd
//
this.buttonAdd.Location = new System.Drawing.Point(624, 31);
this.buttonAdd.Name = "buttonAdd";
this.buttonAdd.Size = new System.Drawing.Size(94, 29);
this.buttonAdd.TabIndex = 1;
this.buttonAdd.Text = "Добавить";
this.buttonAdd.UseVisualStyleBackColor = true;
this.buttonAdd.Click += new System.EventHandler(this.buttonAdd_Click);
//
// buttonDelete
//
this.buttonDelete.Location = new System.Drawing.Point(621, 99);
this.buttonDelete.Name = "buttonDelete";
this.buttonDelete.Size = new System.Drawing.Size(94, 29);
this.buttonDelete.TabIndex = 2;
this.buttonDelete.Text = "Удалить";
this.buttonDelete.UseVisualStyleBackColor = true;
this.buttonDelete.Click += new System.EventHandler(this.buttonDelete_Click);
//
// buttonEdit
//
this.buttonEdit.Location = new System.Drawing.Point(621, 178);
this.buttonEdit.Name = "buttonEdit";
this.buttonEdit.Size = new System.Drawing.Size(94, 29);
this.buttonEdit.TabIndex = 3;
this.buttonEdit.Text = "Изменить";
this.buttonEdit.UseVisualStyleBackColor = true;
this.buttonEdit.Click += new System.EventHandler(this.buttonEdit_Click);
//
// buttonUpdate
//
this.buttonUpdate.Location = new System.Drawing.Point(619, 260);
this.buttonUpdate.Name = "buttonUpdate";
this.buttonUpdate.Size = new System.Drawing.Size(94, 29);
this.buttonUpdate.TabIndex = 4;
this.buttonUpdate.Text = "Обновить";
this.buttonUpdate.UseVisualStyleBackColor = true;
this.buttonUpdate.Click += new System.EventHandler(this.buttonUpdate_Click);
//
// FormShops
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(800, 450);
this.Controls.Add(this.buttonUpdate);
this.Controls.Add(this.buttonEdit);
this.Controls.Add(this.buttonDelete);
this.Controls.Add(this.buttonAdd);
this.Controls.Add(this.dataGridView);
this.Name = "FormShops";
this.Text = "Магазины";
this.Load += new System.EventHandler(this.FormShops_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
this.ResumeLayout(false);
}
#endregion
private DataGridView dataGridView;
private Button buttonAdd;
private Button buttonDelete;
private Button buttonEdit;
private Button buttonUpdate;
}
}

View File

@@ -0,0 +1,108 @@
using CarRepairShopContracts.BindingModels;
using CarRepairShopContracts.BusinessLogicsContracts;
using Microsoft.Extensions.Logging;
namespace CarRepairShopView
{
public partial class FormShops : Form
{
private readonly ILogger _logger;
private readonly IShopLogic _logic;
public FormShops(ILogger<FormShops> logger, IShopLogic logic)
{
InitializeComponent();
_logger = logger;
_logic = logic;
}
private void LoadData()
{
try
{
var list = _logic.ReadList(null);
if (list != null)
{
dataGridView.DataSource = list;
dataGridView.Columns["Id"].Visible = false;
dataGridView.Columns["Repairs"].Visible = false;
dataGridView.Columns["ShopName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
_logger.LogInformation("Загрузка магазинов");
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка загрузки магазинов");
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
private void FormShops_Load(object sender, EventArgs e)
{
LoadData();
}
private void buttonAdd_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormShop));
if (service is FormShop form)
{
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
private void buttonDelete_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
if (MessageBox.Show("Удалить запись?", "Вопрос",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
_logger.LogInformation("Удаление магазина");
try
{
if (!_logic.Delete(new ShopBindingModel
{
Id = id
}))
{
throw new Exception("Ошибка при удалении. Дополнительная информация в логах.");
}
LoadData();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка удаления магазина");
MessageBox.Show(ex.Message, "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
private void buttonEdit_Click(object sender, EventArgs e)
{
if (dataGridView.SelectedRows.Count == 1)
{
var service = Program.ServiceProvider?.GetService(typeof(FormShop));
if (service is FormShop form)
{
form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value);
if (form.ShowDialog() == DialogResult.OK)
{
LoadData();
}
}
}
}
private void buttonUpdate_Click(object sender, EventArgs e)
{
LoadData();
}
}
}

View File

@@ -0,0 +1,60 @@
<root>
<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>
</root>

View File

@@ -41,10 +41,12 @@ namespace CarRepairShopView
services.AddTransient<IOilStorage, OilStorage>(); services.AddTransient<IOilStorage, OilStorage>();
services.AddTransient<IOrderStorage, OrderStorage>(); services.AddTransient<IOrderStorage, OrderStorage>();
services.AddTransient<IRepairStorage, RepairStorage>(); services.AddTransient<IRepairStorage, RepairStorage>();
services.AddTransient<IShopStorage, ShopStorage>();
services.AddTransient<IOilLogic, OilLogic>(); services.AddTransient<IOilLogic, OilLogic>();
services.AddTransient<IOrderLogic, OrderLogic>(); services.AddTransient<IOrderLogic, OrderLogic>();
services.AddTransient<IRepairLogic, RepairLogic>(); services.AddTransient<IRepairLogic, RepairLogic>();
services.AddTransient<IShopLogic, ShopLogic>();
services.AddTransient<IReportLogic, ReportLogic>(); services.AddTransient<IReportLogic, ReportLogic>();
services.AddTransient<AbstractSaveToExcel, SaveToExcel>(); services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
@@ -58,8 +60,14 @@ namespace CarRepairShopView
services.AddTransient<FormRepair>(); services.AddTransient<FormRepair>();
services.AddTransient<FormRepairOil>(); services.AddTransient<FormRepairOil>();
services.AddTransient<FormRepairs>(); services.AddTransient<FormRepairs>();
services.AddTransient<FormShop>();
services.AddTransient<FormShops>();
services.AddTransient<FormShopRepairs>();
services.AddTransient<FormSellRepair>();
services.AddTransient<FormReportRepairOils>(); services.AddTransient<FormReportRepairOils>();
services.AddTransient<FormReportShopRepairs>();
services.AddTransient<FormReportOrders>(); services.AddTransient<FormReportOrders>();
services.AddTransient<FormReportOrdersGroupDate>();
} }
} }
} }

View File

@@ -0,0 +1,325 @@
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2008/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
<Body>
<ReportItems>
<Textbox Name="TextboxTitle">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Заказы, сгруппированные по датам</Value>
<Style>
<FontSize>16pt</FontSize>
<FontWeight>Bold</FontWeight>
</Style>
</TextRun>
</TextRuns>
<Style>
<TextAlign>Center</TextAlign>
</Style>
</Paragraph>
</Paragraphs>
<Top>0.74083cm</Top>
<Height>0.83283cm</Height>
<Width>19.91783cm</Width>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
<Tablix Name="Tablix1">
<TablixBody>
<TablixColumns>
<TablixColumn>
<Width>6.35939cm</Width>
</TablixColumn>
<TablixColumn>
<Width>6.35939cm</Width>
</TablixColumn>
<TablixColumn>
<Width>6.35939cm</Width>
</TablixColumn>
</TablixColumns>
<TablixRows>
<TablixRow>
<Height>0.81167cm</Height>
<TablixCells>
<TablixCell>
<CellContents>
<Textbox Name="Textbox2">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Дата создания</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox2</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox4">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Количество заказов</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox4</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox6">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>Сумма по заказам</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox6</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
</TablixCells>
</TablixRow>
<TablixRow>
<Height>0.81167cm</Height>
<TablixCells>
<TablixCell>
<CellContents>
<Textbox Name="Textbox3">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!DateCreate.Value</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox3</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox5">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!Count.Value</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox5</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
<TablixCell>
<CellContents>
<Textbox Name="Textbox7">
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Fields!Sum.Value</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<rd:DefaultName>Textbox7</rd:DefaultName>
<Style>
<Border>
<Color>LightGrey</Color>
<Style>Solid</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</CellContents>
</TablixCell>
</TablixCells>
</TablixRow>
</TablixRows>
</TablixBody>
<TablixColumnHierarchy>
<TablixMembers>
<TablixMember />
<TablixMember />
<TablixMember />
</TablixMembers>
</TablixColumnHierarchy>
<TablixRowHierarchy>
<TablixMembers>
<TablixMember>
<KeepWithGroup>After</KeepWithGroup>
</TablixMember>
<TablixMember>
<Group Name="Подробности" />
</TablixMember>
</TablixMembers>
</TablixRowHierarchy>
<Top>2.76436cm</Top>
<Left>0.3937cm</Left>
<Height>1.62333cm</Height>
<Width>19.07818cm</Width>
<ZIndex>1</ZIndex>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</Tablix>
</ReportItems>
<Height>2.85834in</Height>
<Style />
</Body>
<Width>7.84167in</Width>
<Page>
<PageHeight>29.7cm</PageHeight>
<PageWidth>21cm</PageWidth>
<LeftMargin>2cm</LeftMargin>
<RightMargin>2cm</RightMargin>
<TopMargin>2cm</TopMargin>
<BottomMargin>2cm</BottomMargin>
<ColumnSpacing>0.13cm</ColumnSpacing>
<Style />
</Page>
<AutoRefresh>0</AutoRefresh>
<DataSources>
<DataSource Name="CarRepairShopContractsViewModels">
<ConnectionProperties>
<DataProvider>System.Data.DataSet</DataProvider>
<ConnectString>/* Local Connection */</ConnectString>
</ConnectionProperties>
<rd:DataSourceID>10791c83-cee8-4a38-bbd0-245fc17cefb3</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name="DataSetOrders">
<Query>
<DataSourceName>CarRepairShopContractsViewModels</DataSourceName>
<CommandText>/* Local Query */</CommandText>
</Query>
<Fields>
<Field Name="DateCreate">
<DataField>DateCreate</DataField>
<rd:TypeName>System.DateTime</rd:TypeName>
</Field>
<Field Name="Sum">
<DataField>Sum</DataField>
<rd:TypeName>System.Decimal</rd:TypeName>
</Field>
<Field Name="Count">
<DataField>Count</DataField>
<rd:TypeName>System.Int32</rd:TypeName>
</Field>
</Fields>
<rd:DataSetInfo>
<rd:DataSetName>CarRepairShopContracts.ViewModels</rd:DataSetName>
<rd:TableName>ReportOrdersViewModel</rd:TableName>
<rd:ObjectDataSourceType>CarRepairShopContracts.ViewModels.ReportOrdersViewModel, CarRepairShopContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</rd:ObjectDataSourceType>
</rd:DataSetInfo>
</DataSet>
</DataSets>
<rd:ReportUnitType>Cm</rd:ReportUnitType>
<rd:ReportID>f3007309-1a78-400b-96c8-4373817a9127</rd:ReportID>
</Report>