From ee09b4a89db672de15108a80ec55aaa49ce123fc Mon Sep 17 00:00:00 2001
From: MaxKarme <91691525+MaxKarme@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:33:53 +0400
Subject: [PATCH 1/6] view layer

---
 Pizzeria/Pizzeria/FormMain.Designer.cs        |  46 +-
 Pizzeria/Pizzeria/FormMain.cs                 |  37 +-
 .../Pizzeria/FormReportOrders.Designer.cs     | 129 +++++
 Pizzeria/Pizzeria/FormReportOrders.cs         |  90 +++
 Pizzeria/Pizzeria/FormReportOrders.resx       |  60 ++
 .../FormReportPizzaComponents.Designer.cs     | 111 ++++
 .../Pizzeria/FormReportPizzaComponents.cs     |  75 +++
 .../Pizzeria/FormReportPizzaComponents.resx   |  69 +++
 Pizzeria/Pizzeria/Pizzeria.csproj             |   4 +
 Pizzeria/Pizzeria/Program.cs                  |   9 +
 Pizzeria/Pizzeria/ReportOrders.rdlc           | 529 ++++++++++++++++++
 11 files changed, 1155 insertions(+), 4 deletions(-)
 create mode 100644 Pizzeria/Pizzeria/FormReportOrders.Designer.cs
 create mode 100644 Pizzeria/Pizzeria/FormReportOrders.cs
 create mode 100644 Pizzeria/Pizzeria/FormReportOrders.resx
 create mode 100644 Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs
 create mode 100644 Pizzeria/Pizzeria/FormReportPizzaComponents.cs
 create mode 100644 Pizzeria/Pizzeria/FormReportPizzaComponents.resx
 create mode 100644 Pizzeria/Pizzeria/ReportOrders.rdlc

diff --git a/Pizzeria/Pizzeria/FormMain.Designer.cs b/Pizzeria/Pizzeria/FormMain.Designer.cs
index 1a753ee..73ed42d 100644
--- a/Pizzeria/Pizzeria/FormMain.Designer.cs
+++ b/Pizzeria/Pizzeria/FormMain.Designer.cs
@@ -40,6 +40,10 @@
             this.справочникиToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.компонентыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             this.изделияToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.отчетыToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.списокКомпонентовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.компонентовПоПиццамToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+            this.списокЗаказовToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
             this.menuStrip1.SuspendLayout();
             this.SuspendLayout();
@@ -123,7 +127,8 @@
             // 
             this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20);
             this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.справочникиToolStripMenuItem});
+            this.справочникиToolStripMenuItem,
+            this.отчетыToolStripMenuItem});
             this.menuStrip1.Location = new System.Drawing.Point(0, 0);
             this.menuStrip1.Name = "menuStrip1";
             this.menuStrip1.Size = new System.Drawing.Size(1233, 28);
@@ -142,17 +147,48 @@
             // компонентыToolStripMenuItem
             // 
             this.компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem";
-            this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
+            this.компонентыToolStripMenuItem.Size = new System.Drawing.Size(182, 26);
             this.компонентыToolStripMenuItem.Text = "Компоненты";
             this.компонентыToolStripMenuItem.Click += new System.EventHandler(this.КомпонентыToolStripMenuItem_Click);
             // 
             // изделияToolStripMenuItem
             // 
             this.изделияToolStripMenuItem.Name = "изделияToolStripMenuItem";
-            this.изделияToolStripMenuItem.Size = new System.Drawing.Size(224, 26);
+            this.изделияToolStripMenuItem.Size = new System.Drawing.Size(182, 26);
             this.изделияToolStripMenuItem.Text = "Пиццы";
             this.изделияToolStripMenuItem.Click += new System.EventHandler(this.ПиццыToolStripMenuItem_Click);
             // 
+            // отчетыToolStripMenuItem
+            // 
+            this.отчетыToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.списокКомпонентовToolStripMenuItem,
+            this.компонентовПоПиццамToolStripMenuItem,
+            this.списокЗаказовToolStripMenuItem});
+            this.отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem";
+            this.отчетыToolStripMenuItem.Size = new System.Drawing.Size(73, 24);
+            this.отчетыToolStripMenuItem.Text = "Отчеты";
+            // 
+            // списокКомпонентовToolStripMenuItem
+            // 
+            this.списокКомпонентовToolStripMenuItem.Name = "списокКомпонентовToolStripMenuItem";
+            this.списокКомпонентовToolStripMenuItem.Size = new System.Drawing.Size(269, 26);
+            this.списокКомпонентовToolStripMenuItem.Text = "Список компонентов";
+            this.списокКомпонентовToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click);
+            // 
+            // компонентовПоПиццамToolStripMenuItem
+            // 
+            this.компонентовПоПиццамToolStripMenuItem.Name = "компонентовПоПиццамToolStripMenuItem";
+            this.компонентовПоПиццамToolStripMenuItem.Size = new System.Drawing.Size(269, 26);
+            this.компонентовПоПиццамToolStripMenuItem.Text = "Компонентов по пиццам";
+            this.компонентовПоПиццамToolStripMenuItem.Click += new System.EventHandler(this.ComponentPizzasToolStripMenuItem_Click);
+            // 
+            // списокЗаказовToolStripMenuItem
+            // 
+            this.списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem";
+            this.списокЗаказовToolStripMenuItem.Size = new System.Drawing.Size(269, 26);
+            this.списокЗаказовToolStripMenuItem.Text = "Список заказов";
+            this.списокЗаказовToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click);
+            // 
             // FormMain
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
@@ -190,5 +226,9 @@
         private ToolStripMenuItem справочникиToolStripMenuItem;
         private ToolStripMenuItem компонентыToolStripMenuItem;
         private ToolStripMenuItem изделияToolStripMenuItem;
+        private ToolStripMenuItem отчетыToolStripMenuItem;
+        private ToolStripMenuItem списокКомпонентовToolStripMenuItem;
+        private ToolStripMenuItem компонентовПоПиццамToolStripMenuItem;
+        private ToolStripMenuItem списокЗаказовToolStripMenuItem;
     }
 }
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/FormMain.cs b/Pizzeria/Pizzeria/FormMain.cs
index cf5652d..eed58d0 100644
--- a/Pizzeria/Pizzeria/FormMain.cs
+++ b/Pizzeria/Pizzeria/FormMain.cs
@@ -9,11 +9,13 @@ namespace Pizzeria
     {
         private readonly ILogger _logger;
         private readonly IOrderLogic _orderLogic;
-        public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic)
+        private readonly IReportLogic _reportLogic;
+        public FormMain(ILogger<FormMain> logger, IOrderLogic orderLogic, IReportLogic reportLogic)
         {
             InitializeComponent();
             _logger = logger;
             _orderLogic = orderLogic;
+            _reportLogic = reportLogic;
         }
         private void FormMain_Load(object sender, EventArgs e)
         {
@@ -151,5 +153,38 @@ namespace Pizzeria
             LoadData();
         }
 
+
+        private void ComponentsToolStripMenuItem_Click(object sender, EventArgs
+e)
+        {
+            using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
+            if (dialog.ShowDialog() == DialogResult.OK)
+            {
+                _reportLogic.SaveComponentsToWordFile(new ReportBindingModel
+                {
+                    FileName = dialog.FileName
+                });
+                MessageBox.Show("���������", "�����", MessageBoxButtons.OK,
+               MessageBoxIcon.Information);
+            }
+        }
+        private void ComponentPizzasToolStripMenuItem_Click(object sender, EventArgs e)
+        {
+            var service =
+           Program.ServiceProvider?.GetService(typeof(FormReportPizzaComponents));
+            if (service is FormReportPizzaComponents 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();
+            }
+        }
+
     }
 }
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/FormReportOrders.Designer.cs b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs
new file mode 100644
index 0000000..72dd438
--- /dev/null
+++ b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs
@@ -0,0 +1,129 @@
+namespace Pizzeria
+{
+    partial class FormReportOrders
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.dateTimePickerFrom = new System.Windows.Forms.DateTimePicker();
+            this.dateTimePickerTo = new System.Windows.Forms.DateTimePicker();
+            this.label1 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.button1 = new System.Windows.Forms.Button();
+            this.button2 = new System.Windows.Forms.Button();
+            this.panel = new System.Windows.Forms.Panel();
+            this.SuspendLayout();
+            // 
+            // dateTimePickerFrom
+            // 
+            this.dateTimePickerFrom.Location = new System.Drawing.Point(36, 13);
+            this.dateTimePickerFrom.Name = "dateTimePickerFrom";
+            this.dateTimePickerFrom.Size = new System.Drawing.Size(174, 27);
+            this.dateTimePickerFrom.TabIndex = 0;
+            // 
+            // dateTimePickerTo
+            // 
+            this.dateTimePickerTo.Location = new System.Drawing.Point(249, 13);
+            this.dateTimePickerTo.Name = "dateTimePickerTo";
+            this.dateTimePickerTo.Size = new System.Drawing.Size(174, 27);
+            this.dateTimePickerTo.TabIndex = 2;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(12, 18);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(18, 20);
+            this.label1.TabIndex = 3;
+            this.label1.Text = "C";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(216, 18);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(27, 20);
+            this.label2.TabIndex = 4;
+            this.label2.Text = "по";
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(463, 11);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(135, 29);
+            this.button1.TabIndex = 5;
+            this.button1.Text = "Сформировать";
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Click += new System.EventHandler(this.ButtonMake_Click);
+            // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(675, 11);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(94, 29);
+            this.button2.TabIndex = 6;
+            this.button2.Text = "В Pdf";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.ButtonToPdf_Click);
+            // 
+            // panel
+            // 
+            this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.panel.Location = new System.Drawing.Point(0, 46);
+            this.panel.Name = "panel";
+            this.panel.Size = new System.Drawing.Size(843, 409);
+            this.panel.TabIndex = 7;
+            // 
+            // FormReportOrders
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(842, 470);
+            this.Controls.Add(this.panel);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.button1);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.dateTimePickerTo);
+            this.Controls.Add(this.dateTimePickerFrom);
+            this.Name = "FormReportOrders";
+            this.Text = "FormReportOrders";
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private DateTimePicker dateTimePickerFrom;
+        private DateTimePicker dateTimePickerTo;
+        private Label label1;
+        private Label label2;
+        private Button button1;
+        private Button button2;
+        private Panel panel;
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/FormReportOrders.cs b/Pizzeria/Pizzeria/FormReportOrders.cs
new file mode 100644
index 0000000..412517a
--- /dev/null
+++ b/Pizzeria/Pizzeria/FormReportOrders.cs
@@ -0,0 +1,90 @@
+using PizzeriaContracts.BindingModels;
+using PizzeriaContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+using Microsoft.Reporting.WinForms;
+namespace Pizzeria
+{
+    public partial class FormReportOrders : Form
+    {
+        private readonly ReportViewer reportViewer;
+        private readonly ILogger _logger;
+        private readonly IReportLogic _logic;
+        public FormReportOrders(ILogger<FormReportOrders> logger, IReportLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+            reportViewer = new ReportViewer
+            {
+                Dock = DockStyle.Fill
+            };
+            reportViewer.LocalReport.LoadReportDefinition(new FileStream("ReportOrders.rdlc", FileMode.Open));
+            panel.Controls.Add(reportViewer);
+        }
+        private void ButtonMake_Click(object sender, EventArgs e)
+        {
+            if (dateTimePickerFrom.Value.Date >= dateTimePickerTo.Value.Date)
+            {
+                MessageBox.Show("Дата начала должна быть меньше даты окончания",
+               "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+            try
+            {
+                var dataSource = _logic.GetOrders(new ReportBindingModel
+                {
+                    DateFrom = DateTime.SpecifyKind(dateTimePickerFrom.Value, DateTimeKind.Utc),
+                    DateTo = DateTime.SpecifyKind(dateTimePickerTo.Value, DateTimeKind.Utc)
+                });
+                var source = new ReportDataSource("DataSetOrders", dataSource);
+                reportViewer.LocalReport.DataSources.Clear();
+                reportViewer.LocalReport.DataSources.Add(source);
+                var parameters = new[] { new ReportParameter("ReportParameterPeriod", $"c {dateTimePickerFrom.Value.ToShortDateString()} по {dateTimePickerTo.Value.ToShortDateString()}") };
+                reportViewer.LocalReport.SetParameters(parameters);
+                reportViewer.RefreshReport();
+                _logger.LogInformation("Загрузка списка заказов на период {From} - {To}", dateTimePickerFrom.Value.ToShortDateString(), dateTimePickerTo.Value.ToShortDateString());
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки списка заказов на период");
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+               MessageBoxIcon.Error);
+            }
+        }
+        private void ButtonToPdf_Click(object sender, EventArgs e)
+        {
+            if (dateTimePickerFrom.Value.Date >= dateTimePickerTo.Value.Date)
+            {
+                MessageBox.Show("Дата начала должна быть меньше даты окончания", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+            using var dialog = new SaveFileDialog
+            {
+                Filter = "pdf|*.pdf"
+            };
+            if (dialog.ShowDialog() == DialogResult.OK)
+            {
+                try
+                {
+                    _logic.SaveOrdersToPdfFile(new ReportBindingModel
+                    {
+                        FileName = dialog.FileName,
+                        DateFrom = DateTime.SpecifyKind(dateTimePickerFrom.Value, DateTimeKind.Utc),
+                        DateTo = DateTime.SpecifyKind(dateTimePickerTo.Value, DateTimeKind.Utc)
+                    });
+                    _logger.LogInformation("Сохранение списка заказов на период {From} - {To} ", dateTimePickerFrom.Value.ToShortDateString(), 
+                        dateTimePickerTo.Value.ToShortDateString());
+
+                    MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка сохранения списка заказов на период");
+                   
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                }
+            }
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/FormReportOrders.resx b/Pizzeria/Pizzeria/FormReportOrders.resx
new file mode 100644
index 0000000..f298a7b
--- /dev/null
+++ b/Pizzeria/Pizzeria/FormReportOrders.resx
@@ -0,0 +1,60 @@
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs b/Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs
new file mode 100644
index 0000000..447a87f
--- /dev/null
+++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.Designer.cs
@@ -0,0 +1,111 @@
+namespace Pizzeria
+{
+    partial class FormReportPizzaComponents
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.button1 = new System.Windows.Forms.Button();
+            this.dataGridView = new System.Windows.Forms.DataGridView();
+            this.Компонент = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.Пицца = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.Количество = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(12, 12);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(159, 30);
+            this.button1.TabIndex = 0;
+            this.button1.Text = "Сохранить в Excel";
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Click += new System.EventHandler(this.ButtonSaveToExcel_Click);
+            // 
+            // dataGridView
+            // 
+            this.dataGridView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.dataGridView.BackgroundColor = System.Drawing.SystemColors.ControlLightLight;
+            this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
+            this.Компонент,
+            this.Пицца,
+            this.Количество});
+            this.dataGridView.Location = new System.Drawing.Point(12, 48);
+            this.dataGridView.Name = "dataGridView";
+            this.dataGridView.RowHeadersWidth = 51;
+            this.dataGridView.RowTemplate.Height = 29;
+            this.dataGridView.Size = new System.Drawing.Size(783, 475);
+            this.dataGridView.TabIndex = 1;
+            // 
+            // Компонент
+            // 
+            this.Компонент.HeaderText = "Component";
+            this.Компонент.MinimumWidth = 6;
+            this.Компонент.Name = "Компонент";
+            this.Компонент.Width = 125;
+            // 
+            // Пицца
+            // 
+            this.Пицца.HeaderText = "Pizza";
+            this.Пицца.MinimumWidth = 6;
+            this.Пицца.Name = "Пицца";
+            this.Пицца.Width = 125;
+            // 
+            // Количество
+            // 
+            this.Количество.HeaderText = "Count";
+            this.Количество.MinimumWidth = 6;
+            this.Количество.Name = "Количество";
+            this.Количество.Width = 125;
+            // 
+            // FormReportPizzaComponents
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(807, 519);
+            this.Controls.Add(this.dataGridView);
+            this.Controls.Add(this.button1);
+            this.Name = "FormReportPizzaComponents";
+            this.Text = "FormReportPizzaComponents";
+            this.Load += new System.EventHandler(this.FormReportPizzaComponents_Load);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private Button button1;
+        private DataGridView dataGridView;
+        private DataGridViewTextBoxColumn Компонент;
+        private DataGridViewTextBoxColumn Пицца;
+        private DataGridViewTextBoxColumn Количество;
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.cs b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs
new file mode 100644
index 0000000..fb5b94f
--- /dev/null
+++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs
@@ -0,0 +1,75 @@
+using PizzeriaContracts.BindingModels;
+using PizzeriaContracts.BusinessLogicsContracts;
+using Microsoft.Extensions.Logging;
+namespace Pizzeria
+{
+    public partial class FormReportPizzaComponents : Form
+    {
+        private readonly ILogger _logger;
+        private readonly IReportLogic _logic;
+        public FormReportPizzaComponents(ILogger<FormReportPizzaComponents> logger, IReportLogic logic)
+        {
+            InitializeComponent();
+            _logger = logger;
+            _logic = logic;
+        }
+        private void FormReportPizzaComponents_Load(object sender, EventArgs e)
+        {
+            try
+            {
+                var dict = _logic.GetPizzaComponent();
+                if (dict != null)
+                {
+                    dataGridView.Rows.Clear();
+                    foreach (var elem in dict)
+                    {
+                        dataGridView.Rows.Add(new object[] { elem.ComponentName, "", "" });
+                        foreach (var listElem in elem.Pizzas)
+                        {
+                            dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 });
+                        }
+                        dataGridView.Rows.Add(new object[] { "Итого", "", elem.TotalCount });
+                        dataGridView.Rows.Add(Array.Empty<object>());
+                    }
+                }
+                _logger.LogInformation("Загрузка списка изделий по компонентам");
+            }
+            catch (Exception ex)
+            {
+                _logger.LogError(ex, "Ошибка загрузки списка изделий по компонентам");
+               
+                MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+               MessageBoxIcon.Error);
+            }
+        }
+        private void ButtonSaveToExcel_Click(object sender, EventArgs e)
+        {
+            using var dialog = new SaveFileDialog
+            {
+                Filter = "xlsx|*.xlsx"
+            };
+            if (dialog.ShowDialog() == DialogResult.OK)
+            {
+                try
+                {
+                    _logic.SavePizzaComponentToExcelFile(new
+                    ReportBindingModel
+                    {
+                        FileName = dialog.FileName
+                    });
+                    _logger.LogInformation("Сохранение списка изделий по компонентам");
+                   
+                    MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK,
+                   MessageBoxIcon.Information);
+                }
+                catch (Exception ex)
+                {
+                    _logger.LogError(ex, "Ошибка сохранения списка изделий по компонентам");
+                   
+                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK,
+                   MessageBoxIcon.Error);
+                }
+            }
+        }
+    }
+}
diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.resx b/Pizzeria/Pizzeria/FormReportPizzaComponents.resx
new file mode 100644
index 0000000..3804e60
--- /dev/null
+++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.resx
@@ -0,0 +1,69 @@
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="Компонент.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Пицца.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Количество.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/Pizzeria.csproj b/Pizzeria/Pizzeria/Pizzeria.csproj
index 50dc696..9b2c453 100644
--- a/Pizzeria/Pizzeria/Pizzeria.csproj
+++ b/Pizzeria/Pizzeria/Pizzeria.csproj
@@ -16,6 +16,7 @@
     <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" />
     <PackageReference Include="Microsoft.Extensions.Logging" Version="7.0.0" />
     <PackageReference Include="NLog.Extensions.Logging" Version="5.2.1" />
+    <PackageReference Include="ReportViewerCore.WinForms" Version="15.1.17" />
   </ItemGroup>
 
   <ItemGroup>
@@ -29,6 +30,9 @@
     <None Update="nlog.config">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="ReportOrders.rdlc">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
 </Project>
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/Program.cs b/Pizzeria/Pizzeria/Program.cs
index c1b9b43..658551c 100644
--- a/Pizzeria/Pizzeria/Program.cs
+++ b/Pizzeria/Pizzeria/Program.cs
@@ -1,4 +1,6 @@
 using PizzeriaBusinessLogic;
+using PizzeriaBusinessLogic.OfficePackage;
+using PizzeriaBusinessLogic.OfficePackage.Implements;
 using PizzeriaContracts.BusinessLogicsContracts;
 using PizzeriaContracts.StoragesContracts;
 using PizzeriaDatabaseImplement.Implements;
@@ -40,6 +42,11 @@ namespace Pizzeria
             services.AddTransient<IComponentStorage, ComponentStorage>();
             services.AddTransient<IPizzaStorage, PizzaStorage>();
             services.AddTransient<IOrderStorage, OrderStorage>();
+            services.AddTransient<IReportLogic, ReportLogic>();
+
+            services.AddTransient<AbstractSaveToWord, SaveToWord>();
+            services.AddTransient<AbstractSaveToExcel, SaveToExcel>();
+            services.AddTransient<AbstractSaveToPdf, SaveToPdf>();
 
             services.AddTransient<FormMain>();
             services.AddTransient<FormComponent>();
@@ -48,6 +55,8 @@ namespace Pizzeria
             services.AddTransient<FormPizza>();
             services.AddTransient<FormPizzas>();
             services.AddTransient<FormPizzaComponent>();
+            services.AddTransient<FormReportOrders>();
+            services.AddTransient<FormReportPizzaComponents>();
         }
     }
 }
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/ReportOrders.rdlc b/Pizzeria/Pizzeria/ReportOrders.rdlc
new file mode 100644
index 0000000..0eb814a
--- /dev/null
+++ b/Pizzeria/Pizzeria/ReportOrders.rdlc
@@ -0,0 +1,529 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner">
+  <AutoRefresh>0</AutoRefresh>
+  <DataSources>
+    <DataSource Name="PizzeriaContractsViewModels">
+      <ConnectionProperties>
+        <DataProvider>System.Data.DataSet</DataProvider>
+        <ConnectString>/* Local Connection */</ConnectString>
+      </ConnectionProperties>
+      <rd:DataSourceID>10791c83-cee8-4a38-bbd0-245fc17cefb3</rd:DataSourceID>
+    </DataSource>
+  </DataSources>
+  <DataSets>
+    <DataSet Name="DataSetOrders">
+      <Query>
+        <DataSourceName>PizzeriaContractsViewModels</DataSourceName>
+        <CommandText>/* Local Query */</CommandText>
+      </Query>
+      <Fields>
+        <Field Name="Id">
+          <DataField>Id</DataField>
+          <rd:TypeName>System.Int32</rd:TypeName>
+        </Field>
+        <Field Name="DateCreate">
+          <DataField>DateCreate</DataField>
+          <rd:TypeName>System.DateTime</rd:TypeName>
+        </Field>
+        <Field Name="PizzaName">
+          <DataField>PizzaName</DataField>
+          <rd:TypeName>System.String</rd:TypeName>
+        </Field>
+        <Field Name="Sum">
+          <DataField>Sum</DataField>
+          <rd:TypeName>System.Decimal</rd:TypeName>
+        </Field>
+      </Fields>
+      <rd:DataSetInfo>
+        <rd:DataSetName>PizzeriaContracts.ViewModels</rd:DataSetName>
+        <rd:TableName>ReportOrdersViewModel</rd:TableName>
+        <rd:ObjectDataSourceType>PizzeriaContracts.ViewModels.ReportOrdersViewModel, PizzeriaContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</rd:ObjectDataSourceType>
+      </rd:DataSetInfo>
+    </DataSet>
+  </DataSets>
+  <ReportSections>
+    <ReportSection>
+      <Body>
+        <ReportItems>
+          <Textbox Name="ReportParameterPeriod">
+            <CanGrow>true</CanGrow>
+            <KeepTogether>true</KeepTogether>
+            <Paragraphs>
+              <Paragraph>
+                <TextRuns>
+                  <TextRun>
+                    <Value>=Parameters!ReportParameterPeriod.Value</Value>
+                    <Style>
+                      <FontSize>14pt</FontSize>
+                      <FontWeight>Bold</FontWeight>
+                    </Style>
+                  </TextRun>
+                </TextRuns>
+                <Style>
+                  <TextAlign>Center</TextAlign>
+                </Style>
+              </Paragraph>
+            </Paragraphs>
+            <rd:DefaultName>ReportParameterPeriod</rd:DefaultName>
+            <Top>1cm</Top>
+            <Height>1cm</Height>
+            <Width>17.4445cm</Width>
+            <Style>
+              <Border>
+                <Style>None</Style>
+              </Border>
+              <VerticalAlign>Middle</VerticalAlign>
+              <PaddingLeft>2pt</PaddingLeft>
+              <PaddingRight>2pt</PaddingRight>
+              <PaddingTop>2pt</PaddingTop>
+              <PaddingBottom>2pt</PaddingBottom>
+            </Style>
+          </Textbox>
+          <Textbox Name="TextboxTitle">
+            <CanGrow>true</CanGrow>
+            <KeepTogether>true</KeepTogether>
+            <Paragraphs>
+              <Paragraph>
+                <TextRuns>
+                  <TextRun>
+                    <Value>Заказы</Value>
+                    <Style>
+                      <FontSize>16pt</FontSize>
+                      <FontWeight>Bold</FontWeight>
+                    </Style>
+                  </TextRun>
+                </TextRuns>
+                <Style>
+                  <TextAlign>Center</TextAlign>
+                </Style>
+              </Paragraph>
+            </Paragraphs>
+            <Height>1cm</Height>
+            <Width>17.4445cm</Width>
+            <ZIndex>1</ZIndex>
+            <Style>
+              <Border>
+                <Style>None</Style>
+              </Border>
+              <VerticalAlign>Middle</VerticalAlign>
+              <PaddingLeft>2pt</PaddingLeft>
+              <PaddingRight>2pt</PaddingRight>
+              <PaddingTop>2pt</PaddingTop>
+              <PaddingBottom>2pt</PaddingBottom>
+            </Style>
+          </Textbox>
+          <Tablix Name="Tablix1">
+            <TablixBody>
+              <TablixColumns>
+                <TablixColumn>
+                  <Width>2.5cm</Width>
+                </TablixColumn>
+                <TablixColumn>
+                  <Width>3.21438cm</Width>
+                </TablixColumn>
+                <TablixColumn>
+                  <Width>8.23317cm</Width>
+                </TablixColumn>
+                <TablixColumn>
+                  <Width>2.5cm</Width>
+                </TablixColumn>
+              </TablixColumns>
+              <TablixRows>
+                <TablixRow>
+                  <Height>0.6cm</Height>
+                  <TablixCells>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Textbox5">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>Номер</Value>
+                                  <Style>
+                                    <FontWeight>Bold</FontWeight>
+                                  </Style>
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Textbox5</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Textbox1">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>Дата создания</Value>
+                                  <Style>
+                                    <FontWeight>Bold</FontWeight>
+                                  </Style>
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Textbox1</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Textbox3">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>Пицца</Value>
+                                  <Style>
+                                    <FontWeight>Bold</FontWeight>
+                                  </Style>
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Textbox3</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Textbox7">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>Сумма</Value>
+                                  <Style>
+                                    <FontWeight>Bold</FontWeight>
+                                  </Style>
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Textbox7</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                  </TablixCells>
+                </TablixRow>
+                <TablixRow>
+                  <Height>0.6cm</Height>
+                  <TablixCells>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Id">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>=Fields!Id.Value</Value>
+                                  <Style />
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Id</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="DateCreate">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>=Fields!DateCreate.Value</Value>
+                                  <Style>
+                                    <Format>d</Format>
+                                  </Style>
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>DateCreate</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="PizzaName">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>=Fields!PizzaName.Value</Value>
+                                  <Style />
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>PizzaName</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Sum">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>=Fields!Sum.Value</Value>
+                                  <Style />
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Sum</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
+                  </TablixCells>
+                </TablixRow>
+              </TablixRows>
+            </TablixBody>
+            <TablixColumnHierarchy>
+              <TablixMembers>
+                <TablixMember />
+                <TablixMember />
+                <TablixMember />
+                <TablixMember />
+              </TablixMembers>
+            </TablixColumnHierarchy>
+            <TablixRowHierarchy>
+              <TablixMembers>
+                <TablixMember>
+                  <KeepWithGroup>After</KeepWithGroup>
+                </TablixMember>
+                <TablixMember>
+                  <Group Name="Подробности" />
+                </TablixMember>
+              </TablixMembers>
+            </TablixRowHierarchy>
+            <DataSetName>DataSetOrders</DataSetName>
+            <Top>2.48391cm</Top>
+            <Left>0.55245cm</Left>
+            <Height>1.2cm</Height>
+            <Width>16.44755cm</Width>
+            <ZIndex>2</ZIndex>
+            <Style>
+              <Border>
+                <Style>Double</Style>
+              </Border>
+            </Style>
+          </Tablix>
+          <Textbox Name="TextboxTotalSum">
+            <CanGrow>true</CanGrow>
+            <KeepTogether>true</KeepTogether>
+            <Paragraphs>
+              <Paragraph>
+                <TextRuns>
+                  <TextRun>
+                    <Value>Итого:</Value>
+                    <Style>
+                      <FontWeight>Bold</FontWeight>
+                    </Style>
+                  </TextRun>
+                </TextRuns>
+                <Style>
+                  <TextAlign>Right</TextAlign>
+                </Style>
+              </Paragraph>
+            </Paragraphs>
+            <Top>4cm</Top>
+            <Left>12cm</Left>
+            <Height>0.6cm</Height>
+            <Width>2.5cm</Width>
+            <ZIndex>3</ZIndex>
+            <Style>
+              <Border>
+                <Style>None</Style>
+              </Border>
+              <PaddingLeft>2pt</PaddingLeft>
+              <PaddingRight>2pt</PaddingRight>
+              <PaddingTop>2pt</PaddingTop>
+              <PaddingBottom>2pt</PaddingBottom>
+            </Style>
+          </Textbox>
+          <Textbox Name="SumTotal">
+            <CanGrow>true</CanGrow>
+            <KeepTogether>true</KeepTogether>
+            <Paragraphs>
+              <Paragraph>
+                <TextRuns>
+                  <TextRun>
+                    <Value>=Sum(Fields!Sum.Value, "DataSetOrders")</Value>
+                    <Style>
+                      <FontWeight>Bold</FontWeight>
+                    </Style>
+                  </TextRun>
+                </TextRuns>
+                <Style>
+                  <TextAlign>Right</TextAlign>
+                </Style>
+              </Paragraph>
+            </Paragraphs>
+            <Top>4cm</Top>
+            <Left>14.5cm</Left>
+            <Height>0.6cm</Height>
+            <Width>2.5cm</Width>
+            <ZIndex>4</ZIndex>
+            <Style>
+              <Border>
+                <Style>None</Style>
+              </Border>
+              <PaddingLeft>2pt</PaddingLeft>
+              <PaddingRight>2pt</PaddingRight>
+              <PaddingTop>2pt</PaddingTop>
+              <PaddingBottom>2pt</PaddingBottom>
+            </Style>
+          </Textbox>
+        </ReportItems>
+        <Height>6.27908cm</Height>
+        <Style />
+      </Body>
+      <Width>17.4445cm</Width>
+      <Page>
+        <PageHeight>29.7cm</PageHeight>
+        <PageWidth>21cm</PageWidth>
+        <LeftMargin>2cm</LeftMargin>
+        <RightMargin>2cm</RightMargin>
+        <TopMargin>2cm</TopMargin>
+        <BottomMargin>2cm</BottomMargin>
+        <ColumnSpacing>0.13cm</ColumnSpacing>
+        <Style />
+      </Page>
+    </ReportSection>
+  </ReportSections>
+  <ReportParameters>
+    <ReportParameter Name="ReportParameterPeriod">
+      <DataType>String</DataType>
+      <Nullable>true</Nullable>
+      <Prompt>ReportParameter1</Prompt>
+    </ReportParameter>
+  </ReportParameters>
+  <ReportParametersLayout>
+    <GridLayoutDefinition>
+      <NumberOfColumns>4</NumberOfColumns>
+      <NumberOfRows>2</NumberOfRows>
+      <CellDefinitions>
+        <CellDefinition>
+          <ColumnIndex>0</ColumnIndex>
+          <RowIndex>0</RowIndex>
+          <ParameterName>ReportParameterPeriod</ParameterName>
+        </CellDefinition>
+      </CellDefinitions>
+    </GridLayoutDefinition>
+  </ReportParametersLayout>
+  <rd:ReportUnitType>Cm</rd:ReportUnitType>
+  <rd:ReportID>2de0031a-4d17-449d-922d-d9fc54572312</rd:ReportID>
+</Report>
\ No newline at end of file
-- 
2.25.1


From 49e5b6634d7babf71eb6e8f3c6baaa5ae59ac92f Mon Sep 17 00:00:00 2001
From: MaxKarme <91691525+MaxKarme@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:34:19 +0400
Subject: [PATCH 2/6] businessLogic layer

---
 .../OfficePackage/AbstractSaveToExcel.cs      |  96 +++++
 .../OfficePackage/AbstractSaveToPdf.cs        |  73 ++++
 .../OfficePackage/AbstractSaveToWord.cs       |  50 +++
 .../HelperModels/ExcelCellParameters.cs       |  12 +
 .../OfficePackage/HelperModels/ExcelInfo.cs   |  14 +
 .../HelperModels/ExcelMergeParameters.cs      |   9 +
 .../HelperModels/ExcelStyleInfoType.cs        |   9 +
 .../OfficePackage/HelperModels/PdfInfo.cs     |  12 +
 .../HelperModels/PdfParagraph.cs              |  10 +
 .../HelperModels/PdfParagraphAlignmentType.cs |   9 +
 .../HelperModels/PdfRowParameters.cs          |  10 +
 .../OfficePackage/HelperModels/WordInfo.cs    |  10 +
 .../HelperModels/WordJustificationType.cs     |   8 +
 .../HelperModels/WordParagraph.cs             |   8 +
 .../HelperModels/WordTextProperties.cs        |  10 +
 .../OfficePackage/Implements/SaveToExcel.cs   | 333 ++++++++++++++++++
 .../OfficePackage/Implements/SaveToPdf.cs     |  98 ++++++
 .../OfficePackage/Implements/SaveToWord.cs    | 124 +++++++
 .../PizzeriaBusinessLogic.csproj              |   3 +
 Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs | 125 +++++++
 20 files changed, 1023 insertions(+)
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs
 create mode 100644 Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs

diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
new file mode 100644
index 0000000..2a3b713
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
@@ -0,0 +1,96 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+namespace PizzeriaBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToExcel
+    {
+        /// <summary>
+        /// Создание отчета
+        /// </summary>
+        /// <param name="info"></param>
+        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.PizzaComponents)
+            {
+                InsertCellInWorksheet(new ExcelCellParameters
+                {
+                    ColumnName = "A",
+                    RowIndex = rowIndex,
+                    Text = pc.ComponentName,
+                    StyleInfo = ExcelStyleInfoType.Text
+                });
+                rowIndex++;
+                foreach (var pizza in pc.Pizzas)
+                {
+                    InsertCellInWorksheet(new ExcelCellParameters
+                    {
+                        ColumnName = "B",
+                        RowIndex = rowIndex,
+                        Text = pizza.Item1,
+                        StyleInfo =
+                    ExcelStyleInfoType.TextWithBroder
+                    });
+                    InsertCellInWorksheet(new ExcelCellParameters
+                    {
+                        ColumnName = "C",
+                        RowIndex = rowIndex,
+                        Text = pizza.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);
+        }
+        /// <summary>
+        /// Создание excel-файла
+        /// </summary>
+        /// <param name="info"></param>
+        protected abstract void CreateExcel(ExcelInfo info);
+        /// <summary>
+        /// Добавляем новую ячейку в лист
+        /// </summary>
+        /// <param name="cellParameters"></param>
+        protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
+        /// <summary>
+        /// Объединение ячеек
+        /// </summary>
+        /// <param name="mergeParameters"></param>
+        protected abstract void MergeCells(ExcelMergeParameters excelParams);
+        /// <summary>
+        /// Сохранение файла
+        /// </summary>
+        /// <param name="info"></param>
+        protected abstract void SaveExcel(ExcelInfo info);
+    }
+}
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
new file mode 100644
index 0000000..e131cab
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
@@ -0,0 +1,73 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+namespace PizzeriaBusinessLogic.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<string> { "2cm", "3cm", "6cm", "3cm" });
+            CreateRow(new PdfRowParameters
+            {
+                Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Сумма" },
+                Style = "NormalTitle",
+                ParagraphAlignment = PdfParagraphAlignmentType.Center
+            });
+            foreach (var order in info.Orders)
+            {
+                CreateRow(new PdfRowParameters
+                {
+                    Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.PizzaName, order.Sum.ToString() },
+                    Style = "Normal",
+                    ParagraphAlignment = PdfParagraphAlignmentType.Left
+                });
+            }
+            CreateParagraph(new PdfParagraph
+            {
+                Text = $"Итого: {info.Orders.Sum(x => x.Sum)}\t",
+                Style = "Normal",
+                ParagraphAlignment = PdfParagraphAlignmentType.Rigth
+            });
+            SavePdf(info);
+        }
+        /// <summary>
+        /// Создание doc-файла
+        /// </summary>
+        /// <param name="info"></param>
+        protected abstract void CreatePdf(PdfInfo info);
+        /// <summary>
+        /// Создание параграфа с текстом
+        /// </summary>
+        /// <param name="title"></param>
+        /// <param name="style"></param>
+        protected abstract void CreateParagraph(PdfParagraph paragraph);
+        /// <summary>
+        /// Создание таблицы
+        /// </summary>
+        /// <param name="title"></param>
+        /// <param name="style"></param>
+        protected abstract void CreateTable(List<string> columns);
+        /// <summary>
+        /// Создание и заполнение строки
+        /// </summary>
+        /// <param name="rowParameters"></param>
+        protected abstract void CreateRow(PdfRowParameters rowParameters);
+        /// <summary>
+        /// Сохранение файла
+        /// </summary>
+        /// <param name="info"></param>
+        protected abstract void SavePdf(PdfInfo info);
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs
new file mode 100644
index 0000000..d38b10b
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs
@@ -0,0 +1,50 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+namespace PizzeriaBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToWord
+    {
+        public void CreateDoc(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.Components)
+            {
+                CreateParagraph(new WordParagraph
+                {
+                    Texts = new List<(string, WordTextProperties)> { (component.ComponentName, new WordTextProperties { Size = "24", }) },
+                    TextProperties = new WordTextProperties
+                    {
+                        Size = "24",
+                        JustificationType = WordJustificationType.Both
+                    }
+                });
+            }
+            SaveWord(info);
+        }
+        /// <summary>
+        /// Создание doc-файла
+        /// </summary>
+        /// <param name="info"></param>
+        protected abstract void CreateWord(WordInfo info);
+        /// <summary>
+        /// Создание абзаца с текстом
+        /// </summary>
+        /// <param name="paragraph"></param>
+        /// <returns></returns>
+        protected abstract void CreateParagraph(WordParagraph paragraph);
+        /// <summary>
+        /// Сохранение файла
+        /// </summary>
+        /// <param name="info"></param>
+        protected abstract void SaveWord(WordInfo info);
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
new file mode 100644
index 0000000..0160d8d
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
@@ -0,0 +1,12 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+namespace PizzeriaBusinessLogic.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; }
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
new file mode 100644
index 0000000..f49d0c7
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs
@@ -0,0 +1,14 @@
+using PizzeriaContracts.ViewModels;
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelInfo
+    {
+        public string FileName { get; set; } = string.Empty;
+        public string Title { get; set; } = string.Empty;
+        public List<ReportPizzaComponentViewModel> PizzaComponents
+        {
+            get;
+            set;
+        } = new();
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
new file mode 100644
index 0000000..6243249
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
@@ -0,0 +1,9 @@
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelMergeParameters
+    {
+        public string CellFromName { get; set; } = string.Empty;
+        public string CellToName { get; set; } = string.Empty;
+        public string Merge => $"{CellFromName}:{CellToName}";
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs
new file mode 100644
index 0000000..5c15e8a
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/ExcelStyleInfoType.cs
@@ -0,0 +1,9 @@
+namespace PizzeriaBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum ExcelStyleInfoType
+    {
+        Title,
+        Text,
+        TextWithBroder
+    }
+}
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
new file mode 100644
index 0000000..2eadbfe
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs
@@ -0,0 +1,12 @@
+using PizzeriaContracts.ViewModels;
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class PdfInfo
+    {
+        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<ReportOrdersViewModel> Orders { get; set; } = new();
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
new file mode 100644
index 0000000..c186d93
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs
@@ -0,0 +1,10 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+namespace PizzeriaBusinessLogic.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/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs
new file mode 100644
index 0000000..ee0eaf2
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfParagraphAlignmentType.cs
@@ -0,0 +1,9 @@
+namespace PizzeriaBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum PdfParagraphAlignmentType
+    {
+        Center,
+        Left,
+        Rigth
+    }
+}
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
new file mode 100644
index 0000000..c9c87bc
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs
@@ -0,0 +1,10 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class PdfRowParameters
+    {
+        public List<string> Texts { get; set; } = new();
+        public string Style { get; set; } = string.Empty;
+        public PdfParagraphAlignmentType ParagraphAlignment { get; set; }
+    }
+}
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
new file mode 100644
index 0000000..60f1776
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
@@ -0,0 +1,10 @@
+using PizzeriaContracts.ViewModels;
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordInfo
+    {
+        public string FileName { get; set; } = string.Empty;
+        public string Title { get; set; } = string.Empty;
+        public List<ComponentViewModel> Components { get; set; } = new();
+    }
+}
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs
new file mode 100644
index 0000000..ad0729e
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordJustificationType.cs
@@ -0,0 +1,8 @@
+namespace PizzeriaBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum WordJustificationType
+    {
+        Center,
+        Both
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
new file mode 100644
index 0000000..001cd14
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
@@ -0,0 +1,8 @@
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordParagraph
+    {
+        public List<(string, WordTextProperties)> Texts { get; set; } = new();
+        public WordTextProperties? TextProperties { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
new file mode 100644
index 0000000..02824aa
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
@@ -0,0 +1,10 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordTextProperties
+    {
+        public string Size { get; set; } = string.Empty;
+        public bool Bold { get; set; }
+        public WordJustificationType JustificationType { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
new file mode 100644
index 0000000..197b9e0
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToExcel.cs
@@ -0,0 +1,333 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2013.Excel;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Spreadsheet;
+namespace PizzeriaBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToExcel : AbstractSaveToExcel
+    {
+        private SpreadsheetDocument? _spreadsheetDocument;
+        private SharedStringTablePart? _shareStringPart;
+        private Worksheet? _worksheet;
+        /// <summary>
+        /// Настройка стилей для файла
+        /// </summary>
+        /// <param name="workbookpart"></param>
+        private static void CreateStyles(WorkbookPart workbookpart)
+        {
+            var sp = workbookpart.AddNewPart<WorkbookStylesPart>();
+            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);
+        }
+        /// <summary>
+        /// Получение номера стиля из типа
+        /// </summary>
+        /// <param name="styleInfo"></param>
+        /// <returns></returns>
+        private static uint GetStyleValue(ExcelStyleInfoType styleInfo)
+        {
+            return styleInfo switch
+            {
+                ExcelStyleInfoType.Title => 2U,
+                ExcelStyleInfoType.TextWithBroder => 1U,
+                ExcelStyleInfoType.Text => 0U,
+                _ => 0U,
+            };
+        }
+        protected override void CreateExcel(ExcelInfo info)
+        {
+            _spreadsheetDocument = SpreadsheetDocument.Create(info.FileName,
+           SpreadsheetDocumentType.Workbook);
+            // Создаем книгу (в ней хранятся листы)
+            var workbookpart = _spreadsheetDocument.AddWorkbookPart();
+            workbookpart.Workbook = new Workbook();
+            CreateStyles(workbookpart);
+            // Получаем/создаем хранилище текстов для книги
+            _shareStringPart =
+           _spreadsheetDocument.WorkbookPart!.GetPartsOfType<SharedStringTablePart>().Any()
+            ?
+           _spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First()
+            :
+           _spreadsheetDocument.WorkbookPart.AddNewPart<SharedStringTablePart>();
+            // Создаем SharedStringTable, если его нет
+            if (_shareStringPart.SharedStringTable == null)
+            {
+                _shareStringPart.SharedStringTable = new SharedStringTable();
+            }
+            // Создаем лист в книгу
+            var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
+            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<SheetData>();
+            if (sheetData == null)
+            {
+                return;
+            }
+            // Ищем строку, либо добавляем ее
+            Row row;
+            if (sheetData.Elements<Row>().Where(r => r.RowIndex! ==
+           excelParams.RowIndex).Any())
+            {
+                row = sheetData.Elements<Row>().Where(r => r.RowIndex! ==
+               excelParams.RowIndex).First();
+            }
+            else
+            {
+                row = new Row() { RowIndex = excelParams.RowIndex };
+                sheetData.Append(row);
+            }
+            // Ищем нужную ячейку
+            Cell cell;
+            if (row.Elements<Cell>().Where(c => c.CellReference!.Value ==
+           excelParams.CellReference).Any())
+            {
+                cell = row.Elements<Cell>().Where(c => c.CellReference!.Value ==
+               excelParams.CellReference).First();
+            }
+            else
+            {
+                // Все ячейки должны быть последовательно друг за другом расположены
+                 // нужно определить, после какой вставлять
+                 Cell? refCell = null;
+                foreach (Cell rowCell in row.Elements<Cell>())
+                {
+                    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<SharedStringItem>().Count() - 1).ToString());
+            cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
+            cell.StyleIndex = GetStyleValue(excelParams.StyleInfo);
+        }
+        protected override void MergeCells(ExcelMergeParameters excelParams)
+        {
+            if (_worksheet == null)
+            {
+                return;
+            }
+            MergeCells mergeCells;
+            if (_worksheet.Elements<MergeCells>().Any())
+            {
+                mergeCells = _worksheet.Elements<MergeCells>().First();
+            }
+            else
+            {
+                mergeCells = new MergeCells();
+                if (_worksheet.Elements<CustomSheetView>().Any())
+                {
+                    _worksheet.InsertAfter(mergeCells,
+                   _worksheet.Elements<CustomSheetView>().First());
+                }
+                else
+                {
+                    _worksheet.InsertAfter(mergeCells,
+                   _worksheet.Elements<SheetData>().First());
+                }
+            }
+            var mergeCell = new MergeCell()
+            {
+                Reference = new StringValue(excelParams.Merge)
+            };
+            mergeCells.Append(mergeCell);
+        }
+        protected override void SaveExcel(ExcelInfo info)
+        {
+            if (_spreadsheetDocument == null)
+            {
+                return;
+            }
+            _spreadsheetDocument.WorkbookPart!.Workbook.Save();
+            _spreadsheetDocument.Close();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
new file mode 100644
index 0000000..65635eb
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToPdf.cs
@@ -0,0 +1,98 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.DocumentObjectModel.Tables;
+using MigraDoc.Rendering;
+namespace PizzeriaBusinessLogic.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.Rigth => ParagraphAlignment.Right,
+                _ => ParagraphAlignment.Justify,
+            };
+        }
+        /// <summary>
+        /// Создание стилей для документа
+        /// </summary>
+        /// <param name="document"></param>
+        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(PdfInfo 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<string> 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(PdfInfo info)
+        {
+            var renderer = new PdfDocumentRenderer(true)
+            {
+                Document = _document
+            };
+            renderer.RenderDocument();
+            renderer.PdfDocument.Save(info.FileName);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs
new file mode 100644
index 0000000..c70176e
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs
@@ -0,0 +1,124 @@
+using PizzeriaBusinessLogic.OfficePackage.HelperEnums;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+namespace PizzeriaBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToWord : AbstractSaveToWord
+    {
+        private WordprocessingDocument? _wordDocument;
+        private Body? _docBody;
+        /// <summary>
+        /// Получение типа выравнивания
+        /// </summary>
+        /// <param name="type"></param>
+        /// <returns></returns>
+        private static JustificationValues
+       GetJustificationValues(WordJustificationType type)
+        {
+            return type switch
+            {
+                WordJustificationType.Both => JustificationValues.Both,
+                WordJustificationType.Center => JustificationValues.Center,
+                _ => JustificationValues.Left,
+            };
+        }
+        /// <summary>
+        /// Настройки страницы
+        /// </summary>
+        /// <returns></returns>
+        private static SectionProperties CreateSectionProperties()
+        {
+            var properties = new SectionProperties();
+            var pageSize = new PageSize
+            {
+                Orient = PageOrientationValues.Portrait
+            };
+            properties.AppendChild(pageSize);
+            return properties;
+        }
+        /// <summary>
+        /// Задание форматирования для абзаца
+        /// </summary>
+        /// <param name="paragraphProperties"></param>
+        /// <returns></returns>
+        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(WordInfo 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(WordInfo info)
+        {
+            if (_docBody == null || _wordDocument == null)
+            {
+                return;
+            }
+            _docBody.AppendChild(CreateSectionProperties());
+            _wordDocument.MainDocumentPart!.Document.Save();
+            _wordDocument.Close();
+        }
+    }
+}
diff --git a/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj b/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj
index 9ba5e7e..61876fd 100644
--- a/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj
+++ b/Pizzeria/PizzeriaBusinessLogic/PizzeriaBusinessLogic.csproj
@@ -7,7 +7,10 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="DocumentFormat.OpenXml" Version="2.19.0" />
     <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
+    <PackageReference Include="MigraDoc.DocumentObjectModel.Core" Version="1.0.0" />
+    <PackageReference Include="MigraDoc.Rendering.Core" Version="1.0.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs
new file mode 100644
index 0000000..6baed96
--- /dev/null
+++ b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs
@@ -0,0 +1,125 @@
+using PizzeriaBusinessLogic.OfficePackage;
+using PizzeriaBusinessLogic.OfficePackage.HelperModels;
+using PizzeriaContracts.BindingModels;
+using PizzeriaContracts.BusinessLogicsContracts;
+using PizzeriaContracts.SearchModels;
+using PizzeriaContracts.StoragesContracts;
+using PizzeriaContracts.ViewModels;
+
+namespace PizzeriaBusinessLogic
+{
+    public class ReportLogic : IReportLogic
+    {
+        private readonly IComponentStorage _componentStorage;
+        private readonly IPizzaStorage _pizzaStorage;
+        private readonly IOrderStorage _orderStorage;
+        private readonly AbstractSaveToExcel _saveToExcel;
+        private readonly AbstractSaveToWord _saveToWord;
+        private readonly AbstractSaveToPdf _saveToPdf;
+        public ReportLogic(IPizzaStorage pizzaStorage, IComponentStorage
+       componentStorage, IOrderStorage orderStorage,
+        AbstractSaveToExcel saveToExcel, AbstractSaveToWord saveToWord,
+       AbstractSaveToPdf saveToPdf)
+        {
+            _pizzaStorage = pizzaStorage;
+            _componentStorage = componentStorage;
+            _orderStorage = orderStorage;
+            _saveToExcel = saveToExcel;
+            _saveToWord = saveToWord;
+            _saveToPdf = saveToPdf;
+        }
+        /// <summary>
+        /// Получение списка компонент с указанием, в каких изделиях используются
+        /// </summary>
+        /// <returns></returns>
+        public List<ReportPizzaComponentViewModel> GetPizzaComponent()
+        {
+            var components = _componentStorage.GetFullList();
+            var pizzas = _pizzaStorage.GetFullList();
+            var list = new List<ReportPizzaComponentViewModel>();
+            foreach (var component in components)
+            {
+                var record = new ReportPizzaComponentViewModel
+                {
+                    ComponentName = component.ComponentName,
+                    Pizzas = new List<Tuple<string, int>>(),
+                    TotalCount = 0
+                };
+                foreach (var pizza in pizzas)
+                {
+                    if (pizza.PizzaComponents.ContainsKey(component.Id))
+                    {
+                        record.Pizzas.Add(new Tuple<string,
+                       int>(pizza.PizzaName, pizza.PizzaComponents[component.Id].Item2));
+                        record.TotalCount +=
+                       pizza.PizzaComponents[component.Id].Item2;
+                    }
+                }
+                list.Add(record);
+            }
+            return list;
+        }
+        /// <summary>
+        /// Получение списка заказов за определенный период
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        public List<ReportOrdersViewModel> GetOrders(ReportBindingModel model)
+        {
+            return _orderStorage.GetFilteredList(new OrderSearchModel
+            {
+                DateFrom = model.DateFrom,
+                DateTo = model.DateTo
+            })
+            .Select(x => new ReportOrdersViewModel
+            {
+                Id = x.Id,
+                DateCreate = x.DateCreate,
+                PizzaName = x.PizzaName,
+                Sum = x.Sum
+            })
+           .ToList();
+        }
+        /// <summary>
+        /// Сохранение компонент в файл-Word
+        /// </summary>
+        /// <param name="model"></param>
+        public void SaveComponentsToWordFile(ReportBindingModel model)
+        {
+            _saveToWord.CreateDoc(new WordInfo
+            {
+                FileName = model.FileName,
+                Title = "Список компонент",
+                Components = _componentStorage.GetFullList()
+            });
+        }
+        /// <summary>
+        /// Сохранение компонент с указаеним продуктов в файл-Excel
+        /// </summary>
+        /// <param name="model"></param>
+        public void SavePizzaComponentToExcelFile(ReportBindingModel model)
+        {
+            _saveToExcel.CreateReport(new ExcelInfo
+            {
+                FileName = model.FileName,
+                Title = "Список компонент",
+                PizzaComponents = GetPizzaComponent()
+            });
+        }
+        /// <summary>
+        /// Сохранение заказов в файл-Pdf
+        /// </summary>
+        /// <param name="model"></param>
+        public void SaveOrdersToPdfFile(ReportBindingModel model)
+        {
+            _saveToPdf.CreateDoc(new PdfInfo
+            {
+                FileName = model.FileName,
+                Title = "Список заказов",
+                DateFrom = model.DateFrom!.Value,
+                DateTo = model.DateTo!.Value,
+                Orders = GetOrders(model)
+            });
+        }
+    }
+}
\ No newline at end of file
-- 
2.25.1


From b3db89edd4822d9a91a8b5b2011a390007dc8131 Mon Sep 17 00:00:00 2001
From: MaxKarme <91691525+MaxKarme@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:34:28 +0400
Subject: [PATCH 3/6] contracts layer

---
 .../BindingModels/ReportBindingModel.cs       |  9 +++++
 .../BusinessLogicsContracts/IReportLogic.cs   | 35 +++++++++++++++++++
 .../SearchModels/OrderSearchModel.cs          |  2 ++
 .../ViewModels/ReportOrdersViewModel.cs       | 10 ++++++
 .../ReportPizzaComponentViewModel.cs          |  9 +++++
 .../PizzeriaContracts/ViewModels/WordInfo.cs  | 12 +++++++
 6 files changed, 77 insertions(+)
 create mode 100644 Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs
 create mode 100644 Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs
 create mode 100644 Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs
 create mode 100644 Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs
 create mode 100644 Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs

diff --git a/Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs b/Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs
new file mode 100644
index 0000000..3a6a68a
--- /dev/null
+++ b/Pizzeria/PizzeriaContracts/BindingModels/ReportBindingModel.cs
@@ -0,0 +1,9 @@
+namespace PizzeriaContracts.BindingModels
+{
+    public class ReportBindingModel
+    {
+        public string FileName { get; set; } = string.Empty;
+        public DateTime? DateFrom { get; set; }
+        public DateTime? DateTo { get; set; }
+    }
+}
diff --git a/Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs b/Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs
new file mode 100644
index 0000000..c09d455
--- /dev/null
+++ b/Pizzeria/PizzeriaContracts/BusinessLogicsContracts/IReportLogic.cs
@@ -0,0 +1,35 @@
+using PizzeriaContracts.BindingModels;
+using PizzeriaContracts.ViewModels;
+using System.Collections.Generic;
+namespace PizzeriaContracts.BusinessLogicsContracts
+{
+    public interface IReportLogic
+    {
+        /// <summary>
+        /// Получение списка компонент с указанием, в каких изделиях используются
+        /// </summary>
+        /// <returns></returns>
+        List<ReportPizzaComponentViewModel> GetPizzaComponent();
+        /// <summary>
+        /// Получение списка заказов за определенный период
+        /// </summary>
+        /// <param name="model"></param>
+        /// <returns></returns>
+        List<ReportOrdersViewModel> GetOrders(ReportBindingModel model);
+        /// <summary>
+        /// Сохранение компонент в файл-Word
+        /// </summary>
+        /// <param name="model"></param>
+        void SaveComponentsToWordFile(ReportBindingModel model);
+        /// <summary>
+        /// Сохранение компонент с указаеним продуктов в файл-Excel
+        /// </summary>
+        /// <param name="model"></param>
+        void SavePizzaComponentToExcelFile(ReportBindingModel model);
+        /// <summary>
+        /// Сохранение заказов в файл-Pdf
+        /// </summary>
+        /// <param name="model"></param>
+        void SaveOrdersToPdfFile(ReportBindingModel model);
+    }
+}
diff --git a/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs b/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs
index 3695879..b2e6ddd 100644
--- a/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs
+++ b/Pizzeria/PizzeriaContracts/SearchModels/OrderSearchModel.cs
@@ -9,5 +9,7 @@ namespace PizzeriaContracts.SearchModels
     public class OrderSearchModel
     {
         public int? Id { get; set; }
+        public DateTime? DateFrom { get; set; }
+        public DateTime? DateTo { get; set; }
     }
 }
diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs
new file mode 100644
index 0000000..2b1f3c1
--- /dev/null
+++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs
@@ -0,0 +1,10 @@
+namespace PizzeriaContracts.ViewModels
+{
+    public class ReportOrdersViewModel
+    {
+        public int Id { get; set; }
+        public DateTime DateCreate { get; set; }
+        public string PizzaName { get; set; } = string.Empty;
+        public double Sum { get; set; }
+    }
+}
diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs
new file mode 100644
index 0000000..e96bf04
--- /dev/null
+++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs
@@ -0,0 +1,9 @@
+namespace PizzeriaContracts.ViewModels
+{
+    public class ReportPizzaComponentViewModel
+    {
+        public string ComponentName { get; set; } = string.Empty;
+        public int TotalCount { get; set; }
+        public List<Tuple<string, int>> Pizzas { get; set; } = new();
+    }
+}
diff --git a/Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs b/Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs
new file mode 100644
index 0000000..76306d2
--- /dev/null
+++ b/Pizzeria/PizzeriaContracts/ViewModels/WordInfo.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PizzeriaContracts.ViewModels
+{
+    internal class WordInfo
+    {
+    }
+}
-- 
2.25.1


From f41a3493b109754bd7de971b06355e9f1fc967f7 Mon Sep 17 00:00:00 2001
From: MaxKarme <91691525+MaxKarme@users.noreply.github.com>
Date: Fri, 24 Mar 2023 21:34:48 +0400
Subject: [PATCH 4/6] database implements layers

---
 .../PizzeriaDatabaseImplement/Implements/OrderStorage.cs   | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs
index d5b4c63..54091c3 100644
--- a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs
+++ b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs
@@ -22,7 +22,12 @@ namespace PizzeriaDatabaseImplement.Implements
         {
             using var context = new PizzeriaDatabase();
             return context.Orders
-                .Where(x => (model.Id.HasValue && x.Id == model.Id))
+                .Where(x => (
+                        (!model.Id.HasValue || x.Id == model.Id) &&
+                        (!model.DateFrom.HasValue || x.DateCreate >= model.DateFrom) &&
+                        (!model.DateTo.HasValue || x.DateCreate <= model.DateTo)
+                    )
+                )
                 .Select(x => x.GetViewModel)
                 .ToList();
         }
-- 
2.25.1


From f396af1eb906e233f7da9429cc39ed9c3a1f6d9d Mon Sep 17 00:00:00 2001
From: MaxKarme <91691525+MaxKarme@users.noreply.github.com>
Date: Tue, 28 Mar 2023 10:45:31 +0400
Subject: [PATCH 5/6] fix

---
 Pizzeria/Pizzeria/FormMain.Designer.cs        |   4 +-
 Pizzeria/Pizzeria/FormMain.cs                 |   7 +-
 .../Pizzeria/FormReportOrders.Designer.cs     |   4 +-
 .../Pizzeria/FormReportPizzaComponents.cs     |   4 +-
 Pizzeria/Pizzeria/Pizzeria.csproj             |  15 +++
 .../Pizzeria/Properties/Resources.Designer.cs |  63 +++++++++
 Pizzeria/Pizzeria/Properties/Resources.resx   | 120 ++++++++++++++++++
 Pizzeria/Pizzeria/ReportOrders.rdlc           |  82 +++++++++++-
 .../OfficePackage/AbstractSaveToExcel.cs      |   4 +-
 .../OfficePackage/AbstractSaveToPdf.cs        |   6 +-
 .../OfficePackage/AbstractSaveToWord.cs       |   7 +-
 .../OfficePackage/HelperModels/WordInfo.cs    |   2 +-
 .../OfficePackage/Implements/SaveToWord.cs    |  12 +-
 Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs |  27 ++--
 .../ViewModels/ReportOrdersViewModel.cs       |   1 +
 .../ReportPizzaComponentViewModel.cs          |   4 +-
 .../Implements/OrderStorage.cs                |   1 +
 17 files changed, 313 insertions(+), 50 deletions(-)
 create mode 100644 Pizzeria/Pizzeria/Properties/Resources.Designer.cs
 create mode 100644 Pizzeria/Pizzeria/Properties/Resources.resx

diff --git a/Pizzeria/Pizzeria/FormMain.Designer.cs b/Pizzeria/Pizzeria/FormMain.Designer.cs
index 73ed42d..4115e88 100644
--- a/Pizzeria/Pizzeria/FormMain.Designer.cs
+++ b/Pizzeria/Pizzeria/FormMain.Designer.cs
@@ -172,8 +172,8 @@
             // 
             this.списокКомпонентовToolStripMenuItem.Name = "списокКомпонентовToolStripMenuItem";
             this.списокКомпонентовToolStripMenuItem.Size = new System.Drawing.Size(269, 26);
-            this.списокКомпонентовToolStripMenuItem.Text = "Список компонентов";
-            this.списокКомпонентовToolStripMenuItem.Click += new System.EventHandler(this.ComponentsToolStripMenuItem_Click);
+            this.списокКомпонентовToolStripMenuItem.Text = "Список пицц";
+            this.списокКомпонентовToolStripMenuItem.Click += new System.EventHandler(this.PizzasToolStripMenuItem_Click);
             // 
             // компонентовПоПиццамToolStripMenuItem
             // 
diff --git a/Pizzeria/Pizzeria/FormMain.cs b/Pizzeria/Pizzeria/FormMain.cs
index eed58d0..3edbbb3 100644
--- a/Pizzeria/Pizzeria/FormMain.cs
+++ b/Pizzeria/Pizzeria/FormMain.cs
@@ -153,9 +153,7 @@ namespace Pizzeria
             LoadData();
         }
 
-
-        private void ComponentsToolStripMenuItem_Click(object sender, EventArgs
-e)
+        private void PizzasToolStripMenuItem_Click(object sender, EventArgs e)
         {
             using var dialog = new SaveFileDialog { Filter = "docx|*.docx" };
             if (dialog.ShowDialog() == DialogResult.OK)
@@ -164,8 +162,7 @@ e)
                 {
                     FileName = dialog.FileName
                 });
-                MessageBox.Show("���������", "�����", MessageBoxButtons.OK,
-               MessageBoxIcon.Information);
+                MessageBox.Show("���������", "�����", MessageBoxButtons.OK, MessageBoxIcon.Information);
             }
         }
         private void ComponentPizzasToolStripMenuItem_Click(object sender, EventArgs e)
diff --git a/Pizzeria/Pizzeria/FormReportOrders.Designer.cs b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs
index 72dd438..8d5991d 100644
--- a/Pizzeria/Pizzeria/FormReportOrders.Designer.cs
+++ b/Pizzeria/Pizzeria/FormReportOrders.Designer.cs
@@ -94,14 +94,14 @@
             this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
             this.panel.Location = new System.Drawing.Point(0, 46);
             this.panel.Name = "panel";
-            this.panel.Size = new System.Drawing.Size(843, 409);
+            this.panel.Size = new System.Drawing.Size(937, 409);
             this.panel.TabIndex = 7;
             // 
             // FormReportOrders
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-            this.ClientSize = new System.Drawing.Size(842, 470);
+            this.ClientSize = new System.Drawing.Size(942, 470);
             this.Controls.Add(this.panel);
             this.Controls.Add(this.button2);
             this.Controls.Add(this.button1);
diff --git a/Pizzeria/Pizzeria/FormReportPizzaComponents.cs b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs
index fb5b94f..5dda768 100644
--- a/Pizzeria/Pizzeria/FormReportPizzaComponents.cs
+++ b/Pizzeria/Pizzeria/FormReportPizzaComponents.cs
@@ -23,8 +23,8 @@ namespace Pizzeria
                     dataGridView.Rows.Clear();
                     foreach (var elem in dict)
                     {
-                        dataGridView.Rows.Add(new object[] { elem.ComponentName, "", "" });
-                        foreach (var listElem in elem.Pizzas)
+                        dataGridView.Rows.Add(new object[] { elem.PizzaName, "", "" });
+                        foreach (var listElem in elem.Components)
                         {
                             dataGridView.Rows.Add(new object[] { "", listElem.Item1, listElem.Item2 });
                         }
diff --git a/Pizzeria/Pizzeria/Pizzeria.csproj b/Pizzeria/Pizzeria/Pizzeria.csproj
index 9b2c453..6b2550f 100644
--- a/Pizzeria/Pizzeria/Pizzeria.csproj
+++ b/Pizzeria/Pizzeria/Pizzeria.csproj
@@ -26,6 +26,21 @@
     <ProjectReference Include="..\PizzeriaShopFileImplement\PizzeriaFileImplement.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Compile Update="Properties\Resources.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Update="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+  </ItemGroup>
+
   <ItemGroup>
     <None Update="nlog.config">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
diff --git a/Pizzeria/Pizzeria/Properties/Resources.Designer.cs b/Pizzeria/Pizzeria/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..13c5d43
--- /dev/null
+++ b/Pizzeria/Pizzeria/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     Этот код создан программой.
+//     Исполняемая версия:4.0.30319.42000
+//
+//     Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
+//     повторной генерации кода.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace Pizzeria.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
+    /// </summary>
+    // Этот класс создан автоматически классом StronglyTypedResourceBuilder
+    // с помощью такого средства, как ResGen или Visual Studio.
+    // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
+    // с параметром /str или перестройте свой проект VS.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class 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() {
+        }
+        
+        /// <summary>
+        ///   Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Pizzeria.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Перезаписывает свойство CurrentUICulture текущего потока для всех
+        ///   обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/Pizzeria/Pizzeria/Properties/Resources.resx b/Pizzeria/Pizzeria/Properties/Resources.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/Pizzeria/Pizzeria/Properties/Resources.resx
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/Pizzeria/Pizzeria/ReportOrders.rdlc b/Pizzeria/Pizzeria/ReportOrders.rdlc
index 0eb814a..fdc4a16 100644
--- a/Pizzeria/Pizzeria/ReportOrders.rdlc
+++ b/Pizzeria/Pizzeria/ReportOrders.rdlc
@@ -29,6 +29,10 @@
           <DataField>PizzaName</DataField>
           <rd:TypeName>System.String</rd:TypeName>
         </Field>
+        <Field Name="OrderStatus">
+          <DataField>OrderStatus</DataField>
+          <rd:TypeName>System.String</rd:TypeName>
+        </Field>
         <Field Name="Sum">
           <DataField>Sum</DataField>
           <rd:TypeName>System.Decimal</rd:TypeName>
@@ -116,16 +120,19 @@
             <TablixBody>
               <TablixColumns>
                 <TablixColumn>
-                  <Width>2.5cm</Width>
+                  <Width>2.0889cm</Width>
                 </TablixColumn>
                 <TablixColumn>
-                  <Width>3.21438cm</Width>
+                  <Width>2.80328cm</Width>
                 </TablixColumn>
                 <TablixColumn>
-                  <Width>8.23317cm</Width>
+                  <Width>7.82207cm</Width>
                 </TablixColumn>
                 <TablixColumn>
-                  <Width>2.5cm</Width>
+                  <Width>2.0889cm</Width>
+                </TablixColumn>
+                <TablixColumn>
+                  <Width>2.0889cm</Width>
                 </TablixColumn>
               </TablixColumns>
               <TablixRows>
@@ -228,6 +235,38 @@
                         </Textbox>
                       </CellContents>
                     </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="Textbox2">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>Order Status</Value>
+                                  <Style>
+                                    <FontWeight>Bold</FontWeight>
+                                  </Style>
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>Textbox2</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
                     <TablixCell>
                       <CellContents>
                         <Textbox Name="Textbox7">
@@ -357,6 +396,36 @@
                         </Textbox>
                       </CellContents>
                     </TablixCell>
+                    <TablixCell>
+                      <CellContents>
+                        <Textbox Name="OrderStatus">
+                          <CanGrow>true</CanGrow>
+                          <KeepTogether>true</KeepTogether>
+                          <Paragraphs>
+                            <Paragraph>
+                              <TextRuns>
+                                <TextRun>
+                                  <Value>=Fields!OrderStatus.Value</Value>
+                                  <Style />
+                                </TextRun>
+                              </TextRuns>
+                              <Style />
+                            </Paragraph>
+                          </Paragraphs>
+                          <rd:DefaultName>OrderStatus</rd:DefaultName>
+                          <Style>
+                            <Border>
+                              <Color>LightGrey</Color>
+                              <Style>Solid</Style>
+                            </Border>
+                            <PaddingLeft>2pt</PaddingLeft>
+                            <PaddingRight>2pt</PaddingRight>
+                            <PaddingTop>2pt</PaddingTop>
+                            <PaddingBottom>2pt</PaddingBottom>
+                          </Style>
+                        </Textbox>
+                      </CellContents>
+                    </TablixCell>
                     <TablixCell>
                       <CellContents>
                         <Textbox Name="Sum">
@@ -397,6 +466,7 @@
                 <TablixMember />
                 <TablixMember />
                 <TablixMember />
+                <TablixMember />
               </TablixMembers>
             </TablixColumnHierarchy>
             <TablixRowHierarchy>
@@ -413,7 +483,7 @@
             <Top>2.48391cm</Top>
             <Left>0.55245cm</Left>
             <Height>1.2cm</Height>
-            <Width>16.44755cm</Width>
+            <Width>16.89205cm</Width>
             <ZIndex>2</ZIndex>
             <Style>
               <Border>
@@ -491,7 +561,7 @@
         <Height>6.27908cm</Height>
         <Style />
       </Body>
-      <Width>17.4445cm</Width>
+      <Width>18.27233cm</Width>
       <Page>
         <PageHeight>29.7cm</PageHeight>
         <PageWidth>21cm</PageWidth>
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
index 2a3b713..8d46ed7 100644
--- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToExcel.cs
@@ -30,11 +30,11 @@ namespace PizzeriaBusinessLogic.OfficePackage
                 {
                     ColumnName = "A",
                     RowIndex = rowIndex,
-                    Text = pc.ComponentName,
+                    Text = pc.PizzaName,
                     StyleInfo = ExcelStyleInfoType.Text
                 });
                 rowIndex++;
-                foreach (var pizza in pc.Pizzas)
+                foreach (var pizza in pc.Components)
                 {
                     InsertCellInWorksheet(new ExcelCellParameters
                     {
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
index e131cab..8b1e082 100644
--- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToPdf.cs
@@ -18,10 +18,10 @@ namespace PizzeriaBusinessLogic.OfficePackage
                 Text = $"с { info.DateFrom.ToShortDateString() } по { info.DateTo.ToShortDateString() }", Style = "Normal",
                 ParagraphAlignment = PdfParagraphAlignmentType.Center
             });
-            CreateTable(new List<string> { "2cm", "3cm", "6cm", "3cm" });
+            CreateTable(new List<string> { "2cm", "3cm", "5cm", "4cm", "3cm" });
             CreateRow(new PdfRowParameters
             {
-                Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Сумма" },
+                Texts = new List<string> { "Номер", "Дата заказа", "Изделие", "Статус заказа", "Сумма" },
                 Style = "NormalTitle",
                 ParagraphAlignment = PdfParagraphAlignmentType.Center
             });
@@ -29,7 +29,7 @@ namespace PizzeriaBusinessLogic.OfficePackage
             {
                 CreateRow(new PdfRowParameters
                 {
-                    Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.PizzaName, order.Sum.ToString() },
+                    Texts = new List<string> { order.Id.ToString(), order.DateCreate.ToShortDateString(), order.PizzaName, order.OrderStatus, order.Sum.ToString() },
                     Style = "Normal",
                     ParagraphAlignment = PdfParagraphAlignmentType.Left
                 });
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs
index d38b10b..9a0388b 100644
--- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/AbstractSaveToWord.cs
@@ -16,11 +16,14 @@ namespace PizzeriaBusinessLogic.OfficePackage
                     JustificationType = WordJustificationType.Center
                 }
             });
-            foreach (var component in info.Components)
+            foreach (var component in info.Pizzas)
             {
                 CreateParagraph(new WordParagraph
                 {
-                    Texts = new List<(string, WordTextProperties)> { (component.ComponentName, new WordTextProperties { Size = "24", }) },
+                    Texts = new List<(string, WordTextProperties)> { 
+                        (component.PizzaName, new WordTextProperties { Size = "24", Bold = true }),
+                        (" " + component.Price.ToString(), new WordTextProperties { Size = "24" })
+                    },
                     TextProperties = new WordTextProperties
                     {
                         Size = "24",
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
index 60f1776..ecb9b45 100644
--- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/HelperModels/WordInfo.cs
@@ -5,6 +5,6 @@ namespace PizzeriaBusinessLogic.OfficePackage.HelperModels
     {
         public string FileName { get; set; } = string.Empty;
         public string Title { get; set; } = string.Empty;
-        public List<ComponentViewModel> Components { get; set; } = new();
+        public List<PizzaViewModel> Pizzas { get; set; } = new();
     }
 }
diff --git a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs
index c70176e..0ee7436 100644
--- a/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs
+++ b/Pizzeria/PizzeriaBusinessLogic/OfficePackage/Implements/SaveToWord.cs
@@ -53,8 +53,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements
             var properties = new ParagraphProperties();
             properties.AppendChild(new Justification()
             {
-                Val =
-           GetJustificationValues(paragraphProperties.JustificationType)
+                Val = GetJustificationValues(paragraphProperties.JustificationType)
             });
             properties.AppendChild(new SpacingBetweenLines
             {
@@ -66,8 +65,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements
             {
                 paragraphMarkRunProperties.AppendChild(new FontSize
                 {
-                    Val =
-               paragraphProperties.Size
+                    Val = paragraphProperties.Size
                 });
             }
             properties.AppendChild(paragraphMarkRunProperties);
@@ -75,8 +73,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements
         }
         protected override void CreateWord(WordInfo info)
         {
-            _wordDocument = WordprocessingDocument.Create(info.FileName,
-           WordprocessingDocumentType.Document);
+            _wordDocument = WordprocessingDocument.Create(info.FileName, WordprocessingDocumentType.Document);
             MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
             mainPart.Document = new Document();
             _docBody = mainPart.Document.AppendChild(new Body());
@@ -103,8 +100,7 @@ namespace PizzeriaBusinessLogic.OfficePackage.Implements
                 docRun.AppendChild(new Text
                 {
                     Text = run.Item1,
-                    Space =
-               SpaceProcessingModeValues.Preserve
+                    Space = SpaceProcessingModeValues.Preserve
                 });
                 docParagraph.AppendChild(docRun);
             }
diff --git a/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs
index 6baed96..0fc63ce 100644
--- a/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs
+++ b/Pizzeria/PizzeriaBusinessLogic/ReportLogic.cs
@@ -34,29 +34,25 @@ namespace PizzeriaBusinessLogic
         /// <returns></returns>
         public List<ReportPizzaComponentViewModel> GetPizzaComponent()
         {
-            var components = _componentStorage.GetFullList();
             var pizzas = _pizzaStorage.GetFullList();
             var list = new List<ReportPizzaComponentViewModel>();
-            foreach (var component in components)
+            foreach(var pizza in pizzas)
             {
                 var record = new ReportPizzaComponentViewModel
                 {
-                    ComponentName = component.ComponentName,
-                    Pizzas = new List<Tuple<string, int>>(),
-                    TotalCount = 0
+                    PizzaName = pizza.PizzaName,
+                    TotalCount = 0,
+                    Components = new List<(string componentName, int count)>()
                 };
-                foreach (var pizza in pizzas)
+
+                foreach(var component in pizza.PizzaComponents)
                 {
-                    if (pizza.PizzaComponents.ContainsKey(component.Id))
-                    {
-                        record.Pizzas.Add(new Tuple<string,
-                       int>(pizza.PizzaName, pizza.PizzaComponents[component.Id].Item2));
-                        record.TotalCount +=
-                       pizza.PizzaComponents[component.Id].Item2;
-                    }
+                    record.Components.Add((component.Value.Item1.ComponentName, component.Value.Item2 ));
+                    record.TotalCount += component.Value.Item2;
                 }
                 list.Add(record);
             }
+
             return list;
         }
         /// <summary>
@@ -76,6 +72,7 @@ namespace PizzeriaBusinessLogic
                 Id = x.Id,
                 DateCreate = x.DateCreate,
                 PizzaName = x.PizzaName,
+                OrderStatus = x.Status.ToString(),
                 Sum = x.Sum
             })
            .ToList();
@@ -89,8 +86,8 @@ namespace PizzeriaBusinessLogic
             _saveToWord.CreateDoc(new WordInfo
             {
                 FileName = model.FileName,
-                Title = "Список компонент",
-                Components = _componentStorage.GetFullList()
+                Title = "Список пицц",
+                Pizzas = _pizzaStorage.GetFullList()
             });
         }
         /// <summary>
diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs
index 2b1f3c1..7aa2ce6 100644
--- a/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs
+++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportOrdersViewModel.cs
@@ -5,6 +5,7 @@
         public int Id { get; set; }
         public DateTime DateCreate { get; set; }
         public string PizzaName { get; set; } = string.Empty;
+        public string OrderStatus { get; set; } = string.Empty;
         public double Sum { get; set; }
     }
 }
diff --git a/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs
index e96bf04..b085794 100644
--- a/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs
+++ b/Pizzeria/PizzeriaContracts/ViewModels/ReportPizzaComponentViewModel.cs
@@ -2,8 +2,8 @@
 {
     public class ReportPizzaComponentViewModel
     {
-        public string ComponentName { get; set; } = string.Empty;
+        public string PizzaName { get; set; } = string.Empty;
         public int TotalCount { get; set; }
-        public List<Tuple<string, int>> Pizzas { get; set; } = new();
+        public List<(string componentName, int count)> Components { get; set; } = new();
     }
 }
diff --git a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs
index 54091c3..208bf06 100644
--- a/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs
+++ b/Pizzeria/PizzeriaDatabaseImplement/Implements/OrderStorage.cs
@@ -22,6 +22,7 @@ namespace PizzeriaDatabaseImplement.Implements
         {
             using var context = new PizzeriaDatabase();
             return context.Orders
+                .Include(x => x.Pizza)
                 .Where(x => (
                         (!model.Id.HasValue || x.Id == model.Id) &&
                         (!model.DateFrom.HasValue || x.DateCreate >= model.DateFrom) &&
-- 
2.25.1


From 7630dabb9e72ca766df562441738277d61336080 Mon Sep 17 00:00:00 2001
From: parap <parap123456789@mail.ru>
Date: Tue, 2 May 2023 22:29:10 +0400
Subject: [PATCH 6/6] dop logic

---
 Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs   | 6 +++++-
 .../PizzeriaShopFileImplement/Implements/OrderStorage.cs    | 5 ++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs
index 2e033c4..6444065 100644
--- a/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs
+++ b/Pizzeria/PizzeriaListImplement/Implements/OrderStorage.cs
@@ -39,7 +39,11 @@ namespace PizzeriaListImplement.Implements
 
             foreach (var order in _source.Orders)
             {
-                if (model.Id.HasValue && order.Id == model.Id)
+                if (
+                        (!model.Id.HasValue || order.Id == model.Id) &&
+                        (!model.DateFrom.HasValue || order.DateCreate >= model.DateFrom) &&
+                        (!model.DateTo.HasValue || order.DateCreate <= model.DateTo)
+                    )
                 {
                     OrderViewModel viewModel = order.GetViewModel;
                     viewModel.PizzaName = _pizzaStorage.GetElement(new PizzaSearchModel { Id = order.PizzaId }).PizzaName;
diff --git a/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs b/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs
index 9c695a3..92895f0 100644
--- a/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs
+++ b/Pizzeria/PizzeriaShopFileImplement/Implements/OrderStorage.cs
@@ -23,7 +23,10 @@ namespace PizzeriaFileImplement.Implements
         public List<OrderViewModel> GetFilteredList(OrderSearchModel model)
         {
             return source.Orders
-                .Where(x => (model.Id.HasValue && x.Id == model.Id))
+                .Where(x => 
+                        (!model.Id.HasValue || x.Id == model.Id) &&
+                        (!model.DateFrom.HasValue || x.DateCreate >= model.DateFrom) &&
+                        (!model.DateTo.HasValue || x.DateCreate <= model.DateTo))
                 .Select(x => x.GetViewModel)
                 .ToList();
         }
-- 
2.25.1