diff --git a/MotorPlant/MotorPlantBusinessLogic/MotorPlantBusinessLogic.csproj b/MotorPlant/MotorPlantBusinessLogic/MotorPlantBusinessLogic.csproj
index 4d4599c..83215cb 100644
--- a/MotorPlant/MotorPlantBusinessLogic/MotorPlantBusinessLogic.csproj
+++ b/MotorPlant/MotorPlantBusinessLogic/MotorPlantBusinessLogic.csproj
@@ -7,12 +7,15 @@
+
+
+
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
new file mode 100644
index 0000000..7fd2f87
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
@@ -0,0 +1,154 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage
+{
+ public abstract class AbstractSaveToExcel
+ {
+ public void CreateReport(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 pc in info.EngineComponents)
+ {
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "A",
+ RowIndex = rowIndex,
+ Text = pc.EngineName,
+ StyleInfo = ExcelStyleInfoType.Text
+ });
+ rowIndex++;
+ foreach (var Engine in pc.Components)
+ {
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "B",
+ RowIndex = rowIndex,
+ Text = Engine.Item1,
+ StyleInfo =
+ ExcelStyleInfoType.TextWithBroder
+ });
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "C",
+ RowIndex = rowIndex,
+ Text = Engine.Item2.ToString(),
+ StyleInfo =
+ ExcelStyleInfoType.TextWithBroder
+ });
+ rowIndex++;
+ }
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "A",
+ RowIndex = rowIndex,
+ Text = "Итого",
+ StyleInfo = ExcelStyleInfoType.Text
+ });
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "C",
+ RowIndex = rowIndex,
+ Text = pc.TotalCount.ToString(),
+ StyleInfo = ExcelStyleInfoType.Text
+ });
+ rowIndex++;
+ }
+ SaveExcel(info);
+ }
+ public void CreateShopEnginesReport(ExcelShop 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.ShopEngines)
+ {
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "A",
+ RowIndex = rowIndex,
+ Text = sr.ShopName,
+ StyleInfo = ExcelStyleInfoType.Text
+ });
+ rowIndex++;
+
+ foreach (var (Engine, Count) in sr.Engines)
+ {
+ InsertCellInWorksheet(new ExcelCellParameters
+ {
+ ColumnName = "B",
+ RowIndex = rowIndex,
+ Text = Engine,
+ 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);
+ }
+ protected abstract void CreateExcel(IDocument info);
+ protected abstract void InsertCellInWorksheet(ExcelCellParameters
+ excelParams);
+ protected abstract void MergeCells(ExcelMergeParameters excelParams);
+ protected abstract void SaveExcel(IDocument info);
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
new file mode 100644
index 0000000..53a6045
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
@@ -0,0 +1,87 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage
+{
+ public abstract class AbstractSaveToPdf
+ {
+ public void CreateDoc(PdfInfo info)
+ {
+ CreatePdf(info);
+ CreateParagraph(new PdfParagraph
+ {
+ Text = info.Title,
+ Style = "NormalTitle",
+ ParagraphAlignment = PdfParagraphAlignmentType.Center
+ });
+ CreateParagraph(new PdfParagraph
+ {
+ Text = $"с{info.DateFrom.ToShortDateString()} по {info.DateTo.ToShortDateString()}",
+ Style = "Normal",
+ ParagraphAlignment = PdfParagraphAlignmentType.Center
+ });
+ CreateTable(new List { "2cm", "3cm", "6cm", "3cm", "4cm" });
+ CreateRow(new PdfRowParameters
+ {
+ Texts = new List { "Номер", "Дата заказа", "Изделие", "Сумма", "Статус" },
+ Style = "NormalTitle",
+ ParagraphAlignment = PdfParagraphAlignmentType.Center
+ });
+ foreach (var order in info.Orders)
+ {
+ CreateRow(new PdfRowParameters
+ {
+ Texts = new List { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.EngineName, order.Sum.ToString(), order.OrderStatus },
+ Style = "Normal",
+ ParagraphAlignment = PdfParagraphAlignmentType.Left
+ });
+ }
+ CreateParagraph(new PdfParagraph
+ {
+ Text = $"Итого: {info.Orders.Sum(x => x.Sum)}\t",
+ Style = "Normal",
+ ParagraphAlignment = PdfParagraphAlignmentType.Right
+ });
+ SavePdf(info);
+ }
+ public void CreateGroupedOrdersDoc(PdfGroupedOrdersInfo info)
+ {
+ CreatePdf(info);
+ CreateParagraph(new PdfParagraph { Text = info.Title, Style = "NormalTitle", ParagraphAlignment = PdfParagraphAlignmentType.Center });
+
+ CreateTable(new List { "4cm", "3cm", "2cm" });
+ CreateRow(new PdfRowParameters
+ {
+ Texts = new List { "Дата заказа", "Кол-во", "Сумма" },
+ Style = "NormalTitle",
+ ParagraphAlignment = PdfParagraphAlignmentType.Center
+ });
+
+
+ foreach (var groupedOrder in info.GroupedOrders)
+ {
+ CreateRow(new PdfRowParameters
+ {
+ Texts = new List { groupedOrder.Date.ToShortDateString(), groupedOrder.OrdersCount.ToString(), groupedOrder.OrdersSum.ToString() },
+ Style = "Normal",
+ ParagraphAlignment = PdfParagraphAlignmentType.Left
+ });
+ }
+
+ CreateParagraph(new PdfParagraph { Text = $"Итого: {info.GroupedOrders.Sum(x => x.OrdersSum)}\t", Style = "Normal", ParagraphAlignment = PdfParagraphAlignmentType.Center });
+
+ SavePdf(info);
+ }
+
+ protected abstract void CreatePdf(IDocument info);
+ protected abstract void CreateParagraph(PdfParagraph paragraph);
+ protected abstract void CreateTable(List columns);
+ protected abstract void CreateRow(PdfRowParameters rowParameters);
+ protected abstract void SavePdf(IDocument info);
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToWord.cs
new file mode 100644
index 0000000..bba9d69
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/AbstractSaveToWord.cs
@@ -0,0 +1,90 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage
+{
+ public abstract class AbstractSaveToWord
+ {
+ public void CreateEngineDoc(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
+ }
+ });
+ foreach (var component in info.Engines)
+ {
+ CreateParagraph(new WordParagraph
+ {
+ Texts = new List<(string, WordTextProperties)>
+ {
+ (component.EngineName, new WordTextProperties { Size = "24", Bold = true}),
+ ("\t" + component.Price.ToString(), new WordTextProperties { Size = "24"}),
+ },
+ TextProperties = new WordTextProperties
+ {
+ Size = "24",
+ JustificationType = WordJustificationType.Both
+ }
+ });
+ }
+ SaveWord(info);
+ }
+ public void CreateShopsDoc(WordShopInfo 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
+ }
+ });
+
+ CreateTable(new List { "3000", "3000", "3000" });
+ CreateRow(new WordRowParameters
+ {
+ Texts = new List { "Название", "Адрес", "Дата открытия" },
+ TextProperties = new WordTextProperties
+ {
+ Size = "24",
+ Bold = true,
+ JustificationType = WordJustificationType.Center
+ }
+ });
+
+ foreach (var shop in info.Shops)
+ {
+ CreateRow(new WordRowParameters
+ {
+ Texts = new List { shop.ShopName, shop.Adress, shop.OpeningDate.ToString() },
+ TextProperties = new WordTextProperties
+ {
+ Size = "22",
+ JustificationType = WordJustificationType.Both
+ }
+ });
+ }
+
+ SaveWord(info);
+ }
+ protected abstract void CreateWord(IDocument info);
+ protected abstract void CreateParagraph(WordParagraph paragraph);
+ protected abstract void SaveWord(IDocument info);
+ protected abstract void CreateTable(List colums);
+ protected abstract void CreateRow(WordRowParameters rowParameters);
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
new file mode 100644
index 0000000..46c4fef
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperEnums
+{
+ public enum ExcelStyleInfoType
+ {
+ Title,
+ Text,
+ TextWithBroder
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs
new file mode 100644
index 0000000..2fdcbe0
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperEnums
+{
+ public enum PdfParagraphAlignmentType
+ {
+ Center,
+ Left,
+ Right
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
new file mode 100644
index 0000000..8ef02a6
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperEnums
+{
+ public enum WordJustificationType
+ {
+ Center,
+ Both
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
new file mode 100644
index 0000000..77fc2f0
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
@@ -0,0 +1,18 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class ExcelCellParameters
+ {
+ public string ColumnName { get; set; } = string.Empty;
+ public uint RowIndex { get; set; }
+ public string Text { get; set; } = string.Empty;
+ public string CellReference => $"{ColumnName}{RowIndex}";
+ public ExcelStyleInfoType StyleInfo { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
new file mode 100644
index 0000000..0cd7d17
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
@@ -0,0 +1,21 @@
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class ExcelInfo : IDocument
+ {
+ public string FileName { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
+ public List EngineComponents
+ {
+ get;
+ set;
+ } = new();
+
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
new file mode 100644
index 0000000..756f660
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class ExcelMergeParameters
+ {
+ public string CellFromName { get; set; } = string.Empty;
+ public string CellToName { get; set; } = string.Empty;
+ public string Merge => $"{CellFromName}:{CellToName}";
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelShop.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelShop.cs
new file mode 100644
index 0000000..9d870da
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/ExcelShop.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MotorPlantContracts.ViewModels;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class ExcelShop : IDocument
+ {
+ public string FileName { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
+ public List ShopEngines { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfGroupedOrdersInfo.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfGroupedOrdersInfo.cs
new file mode 100644
index 0000000..0f35238
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfGroupedOrdersInfo.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MotorPlantContracts.ViewModels;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class PdfGroupedOrdersInfo : IDocument
+ {
+ public string FileName { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
+ public DateTime DateFrom { get; set; }
+ public DateTime DateTo { get; set; }
+ public List GroupedOrders { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
new file mode 100644
index 0000000..e355fdd
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
@@ -0,0 +1,18 @@
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class PdfInfo : IDocument
+ {
+ public string FileName { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
+ public DateTime DateFrom { get; set; }
+ public DateTime DateTo { get; set; }
+ public List Orders { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
new file mode 100644
index 0000000..a52172a
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
@@ -0,0 +1,16 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class PdfParagraph
+ {
+ public string Text { get; set; } = string.Empty;
+ public string Style { get; set; } = string.Empty;
+ public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
new file mode 100644
index 0000000..0208ff6
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
@@ -0,0 +1,16 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class PdfRowParameters
+ {
+ public List Texts { get; set; } = new();
+ public string Style { get; set; } = string.Empty;
+ public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
new file mode 100644
index 0000000..ade69c0
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
@@ -0,0 +1,16 @@
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class WordInfo : IDocument
+ {
+ public string FileName { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
+ public List Engines { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
new file mode 100644
index 0000000..b99e6b2
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class WordParagraph
+ {
+ public List<(string, WordTextProperties)> Texts { get; set; } = new();
+ public WordTextProperties? TextProperties { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordRowParameters.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordRowParameters.cs
new file mode 100644
index 0000000..7cb81a9
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordRowParameters.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class WordRowParameters
+ {
+ public List Texts { get; set; } = new();
+ public WordTextProperties TextProperties { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordShopInfo.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordShopInfo.cs
new file mode 100644
index 0000000..f781da1
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordShopInfo.cs
@@ -0,0 +1,16 @@
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class WordShopInfo : IDocument
+ {
+ public string FileName { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
+ public List Shops { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
new file mode 100644
index 0000000..4cc60cf
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
@@ -0,0 +1,16 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.HelperModels
+{
+ public class WordTextProperties
+ {
+ public string Size { get; set; } = string.Empty;
+ public bool Bold { get; set; }
+ public WordJustificationType JustificationType { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/IDocument.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/IDocument.cs
new file mode 100644
index 0000000..1076a82
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/IDocument.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage
+{
+ public interface IDocument
+ {
+ public string FileName { get; set; }
+ public string Title { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToExcel.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
new file mode 100644
index 0000000..9b19488
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
@@ -0,0 +1,337 @@
+using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2013.Excel;
+using DocumentFormat.OpenXml.Office2016.Excel;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml;
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.Implements
+{
+ public class SaveToExcel : AbstractSaveToExcel
+ {
+ private SpreadsheetDocument? _spreadsheetDocument;
+ private SharedStringTablePart? _shareStringPart;
+ private Worksheet? _worksheet;
+ private static void CreateStyles(WorkbookPart workbookpart)
+ {
+ var sp = workbookpart.AddNewPart();
+ sp.Stylesheet = new Stylesheet();
+ var fonts = new Fonts() { Count = 2U, KnownFonts = true };
+ var fontUsual = new Font();
+ fontUsual.Append(new FontSize() { Val = 12D });
+ fontUsual.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color()
+ { Theme = 1U });
+ fontUsual.Append(new FontName() { Val = "Times New Roman" });
+ fontUsual.Append(new FontFamilyNumbering() { Val = 2 });
+ fontUsual.Append(new FontScheme() { Val = FontSchemeValues.Minor });
+ var fontTitle = new Font();
+ fontTitle.Append(new Bold());
+ fontTitle.Append(new FontSize() { Val = 14D });
+ fontTitle.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color()
+ { Theme = 1U });
+ fontTitle.Append(new FontName() { Val = "Times New Roman" });
+ fontTitle.Append(new FontFamilyNumbering() { Val = 2 });
+ fontTitle.Append(new FontScheme() { Val = FontSchemeValues.Minor });
+ fonts.Append(fontUsual);
+ fonts.Append(fontTitle);
+ var fills = new Fills() { Count = 2U };
+ var fill1 = new Fill();
+ fill1.Append(new PatternFill() { PatternType = PatternValues.None });
+ var fill2 = new Fill();
+ fill2.Append(new PatternFill()
+ {
+ PatternType = PatternValues.Gray125
+ });
+ fills.Append(fill1);
+ fills.Append(fill2);
+ var borders = new Borders() { Count = 2U };
+ var borderNoBorder = new Border();
+ borderNoBorder.Append(new LeftBorder());
+ borderNoBorder.Append(new RightBorder());
+ borderNoBorder.Append(new TopBorder());
+ borderNoBorder.Append(new BottomBorder());
+ borderNoBorder.Append(new DiagonalBorder());
+ var borderThin = new Border();
+ var leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin };
+ leftBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color()
+ { Indexed = 64U });
+ var rightBorder = new RightBorder()
+ {
+ Style = BorderStyleValues.Thin
+ };
+ rightBorder.Append(new
+ DocumentFormat.OpenXml.Office2010.Excel.Color()
+ { Indexed = 64U });
+ var topBorder = new TopBorder() { Style = BorderStyleValues.Thin };
+ topBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color()
+ { Indexed = 64U });
+ var bottomBorder = new BottomBorder()
+ {
+ Style =
+ BorderStyleValues.Thin
+ };
+ bottomBorder.Append(new
+ DocumentFormat.OpenXml.Office2010.Excel.Color()
+ { Indexed = 64U });
+ borderThin.Append(leftBorder);
+ borderThin.Append(rightBorder);
+ borderThin.Append(topBorder);
+ borderThin.Append(bottomBorder);
+ borderThin.Append(new DiagonalBorder());
+ borders.Append(borderNoBorder);
+ borders.Append(borderThin);
+ var cellStyleFormats = new CellStyleFormats() { Count = 1U };
+ var cellFormatStyle = new CellFormat()
+ {
+ NumberFormatId = 0U,
+ FontId
+ = 0U,
+ FillId = 0U,
+ BorderId = 0U
+ };
+ cellStyleFormats.Append(cellFormatStyle);
+ var cellFormats = new CellFormats() { Count = 3U };
+ var cellFormatFont = new CellFormat()
+ {
+ NumberFormatId = 0U,
+ FontId =
+ 0U,
+ FillId = 0U,
+ BorderId = 0U,
+ FormatId = 0U,
+ ApplyFont = true
+ };
+ var cellFormatFontAndBorder = new CellFormat()
+ {
+ NumberFormatId = 0U,
+ FontId = 0U,
+ FillId = 0U,
+ BorderId = 1U,
+ FormatId = 0U,
+ ApplyFont = true,
+ ApplyBorder = true
+ };
+ var cellFormatTitle = new CellFormat()
+ {
+ NumberFormatId = 0U,
+ FontId
+ = 1U,
+ FillId = 0U,
+ BorderId = 0U,
+ FormatId = 0U,
+ Alignment = new Alignment()
+ {
+ Vertical = VerticalAlignmentValues.Center,
+ WrapText = true,
+ Horizontal =
+ HorizontalAlignmentValues.Center
+ },
+ ApplyFont = true
+ };
+ cellFormats.Append(cellFormatFont);
+ cellFormats.Append(cellFormatFontAndBorder);
+ cellFormats.Append(cellFormatTitle);
+ var cellStyles = new CellStyles() { Count = 1U };
+ cellStyles.Append(new CellStyle()
+ {
+ Name = "Normal",
+ FormatId = 0U,
+ BuiltinId = 0U
+ });
+ var differentialFormats = new
+ DocumentFormat.OpenXml.Office2013.Excel.DifferentialFormats()
+ { Count = 0U };
+
+ var tableStyles = new TableStyles()
+ {
+ Count = 0U,
+ DefaultTableStyle =
+ "TableStyleMedium2",
+ DefaultPivotStyle = "PivotStyleLight16"
+ };
+ var stylesheetExtensionList = new StylesheetExtensionList();
+ var stylesheetExtension1 = new StylesheetExtension()
+ {
+ Uri =
+ "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}"
+ };
+ stylesheetExtension1.AddNamespaceDeclaration("x14",
+ "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
+ stylesheetExtension1.Append(new SlicerStyles()
+ {
+ DefaultSlicerStyle =
+ "SlicerStyleLight1"
+ });
+ var stylesheetExtension2 = new StylesheetExtension()
+ {
+ Uri =
+ "{9260A510-F301-46a8-8635-F512D64BE5F5}"
+ };
+ stylesheetExtension2.AddNamespaceDeclaration("x15",
+ "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main");
+ stylesheetExtension2.Append(new TimelineStyles()
+ {
+ DefaultTimelineStyle = "TimeSlicerStyleLight1"
+ });
+ stylesheetExtensionList.Append(stylesheetExtension1);
+ stylesheetExtensionList.Append(stylesheetExtension2);
+ sp.Stylesheet.Append(fonts);
+ sp.Stylesheet.Append(fills);
+ sp.Stylesheet.Append(borders);
+ sp.Stylesheet.Append(cellStyleFormats);
+ sp.Stylesheet.Append(cellFormats);
+ sp.Stylesheet.Append(cellStyles);
+ sp.Stylesheet.Append(differentialFormats);
+ sp.Stylesheet.Append(tableStyles);
+ sp.Stylesheet.Append(stylesheetExtensionList);
+ }
+ private static uint GetStyleValue(ExcelStyleInfoType styleInfo)
+ {
+ return styleInfo switch
+ {
+ ExcelStyleInfoType.Title => 2U,
+ ExcelStyleInfoType.TextWithBroder => 1U,
+ ExcelStyleInfoType.Text => 0U,
+ _ => 0U,
+ };
+ }
+ protected override void CreateExcel(IDocument info)
+ {
+ _spreadsheetDocument = SpreadsheetDocument.Create(info.FileName,
+ SpreadsheetDocumentType.Workbook);
+ var workbookpart = _spreadsheetDocument.AddWorkbookPart();
+ workbookpart.Workbook = new Workbook();
+ CreateStyles(workbookpart);
+ _shareStringPart =
+ _spreadsheetDocument.WorkbookPart!.GetPartsOfType().Any()
+ ?
+ _spreadsheetDocument.WorkbookPart.GetPartsOfType().First()
+ :
+ _spreadsheetDocument.WorkbookPart.AddNewPart();
+ if (_shareStringPart.SharedStringTable == null)
+ {
+ _shareStringPart.SharedStringTable = new SharedStringTable();
+ }
+ var worksheetPart = workbookpart.AddNewPart();
+ worksheetPart.Worksheet = new Worksheet(new SheetData());
+ var sheets =
+ _spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
+ var sheet = new Sheet()
+ {
+ Id =
+ _spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
+ SheetId = 1,
+ Name = "Лист"
+ };
+ sheets.Append(sheet);
+ _worksheet = worksheetPart.Worksheet;
+ }
+ protected override void InsertCellInWorksheet(ExcelCellParameters
+ excelParams)
+ {
+ if (_worksheet == null || _shareStringPart == null)
+ {
+ return;
+ }
+ var sheetData = _worksheet.GetFirstChild();
+ if (sheetData == null)
+ {
+ return;
+ }
+ Row row;
+ if (sheetData.Elements().Where(r => r.RowIndex! ==
+ excelParams.RowIndex).Any())
+ {
+ row = sheetData.Elements().Where(r => r.RowIndex! ==
+ excelParams.RowIndex).First();
+ }
+ else
+ {
+ row = new Row() { RowIndex = excelParams.RowIndex };
+ sheetData.Append(row);
+ }
+ Cell cell;
+ if (row.Elements().Where(c => c.CellReference!.Value ==
+ excelParams.CellReference).Any())
+ {
+ cell = row.Elements().Where(c => c.CellReference!.Value ==
+ excelParams.CellReference).First();
+ }
+ else
+ {
+ Cell? refCell = null;
+ foreach (Cell rowCell in row.Elements())
+ {
+ if (string.Compare(rowCell.CellReference!.Value,
+ excelParams.CellReference, true) > 0)
+ {
+ refCell = rowCell;
+ break;
+ }
+ }
+ var newCell = new Cell()
+ {
+ CellReference =
+ excelParams.CellReference
+ };
+ row.InsertBefore(newCell, refCell);
+ cell = newCell;
+ }
+ _shareStringPart.SharedStringTable.AppendChild(new
+ SharedStringItem(new Text(excelParams.Text)));
+ _shareStringPart.SharedStringTable.Save();
+ cell.CellValue = new
+ CellValue((_shareStringPart.SharedStringTable.Elements().Count(
+ ) - 1).ToString());
+ cell.DataType = new EnumValue(CellValues.SharedString);
+ cell.StyleIndex = GetStyleValue(excelParams.StyleInfo);
+ }
+ protected override void MergeCells(ExcelMergeParameters excelParams)
+ {
+ if (_worksheet == null)
+ {
+ return;
+ }
+ MergeCells mergeCells;
+ if (_worksheet.Elements().Any())
+ {
+ mergeCells = _worksheet.Elements().First();
+ }
+ else
+ {
+ mergeCells = new MergeCells();
+ if (_worksheet.Elements().Any())
+ {
+ _worksheet.InsertAfter(mergeCells,
+ _worksheet.Elements().First());
+ }
+ else
+ {
+ _worksheet.InsertAfter(mergeCells,
+ _worksheet.Elements().First());
+ }
+ }
+ var mergeCell = new MergeCell()
+ {
+ Reference = new StringValue(excelParams.Merge)
+ };
+ mergeCells.Append(mergeCell);
+ }
+ protected override void SaveExcel(IDocument info)
+ {
+ if (_spreadsheetDocument == null)
+ {
+ return;
+ }
+ _spreadsheetDocument.WorkbookPart!.Workbook.Save();
+ _spreadsheetDocument.Dispose();
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToPdf.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
new file mode 100644
index 0000000..7e57018
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
@@ -0,0 +1,106 @@
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.DocumentObjectModel.Tables;
+using MigraDoc.Rendering;
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.Implements
+{
+ public class SaveToPdf : AbstractSaveToPdf
+ {
+ private Document? _document;
+ private Section? _section;
+ private Table? _table;
+ private static ParagraphAlignment
+ GetParagraphAlignment(PdfParagraphAlignmentType type)
+ {
+ return type switch
+ {
+ PdfParagraphAlignmentType.Center => ParagraphAlignment.Center,
+ PdfParagraphAlignmentType.Left => ParagraphAlignment.Left,
+ PdfParagraphAlignmentType.Right => ParagraphAlignment.Right,
+ _ => ParagraphAlignment.Justify,
+ };
+ }
+ ///
+ /// Создание стилей для документа
+ ///
+ ///
+ private static void DefineStyles(Document document)
+ {
+ var style = document.Styles["Normal"];
+ style.Font.Name = "Times New Roman";
+ style.Font.Size = 14;
+ style = document.Styles.AddStyle("NormalTitle", "Normal");
+ style.Font.Bold = true;
+ }
+ protected override void CreatePdf(IDocument info)
+ {
+ _document = new Document();
+ DefineStyles(_document);
+ _section = _document.AddSection();
+ }
+ protected override void CreateParagraph(PdfParagraph pdfParagraph)
+ {
+ if (_section == null)
+ {
+ return;
+ }
+ var paragraph = _section.AddParagraph(pdfParagraph.Text);
+ paragraph.Format.SpaceAfter = "1cm";
+ paragraph.Format.Alignment =
+ GetParagraphAlignment(pdfParagraph.ParagraphAlignment);
+ paragraph.Style = pdfParagraph.Style;
+ }
+ protected override void CreateTable(List columns)
+ {
+ if (_document == null)
+ {
+ return;
+ }
+ _table = _document.LastSection.AddTable();
+ foreach (var elem in columns)
+ {
+ _table.AddColumn(elem);
+ }
+ }
+ protected override void CreateRow(PdfRowParameters rowParameters)
+ {
+ if (_table == null)
+ {
+ return;
+ }
+ var row = _table.AddRow();
+ for (int i = 0; i < rowParameters.Texts.Count; ++i)
+ {
+ row.Cells[i].AddParagraph(rowParameters.Texts[i]);
+ if (!string.IsNullOrEmpty(rowParameters.Style))
+ {
+ row.Cells[i].Style = rowParameters.Style;
+ }
+ Unit borderWidth = 0.5;
+ row.Cells[i].Borders.Left.Width = borderWidth;
+ row.Cells[i].Borders.Right.Width = borderWidth;
+ row.Cells[i].Borders.Top.Width = borderWidth;
+ row.Cells[i].Borders.Bottom.Width = borderWidth;
+ row.Cells[i].Format.Alignment =
+ GetParagraphAlignment(rowParameters.ParagraphAlignment);
+ row.Cells[i].VerticalAlignment = VerticalAlignment.Center;
+ }
+ }
+ protected override void SavePdf(IDocument info)
+ {
+ var renderer = new PdfDocumentRenderer(true)
+ {
+ Document = _document
+ };
+ renderer.RenderDocument();
+ renderer.PdfDocument.Save(info.FileName);
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToWord.cs
new file mode 100644
index 0000000..8f1493d
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/OfficePackage/Implements/SaveToWord.cs
@@ -0,0 +1,175 @@
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+using DocumentFormat.OpenXml;
+using MotorPlantBusinessLogic.OfficePackage.HelperEnums;
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.OfficePackage.Implements
+{
+ public class SaveToWord : AbstractSaveToWord
+ {
+ private WordprocessingDocument? _wordDocument;
+ private Body? _docBody;
+ private static JustificationValues GetJustificationValues(WordJustificationType type)
+ {
+ return type switch
+ {
+ WordJustificationType.Both => JustificationValues.Both,
+ WordJustificationType.Center => JustificationValues.Center,
+ _ => JustificationValues.Left,
+ };
+ }
+ private static SectionProperties CreateSectionProperties()
+ {
+ var properties = new SectionProperties();
+
+ var pageSize = new PageSize
+ {
+ Orient = PageOrientationValues.Portrait
+ };
+ properties.AppendChild(pageSize);
+ return properties;
+ }
+ private static ParagraphProperties? CreateParagraphProperties(WordTextProperties? paragraphProperties)
+ {
+ if (paragraphProperties == null)
+ {
+ return null;
+ }
+ var properties = new ParagraphProperties();
+ properties.AppendChild(new Justification()
+ {
+ Val = GetJustificationValues(paragraphProperties.JustificationType)
+ });
+ properties.AppendChild(new SpacingBetweenLines
+ {
+ LineRule = LineSpacingRuleValues.Auto
+ });
+ properties.AppendChild(new Indentation());
+ var paragraphMarkRunProperties = new ParagraphMarkRunProperties();
+ if (!string.IsNullOrEmpty(paragraphProperties.Size))
+ {
+ paragraphMarkRunProperties.AppendChild(new FontSize { Val = paragraphProperties.Size });
+ }
+ properties.AppendChild(paragraphMarkRunProperties);
+ return properties;
+ }
+ protected override void CreateWord(IDocument info)
+ {
+ _wordDocument = WordprocessingDocument.Create(info.FileName, WordprocessingDocumentType.Document);
+ MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
+ mainPart.Document = new Document();
+ _docBody = mainPart.Document.AppendChild(new Body());
+ }
+ protected override void CreateParagraph(WordParagraph paragraph)
+ {
+ if (_docBody == null || paragraph == null)
+ {
+ return;
+ }
+ var docParagraph = new Paragraph();
+ docParagraph.AppendChild(CreateParagraphProperties(paragraph.TextProperties));
+ foreach (var run in paragraph.Texts)
+ {
+ var docRun = new Run();
+ var properties = new RunProperties();
+ properties.AppendChild(new FontSize { Val = run.Item2.Size });
+ if (run.Item2.Bold)
+ {
+ properties.AppendChild(new Bold());
+ }
+ docRun.AppendChild(properties);
+ docRun.AppendChild(new Text { Text = run.Item1, Space = SpaceProcessingModeValues.Preserve });
+ docParagraph.AppendChild(docRun);
+ }
+ _docBody.AppendChild(docParagraph);
+ }
+ protected override void SaveWord(IDocument info)
+ {
+ if (_docBody == null || _wordDocument == null)
+ {
+ return;
+ }
+ _docBody.AppendChild(CreateSectionProperties());
+ _wordDocument.MainDocumentPart!.Document.Save();
+ _wordDocument.Dispose();
+ }
+
+ private Table? _lastTable;
+ protected override void CreateTable(List columns)
+ {
+ if (_docBody == null)
+ return;
+
+ _lastTable = new Table();
+
+ var tableProp = new TableProperties();
+ tableProp.AppendChild(new TableLayout { Type = TableLayoutValues.Fixed });
+ tableProp.AppendChild(new TableBorders(
+ new TopBorder() { Val = new EnumValue(BorderValues.Single), Size = 4 },
+ new LeftBorder() { Val = new EnumValue(BorderValues.Single), Size = 4 },
+ new RightBorder() { Val = new EnumValue(BorderValues.Single), Size = 4 },
+ new BottomBorder() { Val = new EnumValue(BorderValues.Single), Size = 4 },
+ new InsideHorizontalBorder() { Val = new EnumValue(BorderValues.Single), Size = 4 },
+ new InsideVerticalBorder() { Val = new EnumValue(BorderValues.Single), Size = 4 }
+ ));
+ tableProp.AppendChild(new TableWidth { Type = TableWidthUnitValues.Auto });
+ _lastTable.AppendChild(tableProp);
+
+ TableGrid tableGrid = new TableGrid();
+ foreach (var column in columns)
+ {
+ tableGrid.AppendChild(new GridColumn() { Width = column });
+ }
+ _lastTable.AppendChild(tableGrid);
+
+ _docBody.AppendChild(_lastTable);
+ }
+
+ protected override void CreateRow(WordRowParameters rowParameters)
+ {
+ if (_docBody == null || _lastTable == null)
+ return;
+
+ TableRow docRow = new TableRow();
+ foreach (var column in rowParameters.Texts)
+ {
+ var docParagraph = new Paragraph();
+ WordParagraph paragraph = new WordParagraph
+ {
+ Texts = new List<(string, WordTextProperties)> { (column, rowParameters.TextProperties) },
+ TextProperties = rowParameters.TextProperties
+ };
+
+ docParagraph.AppendChild(CreateParagraphProperties(paragraph.TextProperties));
+
+ foreach (var run in paragraph.Texts)
+ {
+ var docRun = new Run();
+
+ var properties = new RunProperties();
+ properties.AppendChild(new FontSize { Val = run.Item2.Size });
+ if (run.Item2.Bold)
+ {
+ properties.AppendChild(new Bold());
+ }
+ docRun.AppendChild(properties);
+
+ docRun.AppendChild(new Text { Text = run.Item1, Space = SpaceProcessingModeValues.Preserve });
+
+ docParagraph.AppendChild(docRun);
+ }
+
+ TableCell docCell = new TableCell();
+ docCell.AppendChild(docParagraph);
+ docRow.AppendChild(docCell);
+ }
+ _lastTable.AppendChild(docRow);
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/OrderLogic.cs b/MotorPlant/MotorPlantBusinessLogic/OrderLogic.cs
index 7b27063..ca5c183 100644
--- a/MotorPlant/MotorPlantBusinessLogic/OrderLogic.cs
+++ b/MotorPlant/MotorPlantBusinessLogic/OrderLogic.cs
@@ -12,11 +12,13 @@ namespace MotorPlantBusinessLogic.BusinessLogics
{
private readonly ILogger _logger;
private readonly IOrderStorage _orderStorage;
+ private readonly IShopStorage _shopStorage;
- public OrderLogic(ILogger logger, IOrderStorage orderStorage)
+ public OrderLogic(ILogger logger, IOrderStorage orderStorage, IShopStorage shopStorage)
{
_logger = logger;
_orderStorage = orderStorage;
+ _shopStorage = shopStorage;
}
public List? ReadList(OrderSearchModel? model)
@@ -42,7 +44,6 @@ namespace MotorPlantBusinessLogic.BusinessLogics
if (_orderStorage.Insert(model) == null)
{
- model.Status = OrderStatus.Неизвестен;
_logger.LogWarning("Insert operation failed");
return false;
}
@@ -51,57 +52,34 @@ namespace MotorPlantBusinessLogic.BusinessLogics
public bool TakeOrderInWork(OrderBindingModel model)
{
- return ToNextStatus(model, OrderStatus.Выполняется);
+ return ChangeStatus(model, OrderStatus.Выполняется);
}
public bool FinishOrder(OrderBindingModel model)
{
- return ToNextStatus(model, OrderStatus.Готов);
+ return ChangeStatus(model, OrderStatus.Готов);
}
public bool DeliveryOrder(OrderBindingModel model)
{
- return ToNextStatus(model, OrderStatus.Выдан);
- }
-
- public bool ToNextStatus(OrderBindingModel model, OrderStatus orderStatus)
- {
- CheckModel(model, false);
- var element = _orderStorage.GetElement(new OrderSearchModel()
+ var order = _orderStorage.GetElement(new OrderSearchModel
{
Id = model.Id
});
- if (element == null)
+ if (order == null)
{
- throw new ArgumentNullException(nameof(element));
+ throw new ArgumentNullException(nameof(order));
}
- model.EngineId = element.EngineId;
- model.DateCreate = element.DateCreate;
- model.DateImplement = element.DateImplement;
- model.Status = element.Status;
- model.Count = element.Count;
- model.Sum = element.Sum;
-
- if (model.Status != orderStatus - 1)
+ if (!_shopStorage.RestockingShops(new SupplyBindingModel
{
- _logger.LogWarning("Status update to " + orderStatus + " operation failed");
- return false;
- }
- model.Status = orderStatus;
-
- if (model.Status == OrderStatus.Выдан)
+ EngineId = order.EngineId,
+ Count = order.Count
+ }))
{
- model.DateImplement = DateTime.Now;
+ throw new ArgumentException("Недостаточно места");
}
-
- if (_orderStorage.Update(model) == null)
- {
- model.Status--;
- _logger.LogWarning("Changing status operation faled");
- return false;
- }
- return true;
+ return ChangeStatus(model, OrderStatus.Выдан);
}
private void CheckModel(OrderBindingModel model, bool withParams = true)
@@ -116,17 +94,51 @@ namespace MotorPlantBusinessLogic.BusinessLogics
}
if (model.Count <= 0)
{
- throw new ArgumentNullException("Количество изделий должно быть больше 0", nameof(model.Count));
+ throw new ArgumentException("Колличество пиццы в заказе не может быть меньше 1", nameof(model.Count));
}
if (model.Sum <= 0)
{
- throw new ArgumentNullException("Цена заказа должна быть больше 0", nameof(model.Sum));
+ throw new ArgumentException("Стоимость заказа на может быть меньше 1", nameof(model.Sum));
}
if (model.DateImplement.HasValue && model.DateImplement < model.DateCreate)
{
- throw new ArithmeticException($"Дата выдачи заказа {model.DateImplement} должна быть позже даты его создания {model.DateCreate}");
+ throw new ArithmeticException($"Дата выдачи заказа {model.DateImplement} не может быть раньше даты его создания {model.DateCreate}");
}
- _logger.LogInformation("Engine. EngineId:{EngineId}.Count:{Count}.Sum:{Sum}Id:{Id}", model.EngineId, model.Count, model.Sum, model.Id);
+ _logger.LogInformation("Engine. EngineId:{EngineId}.Count:{Count}.Sum:{Sum}Id:{Id}",
+ model.EngineId, model.Count, model.Sum, model.Id);
+ }
+
+ private bool ChangeStatus(OrderBindingModel model, OrderStatus requiredStatus)
+ {
+ CheckModel(model, false);
+ var element = _orderStorage.GetElement(new OrderSearchModel()
+ {
+ Id = model.Id
+ });
+ if (element == null)
+ {
+ throw new ArgumentNullException(nameof(element));
+ }
+ model.DateCreate = element.DateCreate;
+ model.EngineId = element.EngineId;
+ model.DateImplement = element.DateImplement;
+ model.Status = element.Status;
+ model.Count = element.Count;
+ model.Sum = element.Sum;
+ if (requiredStatus - model.Status == 1)
+ {
+ model.Status = requiredStatus;
+ if (model.Status == OrderStatus.Выдан)
+ model.DateImplement = DateTime.Now;
+ if (_orderStorage.Update(model) == null)
+ {
+ _logger.LogWarning("Update operation failed");
+ return false;
+ }
+ return true;
+ }
+ _logger.LogWarning("Changing status operation faled: Current-{Status}:required-{requiredStatus}.", model.Status, requiredStatus);
+ throw new ArgumentException($"Невозможно присвоить статус {requiredStatus} заказу с текущим статусом {model.Status}");
}
}
}
diff --git a/MotorPlant/MotorPlantBusinessLogic/ReportLogic.cs b/MotorPlant/MotorPlantBusinessLogic/ReportLogic.cs
new file mode 100644
index 0000000..9e68ba6
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/ReportLogic.cs
@@ -0,0 +1,134 @@
+using MotorPlantBusinessLogic.OfficePackage.HelperModels;
+using MotorPlantBusinessLogic.OfficePackage;
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.BusinessLogicsContracts;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.StoragesContracts;
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic
+{
+ public class ReportLogic : IReportLogic
+ {
+ private readonly IEngineStorage _EngineStorage;
+ private readonly IOrderStorage _orderStorage;
+ private readonly IShopStorage _shopStorage;
+ private readonly AbstractSaveToExcel _saveToExcel;
+ private readonly AbstractSaveToWord _saveToWord;
+ private readonly AbstractSaveToPdf _saveToPdf;
+ public ReportLogic(IEngineStorage EngineStorage, IComponentStorage componentStorage, IOrderStorage orderStorage, IShopStorage shopStorage, AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord, AbstractSaveToPdf saveToPdf)
+ {
+ _EngineStorage = EngineStorage;
+ _orderStorage = orderStorage;
+ _shopStorage = shopStorage;
+ _saveToExcel = saveToExcel;
+ _saveToWord = saveToWord;
+ _saveToPdf = saveToPdf;
+ }
+ public List GetEngineComponents()
+ {
+ return _EngineStorage.GetFullList().Select(x => new ReportEngineComponentViewModel
+ {
+ EngineName = x.EngineName,
+ Components = x.EngineComponents.Select(x => (x.Value.Item1.ComponentName, x.Value.Item2)).ToList(),
+ TotalCount = x.EngineComponents.Select(x => x.Value.Item2).Sum()
+ }).ToList();
+ }
+ public List GetOrders(ReportBindingModel model)
+ {
+ return _orderStorage.GetFilteredList(new OrderSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo })
+ .Select(x => new ReportOrdersViewModel
+ {
+ Id = x.Id,
+ DateCreate = x.DateCreate,
+ EngineName = x.EngineName,
+ Sum = x.Sum,
+ OrderStatus = x.Status.ToString()
+ })
+ .ToList();
+ }
+ public void SaveEnginesToWordFile(ReportBindingModel model)
+ {
+ _saveToWord.CreateEngineDoc(new WordInfo
+ {
+ FileName = model.FileName,
+ Title = "Список двигателей",
+ Engines = _EngineStorage.GetFullList()
+ });
+ }
+ public void SaveEngineComponentToExcelFile(ReportBindingModel model)
+ {
+ _saveToExcel.CreateReport(new ExcelInfo
+ {
+ FileName = model.FileName,
+ Title = "Список компонентов",
+ EngineComponents = GetEngineComponents()
+ });
+ }
+ public void SaveOrdersToPdfFile(ReportBindingModel model)
+ {
+ _saveToPdf.CreateDoc(new PdfInfo
+ {
+ FileName = model.FileName,
+ Title = "Список заказов",
+ DateFrom = model.DateFrom!.Value,
+ DateTo = model.DateTo!.Value,
+ Orders = GetOrders(model)
+ });
+ }
+ public List GetShops()
+ {
+ return _shopStorage.GetFullList().Select(x => new ReportShopsViewModel
+ {
+ ShopName = x.ShopName,
+ Engines = x.ShopEngines.Select(x => (x.Value.Item1.EngineName, x.Value.Item2)).ToList(),
+ TotalCount = x.ShopEngines.Select(x => x.Value.Item2).Sum()
+ }).ToList();
+ }
+
+ public List GetGroupedOrders()
+ {
+ return _orderStorage.GetFullList().GroupBy(x => x.DateCreate.Date).Select(x => new ReportGroupOrdersViewModel
+ {
+ Date = x.Key,
+ OrdersCount = x.Count(),
+ OrdersSum = x.Select(y => y.Sum).Sum()
+ }).ToList();
+ }
+
+ public void SaveShopsToWordFile(ReportBindingModel model)
+ {
+ _saveToWord.CreateShopsDoc(new WordShopInfo
+ {
+ FileName = model.FileName,
+ Title = "Список магазинов",
+ Shops = _shopStorage.GetFullList()
+ });
+ }
+
+ public void SaveShopsToExcelFile(ReportBindingModel model)
+ {
+ _saveToExcel.CreateShopEnginesReport(new ExcelShop
+ {
+ FileName = model.FileName,
+ Title = "Наполненость магазинов",
+ ShopEngines = GetShops()
+ });
+ }
+
+ public void SaveGroupedOrdersToPdfFile(ReportBindingModel model)
+ {
+ _saveToPdf.CreateGroupedOrdersDoc(new PdfGroupedOrdersInfo
+ {
+ FileName = model.FileName,
+ Title = "Список заказов сгруппированных по дате заказов",
+ GroupedOrders = GetGroupedOrders()
+ });
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantBusinessLogic/ShopLogic.cs b/MotorPlant/MotorPlantBusinessLogic/ShopLogic.cs
new file mode 100644
index 0000000..23b0d0f
--- /dev/null
+++ b/MotorPlant/MotorPlantBusinessLogic/ShopLogic.cs
@@ -0,0 +1,181 @@
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.BusinessLogicsContracts;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.StoragesContracts;
+using MotorPlantContracts.ViewModels;
+using System.Threading.Tasks;
+
+namespace MotorPlantBusinessLogic.BusinessLogics
+{
+ public class ShopLogic : IShopLogic
+ {
+ private readonly ILogger _logger;
+ private readonly IShopStorage _shopStorage;
+ private readonly IEngineStorage _EngineStorage;
+ public ShopLogic(ILogger logger, IShopStorage shopStorage, IEngineStorage EngineStorage)
+ {
+ _logger = logger;
+ _shopStorage = shopStorage;
+ _EngineStorage = EngineStorage;
+ }
+ public List? 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 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 bool Create(ShopBindingModel model)
+ {
+ CheckModel(model);
+ if (_shopStorage.Insert(model) == null)
+ {
+ _logger.LogWarning("Insert operation failed");
+ return false;
+ }
+ return true;
+ }
+ public bool Update(ShopBindingModel model)
+ {
+ CheckModel(model);
+ if (_shopStorage.Update(model) == null)
+ {
+ _logger.LogWarning("Update 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 bool MakeSupply(SupplyBindingModel model)
+ {
+ if (model == null)
+ {
+ throw new ArgumentNullException(nameof(model));
+ }
+ if (model.Count <= 0)
+ {
+ throw new ArgumentException("Количество изделий должно быть больше 0");
+ }
+ var shop = _shopStorage.GetElement(new ShopSearchModel
+ {
+ Id = model.ShopId
+ });
+ if (shop == null)
+ {
+ throw new ArgumentException("Магазина не существует");
+ }
+ if (shop.ShopEngines.ContainsKey(model.EngineId))
+ {
+ var oldValue = shop.ShopEngines[model.EngineId];
+ oldValue.Item2 += model.Count;
+ shop.ShopEngines[model.EngineId] = oldValue;
+ }
+ else
+ {
+ var Engine = _EngineStorage.GetElement(new EngineSearchModel
+ {
+ Id = model.EngineId
+ });
+ if (Engine == null)
+ {
+ throw new ArgumentException($"Поставка: Товар с id:{model.EngineId} не найденн");
+ }
+ if (shop.ShopEngines.Sum(kv => kv.Value.Item2) + model.Count > shop.EngineMaxCount)
+ {
+ throw new ArgumentException("Превышена максимальная вместимость магазина");
+ }
+ shop.ShopEngines.Add(model.EngineId, (Engine, model.Count));
+ }
+ _shopStorage.Update(new ShopBindingModel()
+ {
+ Id = shop.Id,
+ ShopName = shop.ShopName,
+ Adress = shop.Adress,
+ OpeningDate = shop.OpeningDate,
+ ShopEngines = shop.ShopEngines,
+ EngineMaxCount = shop.EngineMaxCount,
+ });
+
+ 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.Adress))
+ {
+ throw new ArgumentException("Адрес магазина длжен быть заполнен", nameof(model.Adress));
+ }
+ if (string.IsNullOrEmpty(model.ShopName))
+ {
+ throw new ArgumentException("Название магазина должно быть заполнено", nameof(model.ShopName));
+ }
+ _logger.LogInformation("Shop. ShopName:{ShopName}.Adres:{Adres}.OpeningDate:{OpeningDate}.Id:{ Id}", model.ShopName, model.Adress, model.OpeningDate, model.Id);
+ var element = _shopStorage.GetElement(new ShopSearchModel
+ {
+ ShopName = model.ShopName
+ });
+ if (element != null && element.Id != model.Id)
+ {
+ throw new InvalidOperationException("Магазин с таким названием уже есть");
+ }
+ }
+ public bool Sale(SupplySearchModel model)
+ {
+ if (!model.EngineId.HasValue || !model.Count.HasValue)
+ {
+ return false;
+ }
+ _logger.LogInformation("Check Engine count in all shops");
+ if (_shopStorage.Sale(model))
+ {
+ _logger.LogInformation("Selling sucsess");
+ return true;
+ }
+ _logger.LogInformation("Selling failed");
+ return false;
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/BindingModels/ReportBindingModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/ReportBindingModel.cs
new file mode 100644
index 0000000..94ff460
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/BindingModels/ReportBindingModel.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.BindingModels
+{
+ public class ReportBindingModel
+ {
+ public string FileName { get; set; } = string.Empty;
+ public DateTime? DateFrom { get; set; }
+ public DateTime? DateTo { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/BindingModels/ShopBindingModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/ShopBindingModel.cs
new file mode 100644
index 0000000..89a323e
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/BindingModels/ShopBindingModel.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MotorPlantDataModels.Models;
+
+namespace MotorPlantContracts.BindingModels
+{
+ public class ShopBindingModel : IShopModel
+ {
+ public int Id { get; set; }
+ public string ShopName { get; set; } = string.Empty;
+ public string Adress { get; set; } = string.Empty;
+ public DateTime OpeningDate { get; set; } = DateTime.Now;
+ public Dictionary ShopEngines { get; set; } = new();
+ public int EngineMaxCount { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/BindingModels/SupplyBindingModel.cs b/MotorPlant/MotorPlantContracts/BindingModels/SupplyBindingModel.cs
new file mode 100644
index 0000000..c9a7a3e
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/BindingModels/SupplyBindingModel.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using MotorPlantDataModels.Models;
+
+namespace MotorPlantContracts.BindingModels
+{
+ public class SupplyBindingModel : ISupplyModel
+ {
+ public int ShopId { get; set; }
+ public int EngineId { get; set; }
+ public int Count { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IReportLogic.cs b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IReportLogic.cs
new file mode 100644
index 0000000..ebb43d8
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IReportLogic.cs
@@ -0,0 +1,24 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.BusinessLogicsContracts
+{
+ public interface IReportLogic
+ {
+ List GetEngineComponents();
+ List GetOrders(ReportBindingModel model);
+ List GetShops();
+ List GetGroupedOrders();
+ void SaveEnginesToWordFile(ReportBindingModel model);
+ void SaveEngineComponentToExcelFile(ReportBindingModel model);
+ void SaveOrdersToPdfFile(ReportBindingModel model);
+ void SaveShopsToWordFile(ReportBindingModel model);
+ void SaveShopsToExcelFile(ReportBindingModel model);
+ void SaveGroupedOrdersToPdfFile(ReportBindingModel model);
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IShopLogic.cs b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IShopLogic.cs
new file mode 100644
index 0000000..d2b2694
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/BusinessLogicsContracts/IShopLogic.cs
@@ -0,0 +1,22 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.BusinessLogicsContracts
+{
+ public interface IShopLogic
+ {
+ List? ReadList(ShopSearchModel? model);
+ ShopViewModel? ReadElement(ShopSearchModel model);
+ bool Create(ShopBindingModel model);
+ bool Update(ShopBindingModel model);
+ bool Delete(ShopBindingModel model);
+ bool MakeSupply(SupplyBindingModel model);
+ bool Sale(SupplySearchModel model);
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/SearchModels/OrderSearchModel.cs b/MotorPlant/MotorPlantContracts/SearchModels/OrderSearchModel.cs
index 2255ebd..f185c8f 100644
--- a/MotorPlant/MotorPlantContracts/SearchModels/OrderSearchModel.cs
+++ b/MotorPlant/MotorPlantContracts/SearchModels/OrderSearchModel.cs
@@ -3,5 +3,7 @@
public class OrderSearchModel
{
public int? Id { get; set; }
+ public DateTime? DateFrom { get; set; }
+ public DateTime? DateTo { get; set; }
}
}
diff --git a/MotorPlant/MotorPlantContracts/SearchModels/ShopSearchModel.cs b/MotorPlant/MotorPlantContracts/SearchModels/ShopSearchModel.cs
new file mode 100644
index 0000000..3ab99aa
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/SearchModels/ShopSearchModel.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.SearchModels
+{
+ public class ShopSearchModel
+ {
+ public int? Id { get; set; }
+ public string? ShopName { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/SearchModels/SupplySearchModel.cs b/MotorPlant/MotorPlantContracts/SearchModels/SupplySearchModel.cs
new file mode 100644
index 0000000..b7dc7e7
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/SearchModels/SupplySearchModel.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.SearchModels
+{
+ public class SupplySearchModel
+ {
+ public int? EngineId { get; set; }
+ public int? Count { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/StoragesContracts/IShopStorage.cs b/MotorPlant/MotorPlantContracts/StoragesContracts/IShopStorage.cs
new file mode 100644
index 0000000..bd578e9
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/StoragesContracts/IShopStorage.cs
@@ -0,0 +1,23 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.StoragesContracts
+{
+ public interface IShopStorage
+ {
+ List GetFullList();
+ List GetFilteredList(ShopSearchModel model);
+ ShopViewModel? GetElement(ShopSearchModel model);
+ ShopViewModel? Insert(ShopBindingModel model);
+ ShopViewModel? Update(ShopBindingModel model);
+ ShopViewModel? Delete(ShopBindingModel model);
+ bool Sale(SupplySearchModel model);
+ bool RestockingShops(SupplyBindingModel model);
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ReportEngineComponentViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ReportEngineComponentViewModel.cs
new file mode 100644
index 0000000..ae6cb5d
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/ViewModels/ReportEngineComponentViewModel.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.ViewModels
+{
+ public class ReportEngineComponentViewModel
+ {
+ public string EngineName { get; set; } = string.Empty;
+ public int TotalCount { get; set; }
+ public List<(string Component, int Count)> Components { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ReportGroupOrdersViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ReportGroupOrdersViewModel.cs
new file mode 100644
index 0000000..8c98eee
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/ViewModels/ReportGroupOrdersViewModel.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.ViewModels
+{
+ public class ReportGroupOrdersViewModel
+ {
+ public DateTime Date { get; set; } = DateTime.Now;
+ public int OrdersCount { get; set; }
+ public double OrdersSum { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ReportOrdersViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ReportOrdersViewModel.cs
new file mode 100644
index 0000000..8d7ee4a
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/ViewModels/ReportOrdersViewModel.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.ViewModels
+{
+ public class ReportOrdersViewModel
+ {
+ public int Id { get; set; }
+ public DateTime DateCreate { get; set; }
+ public string EngineName { get; set; } = string.Empty;
+ public string OrderStatus { get; set; } = string.Empty;
+ public double Sum { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ReportShopsViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ReportShopsViewModel.cs
new file mode 100644
index 0000000..fc4f1d2
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/ViewModels/ReportShopsViewModel.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.ViewModels
+{
+ public class ReportShopsViewModel
+ {
+ public string ShopName { get; set; } = string.Empty;
+ public int TotalCount { get; set; }
+ public List<(string Engine, int count)> Engines { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantContracts/ViewModels/ShopViewModel.cs b/MotorPlant/MotorPlantContracts/ViewModels/ShopViewModel.cs
new file mode 100644
index 0000000..c5bc8c6
--- /dev/null
+++ b/MotorPlant/MotorPlantContracts/ViewModels/ShopViewModel.cs
@@ -0,0 +1,24 @@
+using MotorPlantDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantContracts.ViewModels
+{
+ public class ShopViewModel : IShopModel
+ {
+ public int Id { get; set; }
+ [DisplayName("Название")]
+ public string ShopName { get; set; } = string.Empty;
+ [DisplayName("Адрес")]
+ public string Adress { get; set; } = string.Empty;
+ [DisplayName("Дата открытия")]
+ public DateTime OpeningDate { get; set; }
+ public Dictionary ShopEngines { get; set; } = new();
+ [DisplayName("Вместимость")]
+ public int EngineMaxCount { get; set; }
+ }
+}
diff --git a/MotorPlant/MotorPlantDataModels/IShopModel.cs b/MotorPlant/MotorPlantDataModels/IShopModel.cs
new file mode 100644
index 0000000..6a4ef33
--- /dev/null
+++ b/MotorPlant/MotorPlantDataModels/IShopModel.cs
@@ -0,0 +1,19 @@
+using MotorPlantDataModels;
+using MotorPlantDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantDataModels.Models
+{
+ public interface IShopModel : IId
+ {
+ string ShopName { get; }
+ string Adress { get; }
+ DateTime OpeningDate { get; }
+ Dictionary ShopEngines { get; }
+ public int EngineMaxCount { get; }
+ }
+}
diff --git a/MotorPlant/MotorPlantDataModels/ISupplyModel.cs b/MotorPlant/MotorPlantDataModels/ISupplyModel.cs
new file mode 100644
index 0000000..f243749
--- /dev/null
+++ b/MotorPlant/MotorPlantDataModels/ISupplyModel.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantDataModels.Models
+{
+ public interface ISupplyModel
+ {
+ int ShopId { get; }
+ int EngineId { get; }
+ int Count { get; }
+ }
+}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/Engine.cs b/MotorPlant/MotorPlantDatabaseImplement/Engine.cs
index 8a51aae..004be91 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/Engine.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/Engine.cs
@@ -33,6 +33,8 @@ namespace MotorPlantDatabaseImplement.Models
public virtual List Components { get; set; } = new();
[ForeignKey("EngineId")]
public virtual List Orders { get; set; } = new();
+ [ForeignKey("EngineId")]
+ public virtual List ShopEngines { get; set; } = new();
public static Engine Create(MotorPlantDataBase context,
EngineBindingModel model)
{
diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240308215333_InitialCreate.Designer.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240526093112_InitialCreate.Designer.cs
similarity index 66%
rename from MotorPlant/MotorPlantDatabaseImplement/Migrations/20240308215333_InitialCreate.Designer.cs
rename to MotorPlant/MotorPlantDatabaseImplement/Migrations/20240526093112_InitialCreate.Designer.cs
index 9e32da0..8be0e19 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240308215333_InitialCreate.Designer.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240526093112_InitialCreate.Designer.cs
@@ -12,7 +12,7 @@ using MotorPlantDatabaseImplement;
namespace MotorPlantDatabaseImplement.Migrations
{
[DbContext(typeof(MotorPlantDataBase))]
- [Migration("20240308215333_InitialCreate")]
+ [Migration("20240526093112_InitialCreate")]
partial class InitialCreate
{
///
@@ -20,7 +20,7 @@ namespace MotorPlantDatabaseImplement.Migrations
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "8.0.2")
+ .HasAnnotation("ProductVersion", "7.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
@@ -124,6 +124,59 @@ namespace MotorPlantDatabaseImplement.Migrations
b.ToTable("Orders");
});
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Shop", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Adress")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("EngineMaxCount")
+ .HasColumnType("int");
+
+ b.Property("OpeningDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ShopName")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Shops");
+ });
+
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.ShopEngines", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Count")
+ .HasColumnType("int");
+
+ b.Property("EngineId")
+ .HasColumnType("int");
+
+ b.Property("ShopId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EngineId");
+
+ b.HasIndex("ShopId");
+
+ b.ToTable("ShopEngines");
+ });
+
modelBuilder.Entity("MotorPlantDatabaseImplement.Models.EngineComponent", b =>
{
b.HasOne("MotorPlantDatabaseImplement.Models.Component", "Component")
@@ -145,11 +198,32 @@ namespace MotorPlantDatabaseImplement.Migrations
modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Order", b =>
{
- b.HasOne("MotorPlantDatabaseImplement.Models.Engine", null)
+ b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine")
.WithMany("Orders")
.HasForeignKey("EngineId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
+
+ b.Navigation("Engine");
+ });
+
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.ShopEngines", b =>
+ {
+ b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine")
+ .WithMany("ShopEngines")
+ .HasForeignKey("EngineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("MotorPlantDatabaseImplement.Models.Shop", "Shop")
+ .WithMany("Engines")
+ .HasForeignKey("ShopId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Engine");
+
+ b.Navigation("Shop");
});
modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Component", b =>
@@ -162,6 +236,13 @@ namespace MotorPlantDatabaseImplement.Migrations
b.Navigation("Components");
b.Navigation("Orders");
+
+ b.Navigation("ShopEngines");
+ });
+
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Shop", b =>
+ {
+ b.Navigation("Engines");
});
#pragma warning restore 612, 618
}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240308215333_InitialCreate.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240526093112_InitialCreate.cs
similarity index 65%
rename from MotorPlant/MotorPlantDatabaseImplement/Migrations/20240308215333_InitialCreate.cs
rename to MotorPlant/MotorPlantDatabaseImplement/Migrations/20240526093112_InitialCreate.cs
index a857529..7d58d29 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240308215333_InitialCreate.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/Migrations/20240526093112_InitialCreate.cs
@@ -39,6 +39,22 @@ namespace MotorPlantDatabaseImplement.Migrations
table.PrimaryKey("PK_Engines", x => x.Id);
});
+ migrationBuilder.CreateTable(
+ name: "Shops",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ ShopName = table.Column(type: "nvarchar(max)", nullable: false),
+ Adress = table.Column(type: "nvarchar(max)", nullable: false),
+ OpeningDate = table.Column(type: "datetime2", nullable: false),
+ EngineMaxCount = table.Column(type: "int", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Shops", x => x.Id);
+ });
+
migrationBuilder.CreateTable(
name: "EngineComponents",
columns: table => new
@@ -72,12 +88,12 @@ namespace MotorPlantDatabaseImplement.Migrations
{
Id = table.Column(type: "int", nullable: false)
.Annotation("SqlServer:Identity", "1, 1"),
+ EngineId = table.Column(type: "int", nullable: false),
Count = table.Column(type: "int", nullable: false),
Sum = table.Column(type: "float", nullable: false),
Status = table.Column(type: "int", nullable: false),
DateCreate = table.Column(type: "datetime2", nullable: false),
- DateImplement = table.Column(type: "datetime2", nullable: true),
- EngineId = table.Column(type: "int", nullable: false)
+ DateImplement = table.Column(type: "datetime2", nullable: true)
},
constraints: table =>
{
@@ -90,6 +106,33 @@ namespace MotorPlantDatabaseImplement.Migrations
onDelete: ReferentialAction.Cascade);
});
+ migrationBuilder.CreateTable(
+ name: "ShopEngines",
+ columns: table => new
+ {
+ Id = table.Column(type: "int", nullable: false)
+ .Annotation("SqlServer:Identity", "1, 1"),
+ EngineId = table.Column(type: "int", nullable: false),
+ ShopId = table.Column(type: "int", nullable: false),
+ Count = table.Column(type: "int", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ShopEngines", x => x.Id);
+ table.ForeignKey(
+ name: "FK_ShopEngines_Engines_EngineId",
+ column: x => x.EngineId,
+ principalTable: "Engines",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ table.ForeignKey(
+ name: "FK_ShopEngines_Shops_ShopId",
+ column: x => x.ShopId,
+ principalTable: "Shops",
+ principalColumn: "Id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
migrationBuilder.CreateIndex(
name: "IX_EngineComponents_ComponentId",
table: "EngineComponents",
@@ -104,6 +147,16 @@ namespace MotorPlantDatabaseImplement.Migrations
name: "IX_Orders_EngineId",
table: "Orders",
column: "EngineId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ShopEngines_EngineId",
+ table: "ShopEngines",
+ column: "EngineId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_ShopEngines_ShopId",
+ table: "ShopEngines",
+ column: "ShopId");
}
///
@@ -115,11 +168,17 @@ namespace MotorPlantDatabaseImplement.Migrations
migrationBuilder.DropTable(
name: "Orders");
+ migrationBuilder.DropTable(
+ name: "ShopEngines");
+
migrationBuilder.DropTable(
name: "Components");
migrationBuilder.DropTable(
name: "Engines");
+
+ migrationBuilder.DropTable(
+ name: "Shops");
}
}
}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/Migrations/MotorPlantDataBaseModelSnapshot.cs b/MotorPlant/MotorPlantDatabaseImplement/Migrations/MotorPlantDataBaseModelSnapshot.cs
index 7479b8f..16cbd04 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/Migrations/MotorPlantDataBaseModelSnapshot.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/Migrations/MotorPlantDataBaseModelSnapshot.cs
@@ -17,7 +17,7 @@ namespace MotorPlantDatabaseImplement.Migrations
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "8.0.2")
+ .HasAnnotation("ProductVersion", "7.0.3")
.HasAnnotation("Relational:MaxIdentifierLength", 128);
SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
@@ -121,6 +121,59 @@ namespace MotorPlantDatabaseImplement.Migrations
b.ToTable("Orders");
});
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Shop", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Adress")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.Property("EngineMaxCount")
+ .HasColumnType("int");
+
+ b.Property("OpeningDate")
+ .HasColumnType("datetime2");
+
+ b.Property("ShopName")
+ .IsRequired()
+ .HasColumnType("nvarchar(max)");
+
+ b.HasKey("Id");
+
+ b.ToTable("Shops");
+ });
+
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.ShopEngines", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int");
+
+ SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property("Id"));
+
+ b.Property("Count")
+ .HasColumnType("int");
+
+ b.Property("EngineId")
+ .HasColumnType("int");
+
+ b.Property("ShopId")
+ .HasColumnType("int");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EngineId");
+
+ b.HasIndex("ShopId");
+
+ b.ToTable("ShopEngines");
+ });
+
modelBuilder.Entity("MotorPlantDatabaseImplement.Models.EngineComponent", b =>
{
b.HasOne("MotorPlantDatabaseImplement.Models.Component", "Component")
@@ -142,11 +195,32 @@ namespace MotorPlantDatabaseImplement.Migrations
modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Order", b =>
{
- b.HasOne("MotorPlantDatabaseImplement.Models.Engine", null)
+ b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine")
.WithMany("Orders")
.HasForeignKey("EngineId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
+
+ b.Navigation("Engine");
+ });
+
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.ShopEngines", b =>
+ {
+ b.HasOne("MotorPlantDatabaseImplement.Models.Engine", "Engine")
+ .WithMany("ShopEngines")
+ .HasForeignKey("EngineId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("MotorPlantDatabaseImplement.Models.Shop", "Shop")
+ .WithMany("Engines")
+ .HasForeignKey("ShopId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Engine");
+
+ b.Navigation("Shop");
});
modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Component", b =>
@@ -159,6 +233,13 @@ namespace MotorPlantDatabaseImplement.Migrations
b.Navigation("Components");
b.Navigation("Orders");
+
+ b.Navigation("ShopEngines");
+ });
+
+ modelBuilder.Entity("MotorPlantDatabaseImplement.Models.Shop", b =>
+ {
+ b.Navigation("Engines");
});
#pragma warning restore 612, 618
}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDataBase.cs b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDataBase.cs
index 41ab4eb..3da7819 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDataBase.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDataBase.cs
@@ -16,7 +16,7 @@ optionsBuilder)
{
if (optionsBuilder.IsConfigured == false)
{
- optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-ETBGTEE;Initial Catalog=MotorPlantDatabase;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True");
+ optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-ETBGTEE;Initial Catalog=MotorPlantHard;Integrated Security=True;MultipleActiveResultSets=True;;TrustServerCertificate=True");
}
base.OnConfiguring(optionsBuilder);
}
@@ -24,6 +24,7 @@ optionsBuilder)
public virtual DbSet Engines { set; get; }
public virtual DbSet EngineComponents { set; get; }
public virtual DbSet Orders { set; get; }
-
+ public virtual DbSet Shops { get; set; }
+ public virtual DbSet ShopEngines { get; set; }
}
}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj
index d68950d..4c47a25 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj
+++ b/MotorPlant/MotorPlantDatabaseImplement/MotorPlantDatabaseImplement.csproj
@@ -1,15 +1,15 @@
- net8.0
+ net6.0
enable
enable
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/MotorPlant/MotorPlantDatabaseImplement/Order.cs b/MotorPlant/MotorPlantDatabaseImplement/Order.cs
index 811f955..c3b3da7 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/Order.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/Order.cs
@@ -3,6 +3,7 @@ using MotorPlantContracts.ViewModels;
using MotorPlantDataModels.Enums;
using MotorPlantDataModels.Models;
using System.ComponentModel.DataAnnotations;
+using System.Diagnostics;
namespace MotorPlantDatabaseImplement.Models
{
@@ -10,18 +11,19 @@ namespace MotorPlantDatabaseImplement.Models
{
public int Id { get; private set; }
[Required]
+ public int EngineId { get; private set; }
+ public virtual Engine Engine { get; set; } = new();
+ [Required]
public int Count { get; private set; }
[Required]
public double Sum { get; private set; }
[Required]
- public OrderStatus Status { get; private set; }
+ public OrderStatus Status { get; private set; } = OrderStatus.Неизвестен;
[Required]
- public DateTime DateCreate { get; private set; }
+ public DateTime DateCreate { get; private set; } = DateTime.Now;
public DateTime? DateImplement { get; private set; }
- [Required]
- public int EngineId { get; private set; }
- public static Order? Create(OrderBindingModel model)
+ public static Order Create(MotorPlantDataBase context, OrderBindingModel model)
{
if (model == null)
{
@@ -30,12 +32,13 @@ namespace MotorPlantDatabaseImplement.Models
return new Order()
{
Id = model.Id,
+ EngineId = model.EngineId,
+ Engine = context.Engines.First(x => x.Id == model.EngineId),
Count = model.Count,
Sum = model.Sum,
Status = model.Status,
DateCreate = model.DateCreate,
DateImplement = model.DateImplement,
- EngineId = model.EngineId,
};
}
@@ -51,14 +54,14 @@ namespace MotorPlantDatabaseImplement.Models
public OrderViewModel GetViewModel => new()
{
+ Id = Id,
EngineId = EngineId,
+ EngineName = Engine.EngineName,
Count = Count,
Sum = Sum,
Status = Status,
DateCreate = DateCreate,
DateImplement = DateImplement,
- Id = Id,
};
-
}
}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/OrderStorage.cs b/MotorPlant/MotorPlantDatabaseImplement/OrderStorage.cs
index 1f12ebe..271ef10 100644
--- a/MotorPlant/MotorPlantDatabaseImplement/OrderStorage.cs
+++ b/MotorPlant/MotorPlantDatabaseImplement/OrderStorage.cs
@@ -1,8 +1,10 @@
-using MotorPlantContracts.BindingModels;
+using Microsoft.EntityFrameworkCore;
+using MotorPlantContracts.BindingModels;
using MotorPlantContracts.SearchModels;
using MotorPlantContracts.StoragesContracts;
using MotorPlantContracts.ViewModels;
using MotorPlantDatabaseImplement.Models;
+using Microsoft.EntityFrameworkCore;
namespace MotorPlantDatabaseImplement.Implements
{
@@ -11,84 +13,67 @@ namespace MotorPlantDatabaseImplement.Implements
public List GetFullList()
{
using var context = new MotorPlantDataBase();
- return context.Orders
- .Select(x => AccessEngineStorage(x.GetViewModel))
- .ToList();
+ return context.Orders.Include(x => x.Engine).Select(x => x.GetViewModel).ToList();
}
public List GetFilteredList(OrderSearchModel model)
+ {
+ if (!model.Id.HasValue || !model.DateFrom.HasValue || !model.DateTo.HasValue)
+ {
+ return new();
+ }
+ using var context = new MotorPlantDataBase();
+ if (model.DateFrom.HasValue)
+ {
+ return context.Orders.Include(x => x.Engine).Where(x => x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo).Select(x => x.GetViewModel).ToList();
+ }
+ return context.Orders.Include(x => x.Engine).Where(x => x.Id == model.Id).Select(x => x.GetViewModel).ToList();
+ }
+ public OrderViewModel? GetElement(OrderSearchModel model)
{
if (!model.Id.HasValue)
{
return new();
}
using var context = new MotorPlantDataBase();
- return context.Orders
- .Where(x => x.Id == model.Id)
- .Select(x => AccessEngineStorage(x.GetViewModel))
- .ToList();
- }
- public OrderViewModel? GetElement(OrderSearchModel model)
- {
- if (!model.Id.HasValue)
- {
- return null;
- }
- using var context = new MotorPlantDataBase();
- return AccessEngineStorage(context.Orders.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel);
+ return context.Orders.Include(x => x.Engine).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel;
}
public OrderViewModel? Insert(OrderBindingModel model)
{
- var newOrder = Order.Create(model);
+ using var context = new MotorPlantDataBase();
+ if (model == null)
+ return null;
+ var newOrder = Order.Create(context, model);
if (newOrder == null)
{
return null;
}
- using var context = new MotorPlantDataBase();
context.Orders.Add(newOrder);
context.SaveChanges();
- return AccessEngineStorage(newOrder.GetViewModel);
+ return newOrder.GetViewModel;
}
public OrderViewModel? Update(OrderBindingModel model)
{
using var context = new MotorPlantDataBase();
- var order = context.Orders.FirstOrDefault(x => x.Id ==
- model.Id);
+ var order = context.Orders.FirstOrDefault(x => x.Id == model.Id);
if (order == null)
{
return null;
}
order.Update(model);
context.SaveChanges();
- return AccessEngineStorage(order.GetViewModel);
+ return order.GetViewModel;
}
public OrderViewModel? Delete(OrderBindingModel model)
{
using var context = new MotorPlantDataBase();
- var element = context.Orders.FirstOrDefault(rec => rec.Id ==
- model.Id);
- if (element != null)
+ var order = context.Orders.FirstOrDefault(rec => rec.Id == model.Id);
+ if (order != null)
{
- context.Orders.Remove(element);
+ context.Orders.Remove(order);
context.SaveChanges();
- return AccessEngineStorage(element.GetViewModel);
+ return order.GetViewModel;
}
return null;
}
-
- public static OrderViewModel AccessEngineStorage(OrderViewModel model)
- {
- if (model == null)
- return null;
- using var context = new MotorPlantDataBase();
- foreach (var Engine in context.Engines)
- {
- if (Engine.Id == model.EngineId)
- {
- model.EngineName = Engine.EngineName;
- break;
- }
- }
- return model;
- }
}
}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/Shop.cs b/MotorPlant/MotorPlantDatabaseImplement/Shop.cs
new file mode 100644
index 0000000..14bfc5c
--- /dev/null
+++ b/MotorPlant/MotorPlantDatabaseImplement/Shop.cs
@@ -0,0 +1,119 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.ViewModels;
+using MotorPlantDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantDatabaseImplement.Models
+{
+ public class Shop : IShopModel
+ {
+ public int Id { get; set; }
+ public string ShopName { get; set; } = string.Empty;
+
+ public string Adress { get; set; } = string.Empty;
+
+ public DateTime OpeningDate { get; set; }
+
+ public int EngineMaxCount { get; set; }
+
+ private Dictionary? _shopEngines = null;
+
+ public Dictionary ShopEngines
+ {
+ get
+ {
+ if (_shopEngines == null)
+ {
+ if (_shopEngines == null)
+ {
+ _shopEngines = Engines
+ .ToDictionary(recSP => recSP.EngineId, recSP => (recSP.Engine as IEngineModel, recSP.Count));
+ }
+ return _shopEngines;
+ }
+ return _shopEngines;
+ }
+ }
+
+ [ForeignKey("ShopId")]
+ public List Engines { get; set; } = new();
+
+ public static Shop Create(MotorPlantDataBase context, ShopBindingModel model)
+ {
+ return new Shop()
+ {
+ Id = model.Id,
+ ShopName = model.ShopName,
+ Adress = model.Adress,
+ OpeningDate = model.OpeningDate,
+ Engines = model.ShopEngines.Select(x => new ShopEngines
+ {
+ Engine = context.Engines.First(y => y.Id == x.Key),
+ Count = x.Value.Item2
+ }).ToList(),
+ EngineMaxCount = model.EngineMaxCount
+ };
+ }
+
+ public void Update(ShopBindingModel model)
+ {
+ ShopName = model.ShopName;
+ Adress = model.Adress;
+ OpeningDate = model.OpeningDate;
+ EngineMaxCount = model.EngineMaxCount;
+ }
+
+ public ShopViewModel GetViewModel => new()
+ {
+ Id = Id,
+ ShopName = ShopName,
+ Adress = Adress,
+ OpeningDate = OpeningDate,
+ ShopEngines = ShopEngines,
+ EngineMaxCount = EngineMaxCount
+ };
+
+ public void UpdateEngines(MotorPlantDataBase context, ShopBindingModel model)
+ {
+ var ShopEngines = context.ShopEngines.Where(rec => rec.ShopId == model.Id).ToList();
+ if (ShopEngines != null && ShopEngines.Count > 0)
+ {
+ context.ShopEngines.RemoveRange(ShopEngines.Where(rec => !model.ShopEngines.ContainsKey(rec.EngineId)));
+ context.SaveChanges();
+ ShopEngines = context.ShopEngines.Where(rec => rec.ShopId == model.Id).ToList();
+ foreach (var updateEngine in ShopEngines)
+ {
+ updateEngine.Count = model.ShopEngines[updateEngine.EngineId].Item2;
+ model.ShopEngines.Remove(updateEngine.EngineId);
+ }
+ context.SaveChanges();
+ }
+ var shop = context.Shops.First(x => x.Id == Id);
+ foreach (var ar in model.ShopEngines)
+ {
+ context.ShopEngines.Add(new ShopEngines
+ {
+ Shop = shop,
+ Engine = context.Engines.First(x => x.Id == ar.Key),
+ Count = ar.Value.Item2
+ });
+ context.SaveChanges();
+ }
+ _shopEngines = null;
+ }
+
+ public void EnginesDictionatyUpdate(MotorPlantDataBase context)
+ {
+ UpdateEngines(context, new ShopBindingModel
+ {
+ Id = Id,
+ ShopEngines = ShopEngines,
+ });
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/ShopEngines.cs b/MotorPlant/MotorPlantDatabaseImplement/ShopEngines.cs
new file mode 100644
index 0000000..252fa48
--- /dev/null
+++ b/MotorPlant/MotorPlantDatabaseImplement/ShopEngines.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.ComponentModel.DataAnnotations;
+
+namespace MotorPlantDatabaseImplement.Models
+{
+ public class ShopEngines
+ {
+ public int Id { get; set; }
+
+ [Required]
+ public int EngineId { get; set; }
+
+ [Required]
+ public int ShopId { get; set; }
+
+ [Required]
+ public int Count { get; set; }
+
+ public virtual Shop Shop { get; set; } = new();
+
+ public virtual Engine Engine { get; set; } = new();
+ }
+}
diff --git a/MotorPlant/MotorPlantDatabaseImplement/ShopStorage.cs b/MotorPlant/MotorPlantDatabaseImplement/ShopStorage.cs
new file mode 100644
index 0000000..61d9d34
--- /dev/null
+++ b/MotorPlant/MotorPlantDatabaseImplement/ShopStorage.cs
@@ -0,0 +1,182 @@
+using Microsoft.EntityFrameworkCore;
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.StoragesContracts;
+using MotorPlantContracts.ViewModels;
+using MotorPlantDatabaseImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantDatabaseImplement.Implements
+{
+ public class ShopStorage : IShopStorage
+ {
+ public List GetFullList()
+ {
+ using var context = new MotorPlantDataBase();
+ return context.Shops.Include(x => x.Engines).ThenInclude(x => x.Engine).ToList().
+ Select(x => x.GetViewModel).ToList();
+ }
+ public List GetFilteredList(ShopSearchModel model)
+ {
+ if (string.IsNullOrEmpty(model.ShopName))
+ {
+ return new();
+ }
+ using var context = new MotorPlantDataBase();
+ return context.Shops.Include(x => x.Engines).ThenInclude(x => x.Engine).Where(x => x.ShopName.Contains(model.ShopName)).
+ ToList().Select(x => x.GetViewModel).ToList();
+ }
+ public ShopViewModel? GetElement(ShopSearchModel model)
+ {
+ if (string.IsNullOrEmpty(model.ShopName) && !model.Id.HasValue)
+ {
+ return new();
+ }
+ using var context = new MotorPlantDataBase();
+ return context.Shops.Include(x => x.Engines).ThenInclude(x => x.Engine)
+ .FirstOrDefault(x =>
+ (!string.IsNullOrEmpty(model.ShopName) && x.ShopName == model.ShopName) ||
+ (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
+ }
+ public ShopViewModel? Insert(ShopBindingModel model)
+ {
+ using var context = new MotorPlantDataBase();
+ var newShop = Shop.Create(context, model);
+ if (newShop == null)
+ {
+ return null;
+ }
+ context.Shops.Add(newShop);
+ context.SaveChanges();
+ return newShop.GetViewModel;
+ }
+ public ShopViewModel? Update(ShopBindingModel model)
+ {
+ using var context = new MotorPlantDataBase();
+ using var transaction = context.Database.BeginTransaction();
+ try
+ {
+ var shop = context.Shops.FirstOrDefault(x => x.Id == model.Id);
+ if (shop == null)
+ {
+ return null;
+ }
+ shop.Update(model);
+ context.SaveChanges();
+ shop.UpdateEngines(context, model);
+ transaction.Commit();
+ return shop.GetViewModel;
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+ public ShopViewModel? Delete(ShopBindingModel model)
+ {
+ using var context = new MotorPlantDataBase();
+ var shop = context.Shops.Include(x => x.Engines).FirstOrDefault(x => x.Id == model.Id);
+ if (shop != null)
+ {
+ context.Shops.Remove(shop);
+ context.SaveChanges();
+ return shop.GetViewModel;
+ }
+ return null;
+ }
+ public bool RestockingShops(SupplyBindingModel model)
+ {
+ using var context = new MotorPlantDataBase();
+ var transaction = context.Database.BeginTransaction();
+ var Shops = context.Shops.Include(x => x.Engines).ThenInclude(x => x.Engine).ToList().
+ Where(x => x.EngineMaxCount > x.ShopEngines.Select(x => x.Value.Item2).Sum()).ToList();
+ if (model == null)
+ {
+ return false;
+ }
+ try
+ {
+ foreach (Shop shop in Shops)
+ {
+ int difference = shop.EngineMaxCount - shop.ShopEngines.Select(x => x.Value.Item2).Sum();
+ int refill = Math.Min(difference, model.Count);
+ model.Count -= refill;
+ if (shop.ShopEngines.ContainsKey(model.EngineId))
+ {
+ var datePair = shop.ShopEngines[model.EngineId];
+ datePair.Item2 += refill;
+ shop.ShopEngines[model.EngineId] = datePair;
+ }
+ else
+ {
+ var Engine = context.Engines.First(x => x.Id == model.EngineId);
+ shop.ShopEngines.Add(model.EngineId, (Engine, refill));
+ }
+ shop.EnginesDictionatyUpdate(context);
+ if (model.Count == 0)
+ {
+ transaction.Commit();
+ return true;
+ }
+ }
+ transaction.Rollback();
+ return false;
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+ public bool Sale(SupplySearchModel model)
+ {
+ using var context = new MotorPlantDataBase();
+ var transaction = context.Database.BeginTransaction();
+ try
+ {
+ var shops = context.Shops.Include(x => x.Engines).ThenInclude(x => x.Engine).ToList().
+ Where(x => x.ShopEngines.ContainsKey(model.EngineId.Value)).OrderByDescending(x => x.ShopEngines[model.EngineId.Value].Item2).ToList();
+
+ foreach (var shop in shops)
+ {
+ int residue = model.Count.Value - shop.ShopEngines[model.EngineId.Value].Item2;
+ if (residue > 0)
+ {
+ shop.ShopEngines.Remove(model.EngineId.Value);
+ shop.EnginesDictionatyUpdate(context);
+ context.SaveChanges();
+ model.Count = residue;
+
+ }
+ else
+ {
+ if (residue == 0)
+ shop.ShopEngines.Remove(model.EngineId.Value);
+ else
+ {
+ var dataPair = shop.ShopEngines[model.EngineId.Value];
+ dataPair.Item2 = -residue;
+ shop.ShopEngines[model.EngineId.Value] = dataPair;
+ }
+
+ shop.EnginesDictionatyUpdate(context);
+ transaction.Commit();
+ return true;
+ }
+ }
+ transaction.Rollback();
+ return false;
+ }
+ catch
+ {
+ transaction.Rollback();
+ throw;
+ }
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantFileImplement/DataFileSingleton.cs b/MotorPlant/MotorPlantFileImplement/DataFileSingleton.cs
index a448669..c5610e4 100644
--- a/MotorPlant/MotorPlantFileImplement/DataFileSingleton.cs
+++ b/MotorPlant/MotorPlantFileImplement/DataFileSingleton.cs
@@ -9,9 +9,11 @@ namespace MotorPlantFileImplement
private readonly string ComponentFileName = "Component.xml";
private readonly string OrderFileName = "Order.xml";
private readonly string EngineFileName = "Engine.xml";
+ private readonly string ShopFileName = "Shop.xml";
public List Components { get; private set; }
public List Orders { get; private set; }
public List Engines { get; private set; }
+ public List Shops { get; private set; }
public static DataFileSingleton GetInstance()
{
if (instance == null)
@@ -23,11 +25,13 @@ namespace MotorPlantFileImplement
public void SaveComponents() => SaveData(Components, ComponentFileName, "Components", x => x.GetXElement);
public void SaveEngines() => SaveData(Engines, EngineFileName, "Engines", x => x.GetXElement);
public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement);
+ public void SaveShops() => SaveData(Shops, ShopFileName, "Shops", x => x.GetXElement);
private DataFileSingleton()
{
Components = LoadData(ComponentFileName, "Component", x => Component.Create(x)!)!;
Engines = LoadData(EngineFileName, "Engine", x => Engine.Create(x)!)!;
Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!;
+ Shops = LoadData(ShopFileName, "Shop", x => Shop.Create(x)!)!;
}
private static List? LoadData(string filename, string xmlNodeName, Func selectFunction)
{
diff --git a/MotorPlant/MotorPlantFileImplement/Shop.cs b/MotorPlant/MotorPlantFileImplement/Shop.cs
new file mode 100644
index 0000000..344360d
--- /dev/null
+++ b/MotorPlant/MotorPlantFileImplement/Shop.cs
@@ -0,0 +1,103 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.ViewModels;
+using MotorPlantDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace MotorPlantFileImplement.Models
+{
+ public class Shop : IShopModel
+ {
+ public int Id { get; private set; }
+ public string ShopName { get; private set; } = string.Empty;
+ public string Adress { get; private set; } = string.Empty;
+ public DateTime OpeningDate { get; private set; }
+ public Dictionary Engines { get; private set; } = new();
+ private Dictionary? _shopEngines = null;
+ public Dictionary ShopEngines
+ {
+ get
+ {
+ if (_shopEngines == null)
+ {
+ var source = DataFileSingleton.GetInstance();
+ _shopEngines = Engines.ToDictionary(x => x.Key, y => ((source.Engines.FirstOrDefault(z => z.Id == y.Key) as IEngineModel)!, y.Value));
+ }
+ return _shopEngines;
+ }
+ }
+ public int EngineMaxCount { get; private set; }
+ public static Shop? Create(ShopBindingModel? model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ return new Shop()
+ {
+ Id = model.Id,
+ ShopName = model.ShopName,
+ Adress = model.Adress,
+ OpeningDate = model.OpeningDate,
+ Engines = model.ShopEngines.ToDictionary(x => x.Key, x => x.Value.Item2),
+ EngineMaxCount = model.EngineMaxCount
+ };
+ }
+ 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,
+ Adress = element.Element("Adress")!.Value,
+ OpeningDate = Convert.ToDateTime(element.Element("OpeningDate")!.Value),
+ Engines = element.Element("ShopEngines")!.Elements("ShopEngine")!.ToDictionary(x => Convert.ToInt32(x.Element("Key")?.Value),
+ x => Convert.ToInt32(x.Element("Value")?.Value)),
+ EngineMaxCount = Convert.ToInt32(element.Element("EngineMaxCount")!.Value)
+ };
+ }
+ public void Update(ShopBindingModel? model)
+ {
+ if (model == null)
+ {
+ return;
+ }
+ ShopName = model.ShopName;
+ Adress = model.Adress;
+ OpeningDate = model.OpeningDate;
+ EngineMaxCount = model.EngineMaxCount;
+ Engines = model.ShopEngines.ToDictionary(x => x.Key, x => x.Value.Item2);
+ _shopEngines = null;
+ }
+ public ShopViewModel GetViewModel => new()
+ {
+ Id = Id,
+ ShopName = ShopName,
+ Adress = Adress,
+ OpeningDate = OpeningDate,
+ ShopEngines = ShopEngines,
+ EngineMaxCount = EngineMaxCount
+ };
+ public XElement GetXElement => new("Shop",
+ new XAttribute("Id", Id),
+ new XElement("ShopName", ShopName),
+ new XElement("Adress", Adress),
+ new XElement("OpeningDate", OpeningDate.ToString()),
+ new XElement("ShopEngines", Engines.Select(
+ x => new XElement("ShopEngine", new XElement("Key", x.Key), new XElement("Value", x.Value))).ToArray()),
+ new XElement("EngineMaxCount", EngineMaxCount.ToString())
+ );
+ public void EnginesUpdate()
+ {
+ _shopEngines = null;
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantFileImplement/ShopStorage.cs b/MotorPlant/MotorPlantFileImplement/ShopStorage.cs
new file mode 100644
index 0000000..7323c04
--- /dev/null
+++ b/MotorPlant/MotorPlantFileImplement/ShopStorage.cs
@@ -0,0 +1,145 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.StoragesContracts;
+using MotorPlantContracts.ViewModels;
+using MotorPlantFileImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantFileImplement.Implements
+{
+ public class ShopStorage : IShopStorage
+ {
+ private readonly DataFileSingleton source;
+ public ShopStorage()
+ {
+ source = DataFileSingleton.GetInstance();
+ }
+ public List GetFullList()
+ {
+ return source.Shops.Select(x => x.GetViewModel).ToList();
+ }
+ public List 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 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 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 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;
+ }
+ public ShopViewModel? Delete(ShopBindingModel model)
+ {
+ var shop = source.Shops.FirstOrDefault(x => x.Id == model.Id);
+ if (shop != null)
+ {
+ source.Shops.Remove(shop);
+ source.SaveShops();
+ return shop.GetViewModel;
+ }
+ return null;
+ }
+ public bool Sale(SupplySearchModel model)
+ {
+ if (model == null || !model.EngineId.HasValue || !model.Count.HasValue)
+ return false;
+ int remainingSpace = source.Shops.Select(x => x.Engines.ContainsKey(model.EngineId.Value) ? x.Engines[model.EngineId.Value] : 0).Sum();
+ if (remainingSpace < model.Count)
+ {
+ return false;
+ }
+ var shops = source.Shops.Where(x => x.Engines.ContainsKey(model.EngineId.Value)).OrderByDescending(x => x.Engines[model.EngineId.Value]).ToList();
+ foreach (var shop in shops)
+ {
+ int residue = model.Count.Value - shop.Engines[model.EngineId.Value];
+ if (residue > 0)
+ {
+ shop.Engines.Remove(model.EngineId.Value);
+ shop.EnginesUpdate();
+ model.Count = residue;
+ }
+ else
+ {
+ if (residue == 0)
+ {
+ shop.Engines.Remove(model.EngineId.Value);
+ }
+ else
+ {
+ shop.Engines[model.EngineId.Value] = -residue;
+ }
+ shop.EnginesUpdate();
+ source.SaveShops();
+ return true;
+ }
+ }
+ source.SaveShops();
+ return false;
+ }
+ public bool RestockingShops(SupplyBindingModel model)
+ {
+ if (model == null || source.Shops.Select(x => x.EngineMaxCount - x.ShopEngines.Select(y => y.Value.Item2).Sum()).Sum() < model.Count)
+ {
+ return false;
+ }
+ foreach (Shop shop in source.Shops)
+ {
+ int free_places = shop.EngineMaxCount - shop.ShopEngines.Select(x => x.Value.Item2).Sum();
+ if (free_places <= 0)
+ continue;
+ free_places = Math.Min(free_places, model.Count);
+ model.Count -= free_places;
+ if (shop.Engines.ContainsKey(model.EngineId))
+ {
+ shop.Engines[model.EngineId] += free_places;
+ }
+ else
+ {
+ shop.Engines.Add(model.EngineId, free_places);
+ }
+ shop.EnginesUpdate();
+ if (model.Count == 0)
+ {
+ source.SaveShops();
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantListImplement/DataListSingleton.cs b/MotorPlant/MotorPlantListImplement/DataListSingleton.cs
index 5fedd98..c1ee27d 100644
--- a/MotorPlant/MotorPlantListImplement/DataListSingleton.cs
+++ b/MotorPlant/MotorPlantListImplement/DataListSingleton.cs
@@ -8,11 +8,13 @@ namespace MotorPlantListImplement
public List Components { get; set; }
public List Orders { get; set; }
public List Engines { get; set; }
+ public List Shops { get; set; }
private DataListSingleton()
{
Components = new List();
Orders = new List();
Engines = new List();
+ Shops = new List();
}
public static DataListSingleton GetInstance()
{
diff --git a/MotorPlant/MotorPlantListImplement/Shop.cs b/MotorPlant/MotorPlantListImplement/Shop.cs
new file mode 100644
index 0000000..3ec70c1
--- /dev/null
+++ b/MotorPlant/MotorPlantListImplement/Shop.cs
@@ -0,0 +1,56 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.ViewModels;
+using MotorPlantDataModels.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantListImplement.Models
+{
+ public class Shop : IShopModel
+ {
+ public int Id { get; private set; }
+ public string ShopName { get; private set; } = string.Empty;
+ public string Adress { get; private set; } = string.Empty;
+ public DateTime OpeningDate { get; private set; }
+ public Dictionary ShopEngines { get; private set; } = new();
+ public int EngineMaxCount { get; private set; }
+ public static Shop? Create(ShopBindingModel? model)
+ {
+ if (model == null)
+ {
+ return null;
+ }
+ return new Shop()
+ {
+ Id = model.Id,
+ ShopName = model.ShopName,
+ Adress = model.Adress,
+ OpeningDate = model.OpeningDate,
+ EngineMaxCount = model.EngineMaxCount,
+ };
+ }
+ public void Update(ShopBindingModel? model)
+ {
+ if (model == null)
+ {
+ return;
+ }
+ ShopName = model.ShopName;
+ Adress = model.Adress;
+ OpeningDate = model.OpeningDate;
+ EngineMaxCount = model.EngineMaxCount;
+ }
+ public ShopViewModel GetViewModel => new()
+ {
+ Id = Id,
+ ShopName = ShopName,
+ Adress = Adress,
+ OpeningDate = OpeningDate,
+ ShopEngines = ShopEngines,
+ EngineMaxCount = EngineMaxCount,
+ };
+ }
+}
diff --git a/MotorPlant/MotorPlantListImplement/ShopStorage.cs b/MotorPlant/MotorPlantListImplement/ShopStorage.cs
new file mode 100644
index 0000000..7206dc5
--- /dev/null
+++ b/MotorPlant/MotorPlantListImplement/ShopStorage.cs
@@ -0,0 +1,114 @@
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.SearchModels;
+using MotorPlantContracts.StoragesContracts;
+using MotorPlantContracts.ViewModels;
+using MotorPlantListImplement.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace MotorPlantListImplement.Implements
+{
+ public class ShopStorage : IShopStorage
+ {
+ private readonly DataListSingleton _source;
+ public ShopStorage()
+ {
+ _source = DataListSingleton.GetInstance();
+ }
+ public List GetFullList()
+ {
+ var result = new List();
+ foreach (var shop in _source.Shops)
+ {
+ result.Add(shop.GetViewModel);
+ }
+ return result;
+ }
+ public List GetFilteredList(ShopSearchModel model)
+ {
+ var result = new List();
+ if (string.IsNullOrEmpty(model.ShopName))
+ {
+ return result;
+ }
+ foreach (var shop in _source.Shops)
+ {
+ if (shop.ShopName.Contains(model.ShopName))
+ {
+ result.Add(shop.GetViewModel);
+ }
+ }
+ return result;
+ }
+ 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 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 ShopViewModel? Update(ShopBindingModel model)
+ {
+ foreach (var shop in _source.Shops)
+ {
+ if (shop.Id == model.Id)
+ {
+ shop.Update(model);
+ return shop.GetViewModel;
+ }
+ }
+ return null;
+ }
+ 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 bool Sale(SupplySearchModel model)
+ {
+ throw new NotImplementedException();
+ }
+ public bool RestockingShops(SupplyBindingModel model)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantView/FormCreateOrder.Designer.cs b/MotorPlant/MotorPlantView/FormCreateOrder.Designer.cs
index 68432d4..46a8d99 100644
--- a/MotorPlant/MotorPlantView/FormCreateOrder.Designer.cs
+++ b/MotorPlant/MotorPlantView/FormCreateOrder.Designer.cs
@@ -28,117 +28,123 @@
///
private void InitializeComponent()
{
- label1 = new Label();
- label2 = new Label();
- label3 = new Label();
- textBoxCount = new TextBox();
- comboBoxEngine = new ComboBox();
- textBoxSum = new TextBox();
- buttonSave = new Button();
- buttonCancel = new Button();
- SuspendLayout();
+ this.labelEngine = new System.Windows.Forms.Label();
+ this.comboBoxEngine = new System.Windows.Forms.ComboBox();
+ this.labelCount = new System.Windows.Forms.Label();
+ this.textBoxCount = new System.Windows.Forms.TextBox();
+ this.labelSum = new System.Windows.Forms.Label();
+ this.textBoxSum = new System.Windows.Forms.TextBox();
+ this.buttonCancel = new System.Windows.Forms.Button();
+ this.buttonSave = new System.Windows.Forms.Button();
+ this.SuspendLayout();
//
- // label1
+ // labelEngine
//
- label1.AutoSize = true;
- label1.Location = new Point(19, 12);
- label1.Name = "label1";
- label1.Size = new Size(56, 15);
- label1.TabIndex = 0;
- label1.Text = "Изделие:";
- //
- // label2
- //
- label2.AutoSize = true;
- label2.Location = new Point(19, 44);
- label2.Name = "label2";
- label2.Size = new Size(75, 15);
- label2.TabIndex = 1;
- label2.Text = "Количество:";
- //
- // label3
- //
- label3.AutoSize = true;
- label3.Location = new Point(19, 70);
- label3.Name = "label3";
- label3.Size = new Size(48, 15);
- label3.TabIndex = 2;
- label3.Text = "Сумма:";
- //
- // textBoxCount
- //
- textBoxCount.Location = new Point(103, 41);
- textBoxCount.Name = "textBoxCount";
- textBoxCount.Size = new Size(246, 23);
- textBoxCount.TabIndex = 3;
- textBoxCount.TextChanged += textBoxCount_TextChanged;
+ this.labelEngine.AutoSize = true;
+ this.labelEngine.Location = new System.Drawing.Point(10, 11);
+ this.labelEngine.Name = "labelEngine";
+ this.labelEngine.Size = new System.Drawing.Size(43, 15);
+ this.labelEngine.TabIndex = 0;
+ this.labelEngine.Text = "Пицца";
//
// comboBoxEngine
//
- comboBoxEngine.FormattingEnabled = true;
- comboBoxEngine.Location = new Point(103, 10);
- comboBoxEngine.Name = "comboBoxEngine";
- comboBoxEngine.Size = new Size(246, 23);
- comboBoxEngine.TabIndex = 4;
- comboBoxEngine.SelectedIndexChanged += ComboBoxEngine_SelectedIndexChanged;
+ this.comboBoxEngine.FormattingEnabled = true;
+ this.comboBoxEngine.Location = new System.Drawing.Point(101, 9);
+ this.comboBoxEngine.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.comboBoxEngine.Name = "comboBoxEngine";
+ this.comboBoxEngine.Size = new System.Drawing.Size(314, 23);
+ this.comboBoxEngine.TabIndex = 1;
+ this.comboBoxEngine.SelectedIndexChanged += new System.EventHandler(this.ComboBoxEngine_SelectedIndexChanged);
+ //
+ // labelCount
+ //
+ this.labelCount.AutoSize = true;
+ this.labelCount.Location = new System.Drawing.Point(10, 37);
+ this.labelCount.Name = "labelCount";
+ this.labelCount.Size = new System.Drawing.Size(78, 15);
+ this.labelCount.TabIndex = 2;
+ this.labelCount.Text = "Количество: ";
+ //
+ // textBoxCount
+ //
+ this.textBoxCount.Location = new System.Drawing.Point(101, 34);
+ this.textBoxCount.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.textBoxCount.Name = "textBoxCount";
+ this.textBoxCount.Size = new System.Drawing.Size(314, 23);
+ this.textBoxCount.TabIndex = 3;
+ this.textBoxCount.TextChanged += new System.EventHandler(this.TextBoxCount_TextChanged);
+ //
+ // labelSum
+ //
+ this.labelSum.AutoSize = true;
+ this.labelSum.Location = new System.Drawing.Point(10, 60);
+ this.labelSum.Name = "labelSum";
+ this.labelSum.Size = new System.Drawing.Size(51, 15);
+ this.labelSum.TabIndex = 4;
+ this.labelSum.Text = "Сумма: ";
//
// textBoxSum
//
- textBoxSum.Location = new Point(103, 70);
- textBoxSum.Name = "textBoxSum";
- textBoxSum.ReadOnly = true;
- textBoxSum.Size = new Size(246, 23);
- textBoxSum.TabIndex = 5;
- //
- // buttonSave
- //
- buttonSave.Location = new Point(150, 101);
- buttonSave.Name = "buttonSave";
- buttonSave.Size = new Size(94, 26);
- buttonSave.TabIndex = 6;
- buttonSave.Text = "Сохранить";
- buttonSave.UseVisualStyleBackColor = true;
- buttonSave.Click += buttonSave_Click;
+ this.textBoxSum.Location = new System.Drawing.Point(101, 60);
+ this.textBoxSum.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.textBoxSum.Name = "textBoxSum";
+ this.textBoxSum.ReadOnly = true;
+ this.textBoxSum.Size = new System.Drawing.Size(314, 23);
+ this.textBoxSum.TabIndex = 5;
//
// buttonCancel
//
- buttonCancel.Location = new Point(249, 101);
- buttonCancel.Name = "buttonCancel";
- buttonCancel.Size = new Size(94, 26);
- buttonCancel.TabIndex = 7;
- buttonCancel.Text = "Отмена";
- buttonCancel.UseVisualStyleBackColor = true;
- buttonCancel.Click += buttonCancel_Click;
+ this.buttonCancel.Location = new System.Drawing.Point(295, 85);
+ this.buttonCancel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(96, 24);
+ this.buttonCancel.TabIndex = 6;
+ this.buttonCancel.Text = "Отмена";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click);
+ //
+ // buttonSave
+ //
+ this.buttonSave.Location = new System.Drawing.Point(193, 85);
+ this.buttonSave.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.buttonSave.Name = "buttonSave";
+ this.buttonSave.Size = new System.Drawing.Size(96, 24);
+ this.buttonSave.TabIndex = 7;
+ this.buttonSave.Text = "Сохранить";
+ this.buttonSave.UseVisualStyleBackColor = true;
+ this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
//
// FormCreateOrder
//
- AutoScaleDimensions = new SizeF(7F, 15F);
- AutoScaleMode = AutoScaleMode.Font;
- ClientSize = new Size(374, 136);
- Controls.Add(buttonCancel);
- Controls.Add(buttonSave);
- Controls.Add(textBoxSum);
- Controls.Add(comboBoxEngine);
- Controls.Add(textBoxCount);
- Controls.Add(label3);
- Controls.Add(label2);
- Controls.Add(label1);
- Name = "FormCreateOrder";
- Text = "Заказ";
- Load += FormCreateOrder_Load;
- ResumeLayout(false);
- PerformLayout();
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(424, 118);
+ this.Controls.Add(this.buttonSave);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.textBoxSum);
+ this.Controls.Add(this.labelSum);
+ this.Controls.Add(this.textBoxCount);
+ this.Controls.Add(this.labelCount);
+ this.Controls.Add(this.comboBoxEngine);
+ this.Controls.Add(this.labelEngine);
+ this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
+ this.Name = "FormCreateOrder";
+ this.Text = "Заказ";
+ this.Load += new System.EventHandler(this.FormCreateOrder_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
}
#endregion
- private Label label1;
- private Label label2;
- private Label label3;
- private TextBox textBoxCount;
+ private Label labelEngine;
private ComboBox comboBoxEngine;
+ private Label labelCount;
+ private TextBox textBoxCount;
+ private Label labelSum;
private TextBox textBoxSum;
- private Button buttonSave;
private Button buttonCancel;
+ private Button buttonSave;
}
}
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/FormCreateOrder.cs b/MotorPlant/MotorPlantView/FormCreateOrder.cs
index 46256b1..271498a 100644
--- a/MotorPlant/MotorPlantView/FormCreateOrder.cs
+++ b/MotorPlant/MotorPlantView/FormCreateOrder.cs
@@ -2,6 +2,7 @@
using MotorPlantContracts.BindingModels;
using MotorPlantContracts.SearchModels;
using MotorPlantContracts.BusinessLogicsContracts;
+using MotorPlantContracts.ViewModels;
namespace MotorPlantView.Forms
{
@@ -10,6 +11,7 @@ namespace MotorPlantView.Forms
private readonly ILogger _logger;
private readonly IEngineLogic _logicP;
private readonly IOrderLogic _logicO;
+ private List? _list;
public FormCreateOrder(ILogger logger, IEngineLogic logicP, IOrderLogic logicO)
{
InitializeComponent();
@@ -20,21 +22,14 @@ namespace MotorPlantView.Forms
private void FormCreateOrder_Load(object sender, EventArgs e)
{
- try
+ _list = _logicP.ReadList(null);
+ if (_list != null)
{
- var list = _logicP.ReadList(null);
- if (list != null)
- {
- comboBoxEngine.DisplayMember = "EngineName";
- comboBoxEngine.ValueMember = "Id";
- comboBoxEngine.DataSource = list;
- comboBoxEngine.SelectedItem = null;
- _logger.LogInformation("Загрузка изделий для заказа");
- }
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Ошибка загрузки списка изделий");
+ comboBoxEngine.DisplayMember = "EngineName";
+ comboBoxEngine.ValueMember = "Id";
+ comboBoxEngine.DataSource = _list;
+ comboBoxEngine.SelectedItem = null;
+ _logger.LogInformation("Загрузка двигателей для заказа");
}
}
private void CalcSum()
@@ -59,7 +54,7 @@ namespace MotorPlantView.Forms
}
}
}
- private void textBoxCount_TextChanged(object sender, EventArgs e)
+ private void TextBoxCount_TextChanged(object sender, EventArgs e)
{
CalcSum();
}
@@ -69,7 +64,7 @@ namespace MotorPlantView.Forms
CalcSum();
}
- private void buttonSave_Click(object sender, EventArgs e)
+ private void ButtonSave_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBoxCount.Text))
{
@@ -78,7 +73,7 @@ namespace MotorPlantView.Forms
}
if (comboBoxEngine.SelectedValue == null)
{
- MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show("Выберите двигатель", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
_logger.LogInformation("Создание заказа");
@@ -100,11 +95,12 @@ namespace MotorPlantView.Forms
}
catch (Exception ex)
{
- _logger.LogError(ex, "Ошибка создания заказа"); MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ _logger.LogError(ex, "Ошибка создания заказа");
+ MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
- private void buttonCancel_Click(object sender, EventArgs e)
+ private void ButtonCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
diff --git a/MotorPlant/MotorPlantView/FormCreateSupply.Designer.cs b/MotorPlant/MotorPlantView/FormCreateSupply.Designer.cs
new file mode 100644
index 0000000..d66a9fb
--- /dev/null
+++ b/MotorPlant/MotorPlantView/FormCreateSupply.Designer.cs
@@ -0,0 +1,143 @@
+namespace MotorPlantView.Forms
+{
+ partial class FormCreateSupply
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.comboBoxShop = new System.Windows.Forms.ComboBox();
+ this.labelShop = new System.Windows.Forms.Label();
+ this.labelEngine = new System.Windows.Forms.Label();
+ this.comboBoxEngine = new System.Windows.Forms.ComboBox();
+ this.labelCount = new System.Windows.Forms.Label();
+ this.textBoxCount = new System.Windows.Forms.TextBox();
+ this.buttonCancel = new System.Windows.Forms.Button();
+ this.buttonSave = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // comboBoxShop
+ //
+ this.comboBoxShop.FormattingEnabled = true;
+ this.comboBoxShop.Location = new System.Drawing.Point(115, 12);
+ this.comboBoxShop.Name = "comboBoxShop";
+ this.comboBoxShop.Size = new System.Drawing.Size(344, 28);
+ this.comboBoxShop.TabIndex = 0;
+ //
+ // labelShop
+ //
+ this.labelShop.AutoSize = true;
+ this.labelShop.Location = new System.Drawing.Point(12, 15);
+ this.labelShop.Name = "labelShop";
+ this.labelShop.Size = new System.Drawing.Size(76, 20);
+ this.labelShop.TabIndex = 1;
+ this.labelShop.Text = "Магазин: ";
+ //
+ // labelEngine
+ //
+ this.labelEngine.AutoSize = true;
+ this.labelEngine.Location = new System.Drawing.Point(12, 49);
+ this.labelEngine.Name = "labelEngine";
+ this.labelEngine.Size = new System.Drawing.Size(75, 20);
+ this.labelEngine.TabIndex = 2;
+ this.labelEngine.Text = "Изделие: ";
+ //
+ // comboBoxEngine
+ //
+ this.comboBoxEngine.FormattingEnabled = true;
+ this.comboBoxEngine.Location = new System.Drawing.Point(115, 46);
+ this.comboBoxEngine.Name = "comboBoxEngine";
+ this.comboBoxEngine.Size = new System.Drawing.Size(344, 28);
+ this.comboBoxEngine.TabIndex = 3;
+ //
+ // labelCount
+ //
+ this.labelCount.AutoSize = true;
+ this.labelCount.Location = new System.Drawing.Point(12, 83);
+ this.labelCount.Name = "labelCount";
+ this.labelCount.Size = new System.Drawing.Size(97, 20);
+ this.labelCount.TabIndex = 4;
+ this.labelCount.Text = "Количество: ";
+ //
+ // textBoxCount
+ //
+ this.textBoxCount.Location = new System.Drawing.Point(115, 80);
+ this.textBoxCount.Name = "textBoxCount";
+ this.textBoxCount.Size = new System.Drawing.Size(344, 27);
+ this.textBoxCount.TabIndex = 5;
+ //
+ // buttonCancel
+ //
+ this.buttonCancel.Location = new System.Drawing.Point(300, 113);
+ this.buttonCancel.Name = "buttonCancel";
+ this.buttonCancel.Size = new System.Drawing.Size(116, 39);
+ this.buttonCancel.TabIndex = 6;
+ this.buttonCancel.Text = "Отмена";
+ this.buttonCancel.UseVisualStyleBackColor = true;
+ this.buttonCancel.Click += new System.EventHandler(this.ButtonCancel_Click);
+ //
+ // buttonSave
+ //
+ this.buttonSave.Location = new System.Drawing.Point(168, 113);
+ this.buttonSave.Name = "buttonSave";
+ this.buttonSave.Size = new System.Drawing.Size(116, 39);
+ this.buttonSave.TabIndex = 7;
+ this.buttonSave.Text = "Сохранить";
+ this.buttonSave.UseVisualStyleBackColor = true;
+ this.buttonSave.Click += new System.EventHandler(this.ButtonSave_Click);
+ //
+ // FormCreateSupply
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(471, 164);
+ this.Controls.Add(this.buttonSave);
+ this.Controls.Add(this.buttonCancel);
+ this.Controls.Add(this.textBoxCount);
+ this.Controls.Add(this.labelCount);
+ this.Controls.Add(this.comboBoxEngine);
+ this.Controls.Add(this.labelEngine);
+ this.Controls.Add(this.labelShop);
+ this.Controls.Add(this.comboBoxShop);
+ this.Name = "FormCreateSupply";
+ this.Text = "Создание поставки";
+ this.Load += new System.EventHandler(this.FormCreateSupply_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private ComboBox comboBoxShop;
+ private Label labelShop;
+ private Label labelEngine;
+ private ComboBox comboBoxEngine;
+ private Label labelCount;
+ private TextBox textBoxCount;
+ private Button buttonCancel;
+ private Button buttonSave;
+ }
+}
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/FormCreateSupply.cs b/MotorPlant/MotorPlantView/FormCreateSupply.cs
new file mode 100644
index 0000000..888471d
--- /dev/null
+++ b/MotorPlant/MotorPlantView/FormCreateSupply.cs
@@ -0,0 +1,93 @@
+using Microsoft.Extensions.Logging;
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.BusinessLogicsContracts;
+using MotorPlantContracts.ViewModels;
+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 MotorPlantView.Forms
+{
+ public partial class FormCreateSupply : Form
+ {
+ private readonly ILogger _logger;
+ private readonly IEngineLogic _logicP;
+ private readonly IShopLogic _logicS;
+ private List _shopList = new List();
+ private List _EngineList = new List();
+ public FormCreateSupply(ILogger logger, IEngineLogic logicP, IShopLogic logicS)
+ {
+ InitializeComponent();
+ _logger = logger;
+ _logicP = logicP;
+ _logicS = logicS;
+ }
+ private void FormCreateSupply_Load(object sender, EventArgs e)
+ {
+ _shopList = _logicS.ReadList(null);
+ _EngineList = _logicP.ReadList(null);
+ if (_shopList != null)
+ {
+ comboBoxShop.DisplayMember = "ShopName";
+ comboBoxShop.ValueMember = "Id";
+ comboBoxShop.DataSource = _shopList;
+ comboBoxShop.SelectedItem = null;
+ _logger.LogInformation("Загрузка магазинов для поставок");
+ }
+ if (_EngineList != null)
+ {
+ comboBoxEngine.DisplayMember = "EngineName";
+ comboBoxEngine.ValueMember = "Id";
+ comboBoxEngine.DataSource = _EngineList;
+ comboBoxEngine.SelectedItem = null;
+ _logger.LogInformation("Загрузка путёвок для поставок");
+ }
+ }
+ private void ButtonSave_Click(object sender, EventArgs e)
+ {
+ if (comboBoxShop.SelectedValue == null)
+ {
+ MessageBox.Show("Выберите магазин", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ if (comboBoxEngine.SelectedValue == null)
+ {
+ MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ return;
+ }
+ _logger.LogInformation("Создание поставки");
+ try
+ {
+ var operationResult = _logicS.MakeSupply(new SupplyBindingModel
+ {
+ ShopId = Convert.ToInt32(comboBoxShop.SelectedValue),
+ EngineId = Convert.ToInt32(comboBoxEngine.SelectedValue),
+ Count = 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();
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantView/FormCreateSupply.resx b/MotorPlant/MotorPlantView/FormCreateSupply.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/MotorPlant/MotorPlantView/FormCreateSupply.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/FormMain.Designer.cs b/MotorPlant/MotorPlantView/FormMain.Designer.cs
index eb3bef1..69f98ed 100644
--- a/MotorPlant/MotorPlantView/FormMain.Designer.cs
+++ b/MotorPlant/MotorPlantView/FormMain.Designer.cs
@@ -31,14 +31,29 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain));
toolStrip1 = new ToolStrip();
toolStripDropDownButton1 = new ToolStripDropDownButton();
- КомпонентыToolStripMenuItem = new ToolStripMenuItem();
- ДвигателиToolStripMenuItem = new ToolStripMenuItem();
+ компонентыToolStripMenuItem = new ToolStripMenuItem();
+ ПутёвкиToolStripMenuItem = new ToolStripMenuItem();
+ магазиныToolStripMenuItem = new ToolStripMenuItem();
+ operationToolStripMenuItem = new ToolStripMenuItem();
+ transactionToolStripMenuItem = new ToolStripMenuItem();
+ продажаToolStripMenuItem = new ToolStripMenuItem();
+ отчётыToolStripMenuItem = new ToolStripMenuItem();
+ изделияToolStripMenuItem = new ToolStripMenuItem();
+ списокИзделийToolStripMenuItem = new ToolStripMenuItem();
+ пиццаСИнгридиентамиToolStripMenuItem = new ToolStripMenuItem();
+ магазинToolStripMenuItem = new ToolStripMenuItem();
+ информацияToolStripMenuItem = new ToolStripMenuItem();
+ загруженностьToolStripMenuItem = new ToolStripMenuItem();
+ заказыToolStripMenuItem = new ToolStripMenuItem();
+ заказыToolStripMenuItem1 = new ToolStripMenuItem();
+ заказыПоГруппамToolStripMenuItem = new ToolStripMenuItem();
buttonCreateOrder = new Button();
buttonTakeOrderInWork = new Button();
buttonOrderReady = new Button();
buttonIssuedOrder = new Button();
buttonRef = new Button();
dataGridView = new DataGridView();
+ отчётыToolStripMenuItem1 = new ToolStripMenuItem();
toolStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
SuspendLayout();
@@ -46,7 +61,7 @@
// toolStrip1
//
toolStrip1.ImageScalingSize = new Size(20, 20);
- toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1 });
+ toolStrip1.Items.AddRange(new ToolStripItem[] { toolStripDropDownButton1, operationToolStripMenuItem, отчётыToolStripMenuItem });
toolStrip1.Location = new Point(0, 0);
toolStrip1.Name = "toolStrip1";
toolStrip1.Size = new Size(969, 25);
@@ -56,26 +71,124 @@
// toolStripDropDownButton1
//
toolStripDropDownButton1.DisplayStyle = ToolStripItemDisplayStyle.Text;
- toolStripDropDownButton1.DropDownItems.AddRange(new ToolStripItem[] { КомпонентыToolStripMenuItem, ДвигателиToolStripMenuItem });
+ toolStripDropDownButton1.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, ПутёвкиToolStripMenuItem, магазиныToolStripMenuItem });
toolStripDropDownButton1.Image = (Image)resources.GetObject("toolStripDropDownButton1.Image");
toolStripDropDownButton1.ImageTransparentColor = Color.Magenta;
toolStripDropDownButton1.Name = "toolStripDropDownButton1";
toolStripDropDownButton1.Size = new Size(88, 22);
toolStripDropDownButton1.Text = "Справочник";
//
- // КомпонентыToolStripMenuItem
+ // компонентыToolStripMenuItem
//
- КомпонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem";
- КомпонентыToolStripMenuItem.Size = new Size(174, 22);
- КомпонентыToolStripMenuItem.Text = "Компоненты";
- КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click;
+ компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem";
+ компонентыToolStripMenuItem.Size = new Size(174, 22);
+ компонентыToolStripMenuItem.Text = "Компоненты";
+ компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click;
//
- // ДвигателиToolStripMenuItem
+ // ПутёвкиToolStripMenuItem
//
- ДвигателиToolStripMenuItem.Name = "ДвигателиToolStripMenuItem";
- ДвигателиToolStripMenuItem.Size = new Size(174, 22);
- ДвигателиToolStripMenuItem.Text = "Двигатели";
- ДвигателиToolStripMenuItem.Click += ИзделияToolStripMenuItem_Click;
+ ПутёвкиToolStripMenuItem.Name = "ПутёвкиToolStripMenuItem";
+ ПутёвкиToolStripMenuItem.Size = new Size(174, 22);
+ ПутёвкиToolStripMenuItem.Text = "Двигатели";
+ ПутёвкиToolStripMenuItem.Click += консервыToolStripMenuItem_Click;
+ //
+ // магазиныToolStripMenuItem
+ //
+ магазиныToolStripMenuItem.Name = "магазиныToolStripMenuItem";
+ магазиныToolStripMenuItem.Size = new Size(174, 22);
+ магазиныToolStripMenuItem.Text = "Магазины";
+ магазиныToolStripMenuItem.Click += shopsToolStripMenuItem_Click;
+ //
+ // operationToolStripMenuItem
+ //
+ operationToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { transactionToolStripMenuItem, продажаToolStripMenuItem, отчётыToolStripMenuItem1 });
+ operationToolStripMenuItem.Name = "operationToolStripMenuItem";
+ operationToolStripMenuItem.Size = new Size(75, 25);
+ operationToolStripMenuItem.Text = "Операции";
+ //
+ // transactionToolStripMenuItem
+ //
+ transactionToolStripMenuItem.Name = "transactionToolStripMenuItem";
+ transactionToolStripMenuItem.Size = new Size(180, 22);
+ transactionToolStripMenuItem.Text = "Поставка";
+ transactionToolStripMenuItem.Click += transactionToolStripMenuItem_Click;
+ //
+ // продажаToolStripMenuItem
+ //
+ продажаToolStripMenuItem.Name = "продажаToolStripMenuItem";
+ продажаToolStripMenuItem.Size = new Size(180, 22);
+ продажаToolStripMenuItem.Text = "Продажа";
+ продажаToolStripMenuItem.Click += SellToolStripMenuItem_Click;
+ //
+ // отчётыToolStripMenuItem
+ //
+ отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { изделияToolStripMenuItem, магазинToolStripMenuItem, заказыToolStripMenuItem });
+ отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem";
+ отчётыToolStripMenuItem.Size = new Size(60, 25);
+ отчётыToolStripMenuItem.Text = "Отчёты";
+ //
+ // изделияToolStripMenuItem
+ //
+ изделияToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокИзделийToolStripMenuItem, пиццаСИнгридиентамиToolStripMenuItem });
+ изделияToolStripMenuItem.Name = "изделияToolStripMenuItem";
+ изделияToolStripMenuItem.Size = new Size(180, 22);
+ изделияToolStripMenuItem.Text = "Двигатели";
+ //
+ // списокИзделийToolStripMenuItem
+ //
+ списокИзделийToolStripMenuItem.Name = "списокИзделийToolStripMenuItem";
+ списокИзделийToolStripMenuItem.Size = new Size(213, 22);
+ списокИзделийToolStripMenuItem.Text = "Список двигателей";
+ списокИзделийToolStripMenuItem.Click += ComponentsToolStripMenuItem_Click;
+ //
+ // пиццаСИнгридиентамиToolStripMenuItem
+ //
+ пиццаСИнгридиентамиToolStripMenuItem.Name = "пиццаСИнгридиентамиToolStripMenuItem";
+ пиццаСИнгридиентамиToolStripMenuItem.Size = new Size(213, 22);
+ пиццаСИнгридиентамиToolStripMenuItem.Text = "Двигатели с компонентами";
+ пиццаСИнгридиентамиToolStripMenuItem.Click += ComponentEngineToolStripMenuItem_Click;
+ //
+ // магазинToolStripMenuItem
+ //
+ магазинToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { информацияToolStripMenuItem, загруженностьToolStripMenuItem });
+ магазинToolStripMenuItem.Name = "магазинToolStripMenuItem";
+ магазинToolStripMenuItem.Size = new Size(180, 22);
+ магазинToolStripMenuItem.Text = "Магазин";
+ //
+ // информацияToolStripMenuItem
+ //
+ информацияToolStripMenuItem.Name = "информацияToolStripMenuItem";
+ информацияToolStripMenuItem.Size = new Size(158, 22);
+ информацияToolStripMenuItem.Text = "Информация";
+ информацияToolStripMenuItem.Click += InfoToolStripMenuItem_Click;
+ //
+ // загруженностьToolStripMenuItem
+ //
+ загруженностьToolStripMenuItem.Name = "загруженностьToolStripMenuItem";
+ загруженностьToolStripMenuItem.Size = new Size(158, 22);
+ загруженностьToolStripMenuItem.Text = "Загруженность";
+ загруженностьToolStripMenuItem.Click += BusyShopsToolStripMenuItem_Click;
+ //
+ // заказыToolStripMenuItem
+ //
+ заказыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { заказыToolStripMenuItem1, заказыПоГруппамToolStripMenuItem });
+ заказыToolStripMenuItem.Name = "заказыToolStripMenuItem";
+ заказыToolStripMenuItem.Size = new Size(180, 22);
+ заказыToolStripMenuItem.Text = "Заказы";
+ //
+ // заказыToolStripMenuItem1
+ //
+ заказыToolStripMenuItem1.Name = "заказыToolStripMenuItem1";
+ заказыToolStripMenuItem1.Size = new Size(180, 22);
+ заказыToolStripMenuItem1.Text = "Заказы";
+ заказыToolStripMenuItem1.Click += OrdersToolStripMenuItem_Click;
+ //
+ // заказыПоГруппамToolStripMenuItem
+ //
+ заказыПоГруппамToolStripMenuItem.Name = "заказыПоГруппамToolStripMenuItem";
+ заказыПоГруппамToolStripMenuItem.Size = new Size(180, 22);
+ заказыПоГруппамToolStripMenuItem.Text = "Заказы по группам";
+ заказыПоГруппамToolStripMenuItem.Click += GroupOrdersToolStripMenuItem_Click;
//
// buttonCreateOrder
//
@@ -139,6 +252,12 @@
dataGridView.Size = new Size(763, 435);
dataGridView.TabIndex = 6;
//
+ // отчётыToolStripMenuItem1
+ //
+ отчётыToolStripMenuItem1.Name = "отчётыToolStripMenuItem1";
+ отчётыToolStripMenuItem1.Size = new Size(180, 22);
+ отчётыToolStripMenuItem1.Text = "Отчёты";
+ //
// FormMain
//
AutoScaleDimensions = new SizeF(7F, 15F);
@@ -171,7 +290,22 @@
private Button buttonRef;
private DataGridView dataGridView;
private ToolStripDropDownButton toolStripDropDownButton1;
- private ToolStripMenuItem КомпонентыToolStripMenuItem;
- private ToolStripMenuItem ДвигателиToolStripMenuItem;
+ private ToolStripMenuItem компонентыToolStripMenuItem;
+ private ToolStripMenuItem ПутёвкиToolStripMenuItem;
+ private ToolStripMenuItem магазиныToolStripMenuItem;
+ private ToolStripMenuItem operationToolStripMenuItem;
+ private ToolStripMenuItem transactionToolStripMenuItem;
+ private ToolStripMenuItem продажаToolStripMenuItem;
+ private ToolStripMenuItem отчётыToolStripMenuItem;
+ private ToolStripMenuItem изделияToolStripMenuItem;
+ private ToolStripMenuItem списокИзделийToolStripMenuItem;
+ private ToolStripMenuItem пиццаСИнгридиентамиToolStripMenuItem;
+ private ToolStripMenuItem магазинToolStripMenuItem;
+ private ToolStripMenuItem информацияToolStripMenuItem;
+ private ToolStripMenuItem загруженностьToolStripMenuItem;
+ private ToolStripMenuItem заказыToolStripMenuItem;
+ private ToolStripMenuItem заказыToolStripMenuItem1;
+ private ToolStripMenuItem заказыПоГруппамToolStripMenuItem;
+ private ToolStripMenuItem отчётыToolStripMenuItem1;
}
}
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/FormMain.cs b/MotorPlant/MotorPlantView/FormMain.cs
index 9b14b89..6cc2ded 100644
--- a/MotorPlant/MotorPlantView/FormMain.cs
+++ b/MotorPlant/MotorPlantView/FormMain.cs
@@ -1,6 +1,7 @@
using Microsoft.Extensions.Logging;
using MotorPlantContracts.BindingModels;
using MotorPlantContracts.BusinessLogicsContracts;
+using MotorPlantBusinessLogic;
namespace MotorPlantView.Forms
{
@@ -8,11 +9,13 @@ namespace MotorPlantView.Forms
{
private readonly ILogger _logger;
private readonly IOrderLogic _orderLogic;
- public FormMain(ILogger logger, IOrderLogic orderLogic)
+ private readonly IReportLogic _reportLogic;
+ public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic)
{
InitializeComponent();
_logger = logger;
_orderLogic = orderLogic;
+ _reportLogic = reportLogic;
}
private void FormMain_Load(object sender, EventArgs e)
{
@@ -39,7 +42,7 @@ namespace MotorPlantView.Forms
_logger.LogError(ex, "Ошибка загрузки заказов");
}
}
- private void КомпонентыToolStripMenuItem_Click(object sender, EventArgs e)
+ private void компонентыToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormComponents));
if (service is FormComponents form)
@@ -47,7 +50,7 @@ namespace MotorPlantView.Forms
form.ShowDialog();
}
}
- private void ИзделияToolStripMenuItem_Click(object sender, EventArgs e)
+ private void консервыToolStripMenuItem_Click(object sender, EventArgs e)
{
var service = Program.ServiceProvider?.GetService(typeof(FormEngines));
@@ -142,5 +145,79 @@ namespace MotorPlantView.Forms
{
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 transactionToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var service = Program.ServiceProvider?.GetService(typeof(FormCreateSupply));
+ if (service is FormCreateSupply form)
+ {
+ form.ShowDialog();
+ }
+ }
+ private void SellToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var service = Program.ServiceProvider?.GetService(typeof(FormSellEngines));
+ if (service is FormSellEngines form)
+ {
+ form.ShowDialog();
+ }
+ }
+ private void ComponentsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
+ if (dialog.ShowDialog() == DialogResult.OK)
+ {
+ _reportLogic.SaveEnginesToWordFile(new ReportBindingModel { FileName = dialog.FileName });
+ MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ private void ComponentEngineToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var service = Program.ServiceProvider?.GetService(typeof(FormReportEngineComponents));
+ if (service is FormReportEngineComponents form)
+ {
+ form.ShowDialog();
+ }
+ }
+ private void OrdersToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var service = Program.ServiceProvider?.GetService(typeof(FormReportOrders));
+ if (service is FormReportOrders form)
+ {
+ form.ShowDialog();
+ }
+ }
+ private void InfoToolStripMenuItem_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 BusyShopsToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var service = Program.ServiceProvider?.GetService(typeof(FormReportShop));
+ if (service is FormReportShop form)
+ {
+ form.ShowDialog();
+ }
+ }
+ private void GroupOrdersToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ var service = Program.ServiceProvider?.GetService(typeof(FormReportGroupedOrders));
+ if (service is FormReportGroupedOrders form)
+ {
+ form.ShowDialog();
+ }
+ }
}
}
diff --git a/MotorPlant/MotorPlantView/FormMain.resx b/MotorPlant/MotorPlantView/FormMain.resx
index 1af7de1..c354583 100644
--- a/MotorPlant/MotorPlantView/FormMain.resx
+++ b/MotorPlant/MotorPlantView/FormMain.resx
@@ -1,17 +1,17 @@
-
@@ -117,4 +117,7 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ 17, 17
+
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/FormReportEngineComponents.Designer.cs b/MotorPlant/MotorPlantView/FormReportEngineComponents.Designer.cs
new file mode 100644
index 0000000..b5c0dbe
--- /dev/null
+++ b/MotorPlant/MotorPlantView/FormReportEngineComponents.Designer.cs
@@ -0,0 +1,97 @@
+namespace MotorPlantView.Forms
+{
+ partial class FormReportEngineComponents
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ ButtonSaveToExcel = new Button();
+ dataGridView = new DataGridView();
+ Component = new DataGridViewTextBoxColumn();
+ Engine = new DataGridViewTextBoxColumn();
+ Count = new DataGridViewTextBoxColumn();
+ ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit();
+ SuspendLayout();
+ //
+ // buttonSaveToExcel
+ //
+ ButtonSaveToExcel.Location = new Point(12, 12);
+ ButtonSaveToExcel.Name = "ButtonSaveToExcel";
+ ButtonSaveToExcel.Size = new Size(150, 30);
+ ButtonSaveToExcel.TabIndex = 0;
+ ButtonSaveToExcel.Text = "Сохранить в Excel";
+ ButtonSaveToExcel.UseVisualStyleBackColor = true;
+ ButtonSaveToExcel.Click += ButtonSaveToExcel_Click;
+ //
+ // dataGridView
+ //
+ dataGridView.BackgroundColor = SystemColors.ButtonHighlight;
+ dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ dataGridView.Columns.AddRange(new DataGridViewColumn[] { Component, Engine, Count });
+ dataGridView.Location = new Point(12, 48);
+ dataGridView.Name = "dataGridView";
+ dataGridView.RowTemplate.Height = 25;
+ dataGridView.Size = new Size(560, 501);
+ dataGridView.TabIndex = 1;
+ //
+ // Component
+ //
+ Component.HeaderText = "Компонент";
+ Component.Name = "Component";
+ //
+ // Computer
+ //
+ Engine.HeaderText = "Двигатель";
+ Engine.Name = "Engine";
+ //
+ // Count
+ //
+ Count.HeaderText = "Количество";
+ Count.Name = "Count";
+ //
+ // FormReportComputerComponents
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(584, 561);
+ Controls.Add(dataGridView);
+ Controls.Add(ButtonSaveToExcel);
+ Name = "FormReportEngineComponents";
+ Text = "Компоненты по изделиям";
+ Load += FormReportEngineComponents_Load;
+ ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();
+ ResumeLayout(false);
+ }
+
+ #endregion
+
+ private Button ButtonSaveToExcel;
+ private DataGridView dataGridView;
+ private DataGridViewTextBoxColumn Component;
+ private DataGridViewTextBoxColumn Engine;
+ private DataGridViewTextBoxColumn Count;
+ }
+}
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/FormReportEngineComponents.cs b/MotorPlant/MotorPlantView/FormReportEngineComponents.cs
new file mode 100644
index 0000000..4f59435
--- /dev/null
+++ b/MotorPlant/MotorPlantView/FormReportEngineComponents.cs
@@ -0,0 +1,93 @@
+using Microsoft.Extensions.Logging;
+using MotorPlantContracts.BindingModels;
+using MotorPlantContracts.BusinessLogicsContracts;
+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 MotorPlantView.Forms
+{
+ public partial class FormReportEngineComponents : Form
+ {
+ private readonly ILogger _logger;
+ private readonly IReportLogic _logic;
+ public FormReportEngineComponents(ILogger logger, IReportLogic logic)
+ {
+ InitializeComponent();
+ _logger = logger;
+ _logic = logic;
+ }
+ private void FormReportEngineComponents_Load(object sender, EventArgs e)
+ {
+ try
+ {
+ var dict = _logic.GetEngineComponents();
+ if (dict != null)
+ {
+ dataGridView.Rows.Clear();
+ foreach (var elem in dict)
+ {
+ dataGridView.Rows.Add(new object[]
+ {
+ elem.EngineName,
+ "",
+ ""
+ });
+ foreach (var listElem in elem.Components)
+ {
+ dataGridView.Rows.Add(new object[]
+ {
+ "",
+ listElem.Item1,
+ listElem.Item2,
+ });
+ }
+ dataGridView.Rows.Add(new object[]
+ {
+ "Итого:",
+ "",
+ elem.TotalCount
+ });
+ dataGridView.Rows.Add(Array.Empty
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/Program.cs b/MotorPlant/MotorPlantView/Program.cs
index 1d41c4e..a9fc1c0 100644
--- a/MotorPlant/MotorPlantView/Program.cs
+++ b/MotorPlant/MotorPlantView/Program.cs
@@ -5,6 +5,9 @@ using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using MotorPlantBusinessLogic.BusinessLogics;
using MotorPlantDatabaseImplement.Implements;
+using MotorPlantBusinessLogic.OfficePackage.Implements;
+using MotorPlantBusinessLogic.OfficePackage;
+using MotorPlantBusinessLogic;
namespace MotorPlantView.Forms
{
@@ -41,6 +44,7 @@ namespace MotorPlantView.Forms
services.AddTransient();
services.AddTransient();
services.AddTransient();
+ services.AddTransient();
services.AddTransient();
services.AddTransient();
@@ -49,6 +53,19 @@ namespace MotorPlantView.Forms
services.AddTransient();
services.AddTransient();
services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
+ services.AddTransient();
}
}
}
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/Properties/Resources.Designer.cs b/MotorPlant/MotorPlantView/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..eae4a4d
--- /dev/null
+++ b/MotorPlant/MotorPlantView/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+//
+// Этот код создан программой.
+// Исполняемая версия:4.0.30319.42000
+//
+// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
+// повторной генерации кода.
+//
+//------------------------------------------------------------------------------
+
+namespace MotorPlantView.Properties {
+ using System;
+
+
+ ///
+ /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
+ ///
+ // Этот класс создан автоматически классом StronglyTypedResourceBuilder
+ // с помощью такого средства, как ResGen или Visual Studio.
+ // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
+ // с параметром /str или перестройте свой проект VS.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MotorPlantView.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Перезаписывает свойство CurrentUICulture текущего потока для всех
+ /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+ }
+}
diff --git a/MotorPlant/MotorPlantView/Properties/Resources.resx b/MotorPlant/MotorPlantView/Properties/Resources.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/MotorPlant/MotorPlantView/Properties/Resources.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MotorPlant/MotorPlantView/ReportGroupedOrders.rdlc b/MotorPlant/MotorPlantView/ReportGroupedOrders.rdlc
new file mode 100644
index 0000000..2ef2b88
--- /dev/null
+++ b/MotorPlant/MotorPlantView/ReportGroupedOrders.rdlc
@@ -0,0 +1,441 @@
+
+
+ 0
+
+
+
+ System.Data.DataSet
+ /* Local Connection */
+
+ 20791c83-cee8-4a38-bbd0-245fc17cefb3
+
+
+
+
+
+ PrecastConcretePlantContractsViewModels
+ /* Local Query */
+
+
+
+ Date
+ System.DateTime
+
+
+ OrdersCount
+ System.Int32
+
+
+ OrdersSum
+ System.Decimal
+
+
+
+ PrecastConcretePlantContracts.ViewModels
+ ReportGroupOrdersViewModel
+ PrecastConcretePlantContracts.ViewModels.ReportGroupOrdersViewModel, PrecastConcretePlantContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Отчёт по заказам
+
+
+
+
+
+
+ 0.6cm
+ 16.51cm
+
+
+ Middle
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =Parameters!ReportParameterPeriod.Value
+
+
+
+
+
+
+ ReportParameterPeriod
+ 0.6cm
+ 0.6cm
+ 16.51cm
+ 1
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+ 3.90406cm
+
+
+ 3.97461cm
+
+
+ 3.65711cm
+
+
+
+
+ 0.6cm
+
+
+
+
+ true
+ true
+
+
+
+
+ Дата создания
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Количество заказов
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Общая сумма заказов
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ 0.6cm
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!Date.Value
+
+
+
+
+
+
+ Date
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!OrdersCount.Value
+
+
+
+
+
+
+ OrdersCount
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!OrdersSum.Value
+
+
+
+
+
+
+ OrdersSum
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ After
+
+
+
+
+
+
+ DataSetGroupedOrders
+ 1.88242cm
+ 2.68676cm
+ 1.2cm
+ 11.53578cm
+ 2
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Итого:
+
+
+
+
+
+
+ 3.29409cm
+ 8.06542cm
+ 0.6cm
+ 2.5cm
+ 3
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =Sum(Fields!OrdersSum.Value, "DataSetGroupedOrders")
+
+
+
+
+
+
+ 3.29409cm
+ 10.70653cm
+ 0.6cm
+ 3.48072cm
+ 4
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ 2in
+
+
+ 6.5in
+
+ 29.7cm
+ 21cm
+ 2cm
+ 2cm
+ 2cm
+ 2cm
+ 0.13cm
+
+
+
+
+
+
+ String
+ true
+ ReportParameter1
+
+
+
+
+ 4
+ 2
+
+
+ 0
+ 0
+ ReportParameterPeriod
+
+
+
+
+ Cm
+ b5a8ad5e-1151-4687-8576-a5270295c079
+
diff --git a/MotorPlant/MotorPlantView/ReportOrders.rdlc b/MotorPlant/MotorPlantView/ReportOrders.rdlc
new file mode 100644
index 0000000..00c941e
--- /dev/null
+++ b/MotorPlant/MotorPlantView/ReportOrders.rdlc
@@ -0,0 +1,633 @@
+
+
+ 0
+
+
+
+ System.Data.DataSet
+ /* Local Connection */
+
+ 10791c83-cee8-4a38-bbd0-245fc17cefb3
+
+
+
+
+
+ MotorPlantContractsViewModels
+ /* Local Query */
+
+
+
+ Id
+ System.Int32
+
+
+ DateCreate
+ System.DateTime
+
+
+ EngineName
+ System.String
+
+
+ Sum
+ System.Decimal
+
+
+ Status
+ System.String
+
+
+
+ MotorPlantContracts.ViewModels
+ ReportOrdersViewModel
+ MotorPlantContracts.ViewModels.ReportOrdersViewModel, MotorPlantContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
+
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Заказы
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0.6cm
+ 21.71934cm
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+ 5.50333cm
+
+
+ 5.50333cm
+
+
+ 6.82331cm
+
+
+ 6.1195cm
+
+
+ 5.17229cm
+
+
+
+
+ 1.235cm
+
+
+
+
+ true
+ true
+
+
+
+
+ Номер
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textbox8
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Дата создания
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textbox4
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Изделие
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textbox6
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Сумма
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textbox10
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ Статус
+
+
+
+
+
+
+ Textbox1
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ 1.235cm
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!Id.Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Textbox9
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!DateCreate.Value
+
+
+
+
+
+
+ DateCreate
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!EngineName.Value
+
+
+
+
+
+
+ EngineName
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!Sum.Value
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Fields!Status.Value
+
+
+
+
+
+
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ After
+
+
+
+
+
+
+ DataSetOrders
+ 2.34103cm
+ 0.42333cm
+ 2.47cm
+ 29.12176cm
+ 1
+
+
+
+
+
+ true
+ true
+
+
+
+
+ =Parameters!ReportParameterPeriod.Value
+
+
+
+
+
+
+ 0.77639cm
+ 0.70583cm
+ 21.71934cm
+ 2
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ Итого:
+
+
+
+
+
+
+ 5.9182cm
+ 13.96154cm
+ 0.6cm
+ 2.5cm
+ 3
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ true
+ true
+
+
+
+
+ =Parameters!ReportParameterSum.Value
+
+
+
+
+
+
+ 5.9182cm
+ 16.46154cm
+ 0.6cm
+ 4.45792cm
+ 4
+
+
+ 2pt
+ 2pt
+ 2pt
+ 2pt
+
+
+
+ 2.81911in
+
+
+ 11.94443in
+
+ 29.7cm
+ 21cm
+ 2cm
+ 2cm
+ 2cm
+ 2cm
+ 0.13cm
+
+
+
+
+
+
+ String
+ true
+ ReportParameter1
+
+
+ String
+ true
+ ReportParameter1
+
+
+
+
+ 4
+ 2
+
+
+ 0
+ 0
+ ReportParameterPeriod
+
+
+ 1
+ 0
+ ReportParameterSum
+
+
+
+
+ Cm
+ 4c3715b9-dfef-4df9-b6c8-48eefa088c10
+
\ No newline at end of file
| | |