From 004c0381f57b80c2bb7388263093661e42a86c07 Mon Sep 17 00:00:00 2001
From: Alenka <Alenka@DESKTOP-ANJF2LU>
Date: Thu, 2 May 2024 16:51:23 +0400
Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BE=D0=BA=20=D0=BC?=
 =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BD=D0=B5=20=D0=B1=D1=8B=D0=B2?=
 =?UTF-8?q?=D0=B0=D0=B5=D1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../BusinessLogics/ReportLogicPharmacist.cs   |  52 +--
 .../HospitalBusinessLogic.csproj              |   1 +
 .../AbstractSaveToExcelPharmacist.cs          |  72 ++++
 .../AbstractSaveToWordPharmacist.cs           |  61 ++++
 .../HelperEnums/ExcelStyleInfoType.cs         |  15 +
 .../HelperEnums/WordJustificationType.cs      |  14 +
 .../HelperModels/ExcelCellParameters.cs       |  19 +
 .../HelperModels/ExcelInfoPharmacist.cs       |  21 ++
 .../HelperModels/ExcelMergeParameters.cs      |  15 +
 .../HelperModels/WordInfoPharmacist.cs        |  16 +
 .../HelperModels/WordParagraph.cs             |  14 +
 .../HelperModels/WordTextProperties.cs        |  17 +
 .../Implements/SaveToExcelPharmacist.cs       | 335 ++++++++++++++++++
 .../Implements/SaveToWordPharmacist.cs        | 117 ++++++
 .../IReportLogicPharmacist.cs                 |   2 +-
 .../SearchModels/MedicineSearchModel.cs       |   1 +
 .../ViewModels/ListRecipeViewModel.cs         |   4 +-
 .../Implementss/MedicineStorage.cs            |  47 ++-
 .../Models/Medicine.cs                        |   2 +-
 19 files changed, 777 insertions(+), 48 deletions(-)
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToExcelPharmacist.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToWordPharmacist.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelInfoPharmacist.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordInfoPharmacist.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToExcelPharmacist.cs
 create mode 100644 Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToWordPharmacist.cs

diff --git a/Hospital/HospitalBusinessLogic/BusinessLogics/ReportLogicPharmacist.cs b/Hospital/HospitalBusinessLogic/BusinessLogics/ReportLogicPharmacist.cs
index 4e0ac27..4389b1b 100644
--- a/Hospital/HospitalBusinessLogic/BusinessLogics/ReportLogicPharmacist.cs
+++ b/Hospital/HospitalBusinessLogic/BusinessLogics/ReportLogicPharmacist.cs
@@ -3,24 +3,24 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using VetClinicBusinessLogic.OfficePackage;
-using VetClinicBusinessLogic.OfficePackage.HelperModels;
-using VetClinicContracts.BindingModels;
-using VetClinicContracts.BusinessLogicsContracts;
-using VetClinicContracts.SearchModels;
-using VetClinicContracts.StoragesContracts;
-using VetClinicContracts.ViewModels;
+using HospitalBusinessLogic.OfficePackage;
+using HospitalBusinessLogic.OfficePackage.HelperModels;
+using HospitalContracts.BindingModels;
+using HospitalContracts.BusinessLogicsContracts;
+using HospitalContracts.SearchModels;
+using HospitalContracts.StoragesContracts;
+using HospitalContracts.ViewModels;
 
-namespace VetClinicBusinessLogic.BusinessLogics
+namespace HospitalBusinessLogic.BusinessLogics
 {
     public class ReportLogicPharmacist : IReportLogicPharmacist
     {
-        private readonly IServiceStorage _serviceStorage;
+        private readonly IProcedureStorage _serviceStorage;
         private readonly IMedicineStorage _medicineStorage;
-        private readonly IAnimalStorage _animalStorage;
+        private readonly IRecipeStorage _animalStorage;
         private readonly AbstractSaveToExcelPharmacist _saveToExcel;
         private readonly AbstractSaveToWordPharmacist _saveToWord;
-        public ReportLogicPharmacist(IServiceStorage serviceStorage, IMedicineStorage medicineStorage, IAnimalStorage animalStorage,
+        public ReportLogicPharmacist(IProcedureStorage serviceStorage, IMedicineStorage medicineStorage, IRecipeStorage animalStorage,
             AbstractSaveToExcelPharmacist saveToExcel, AbstractSaveToWordPharmacist saveToWord)
         {
             _serviceStorage = serviceStorage;
@@ -30,16 +30,16 @@ namespace VetClinicBusinessLogic.BusinessLogics
             _saveToWord = saveToWord;
         }
 
-        public List<ListAnimalsViewModel> GetServiceAnimals(List<int> services)
+        public List<ListRecipesViewModel> GetServiceAnimals(List<int> services)
         {
-            List<ListAnimalsViewModel> ans = new();
+            List<ListRecipesViewModel> ans = new();
             foreach (var service in services)
             {
-                var medicines = _medicineStorage.GetFilteredList(new MedicineSearchModel { ServiceId = service });
+                var medicines = _medicineStorage.GetFilteredList(new MedicineSearchModel { ProcedureId = service });
                 Dictionary<int, int> counter = new();
                 foreach (var medicine in medicines)
                 {
-                    var animals = _animalStorage.GetFilteredList(new AnimalSearchModel { MedicineId = medicine.Id });
+                    var animals = _animalStorage.GetFilteredList(new RecipeSearchModel { MedicineId = medicine.Id });
                     foreach (var animal in animals)
                     {
                         if (!counter.ContainsKey(animal.Id))
@@ -50,39 +50,39 @@ namespace VetClinicBusinessLogic.BusinessLogics
                         }
                     }
                 }
-                List<AnimalViewModel> res = new();
+                List<RecipeViewModel> res = new();
                 foreach (var cnt in counter)
                 {
                     if (cnt.Value != medicines.Count)
                         continue;
-                    res.Add(_animalStorage.GetElement(new AnimalSearchModel { Id = cnt.Key }));
+                    res.Add(_animalStorage.GetElement(new RecipeSearchModel { Id = cnt.Key }));
                 }
-                ans.Add(new ListAnimalsViewModel
+                ans.Add(new ListRecipesViewModel
                 {
-                    ServiceName = _serviceStorage.GetElement(new ServiceSearchModel { Id = service }).ServiceName,
-                    Animals = res
+                    ProcedureName = _serviceStorage.GetElement(new ProcedureSearchModel { Id = service }).Name,
+                    Recipes = res
                 });
             }
             return ans;
         }
 
-        public void SaveAnimalsToExcelFile(ListAnimalsBindingModel model)
+        public void SaveAnimalsToExcelFile(ListRecipesBindingModel model)
         {
             _saveToExcel.CreateReport(new ExcelInfoPharmacist
             {
                 FileName = model.FileName,
-                Title = "Список животных для услуг",
-                ServicesAnimals = GetServiceAnimals(model.Services)
+                Title = "Список рецептов для процедур",
+                ProceduresRecipes = GetServiceAnimals(model.Procedures)
             });
         }
 
-        public void SaveAnimalsToWordFile(ListAnimalsBindingModel model)
+        public void SaveAnimalsToWordFile(ListRecipesBindingModel model)
         {
             _saveToWord.CreateDoc(new WordInfoPharmacist
             {
                 FileName = model.FileName,
-                Title = "Список животных для услуг",
-                ServicesAnimals = GetServiceAnimals(model.Services)
+                Title = "Список рецептов для процедур",
+                ProceduresRecipes = GetServiceAnimals(model.Procedures)
             });
         }
     }
diff --git a/Hospital/HospitalBusinessLogic/HospitalBusinessLogic.csproj b/Hospital/HospitalBusinessLogic/HospitalBusinessLogic.csproj
index 3e4facb..11fde8d 100644
--- a/Hospital/HospitalBusinessLogic/HospitalBusinessLogic.csproj
+++ b/Hospital/HospitalBusinessLogic/HospitalBusinessLogic.csproj
@@ -7,6 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
+    <PackageReference Include="DocumentFormat.OpenXml" Version="3.0.2" />
     <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
   </ItemGroup>
 
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToExcelPharmacist.cs b/Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToExcelPharmacist.cs
new file mode 100644
index 0000000..5c6eb75
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToExcelPharmacist.cs
@@ -0,0 +1,72 @@
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+using HospitalBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HospitalBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToExcelPharmacist
+    {
+        public void CreateReport(ExcelInfoPharmacist 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 rec in info.ProceduresRecipes)
+            {
+                InsertCellInWorksheet(new ExcelCellParameters
+                {
+                    ColumnName = "A",
+                    RowIndex = rowIndex,
+                    Text = rec.ProcedureName,
+                    StyleInfo = ExcelStyleInfoType.Text
+                });
+
+                rowIndex++;
+
+                foreach (var animal in rec.Recipes)
+                {
+                    InsertCellInWorksheet(new ExcelCellParameters
+                    {
+                        ColumnName = "B",
+                        RowIndex = rowIndex,
+                        Text = animal.Description,
+                        StyleInfo = ExcelStyleInfoType.TextWithBroder
+                    });
+
+                    rowIndex++;
+                }
+
+                rowIndex++;
+            }
+
+            SaveExcel(info);
+        }
+
+        protected abstract void CreateExcel(ExcelInfoPharmacist info);
+
+        protected abstract void InsertCellInWorksheet(ExcelCellParameters excelParams);
+
+        protected abstract void MergeCells(ExcelMergeParameters excelParams);
+
+        protected abstract void SaveExcel(ExcelInfoPharmacist info);
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToWordPharmacist.cs b/Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToWordPharmacist.cs
new file mode 100644
index 0000000..a5997c5
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/AbstractSaveToWordPharmacist.cs
@@ -0,0 +1,61 @@
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+using HospitalBusinessLogic.OfficePackage.HelperModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HospitalBusinessLogic.OfficePackage
+{
+    public abstract class AbstractSaveToWordPharmacist
+    {
+        public void CreateDoc(WordInfoPharmacist 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 rec in info.ProceduresRecipes)
+            {
+                CreateParagraph(new WordParagraph
+                {
+                    Texts = new List<(string, WordTextProperties)>
+                    { (rec.ProcedureName, new WordTextProperties { Size = "24", Bold=true})},
+                    TextProperties = new WordTextProperties
+                    {
+                        Size = "24",
+                        JustificationType = WordJustificationType.Both
+                    }
+                });
+
+                foreach (var animal in rec.Recipes)
+                {
+                    CreateParagraph(new WordParagraph
+                    {
+                        Texts = new List<(string, WordTextProperties)>
+                        { (animal.Description, new WordTextProperties { Size = "20", Bold=false})},
+                        TextProperties = new WordTextProperties
+                        {
+                            Size = "24",
+                            JustificationType = WordJustificationType.Both
+                        }
+                    });
+                }
+            }
+            SaveWord(info);
+        }
+
+        protected abstract void CreateWord(WordInfoPharmacist info);
+        protected abstract void CreateParagraph(WordParagraph paragraph);
+        protected abstract void SaveWord(WordInfoPharmacist info);
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
new file mode 100644
index 0000000..9ce4c7a
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum ExcelStyleInfoType
+    {
+        Title,
+        Text,
+        TextWithBroder
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
new file mode 100644
index 0000000..0558e3f
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperEnums
+{
+    public enum WordJustificationType
+    {
+        Center,
+        Both
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
new file mode 100644
index 0000000..ba9578d
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs
@@ -0,0 +1,19 @@
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelCellParameters
+    {
+        public string ColumnName { get; set; } = string.Empty;
+        public uint RowIndex { get; set; }
+        public string Text { get; set; } = string.Empty;
+        public string CellReference => $"{ColumnName}{RowIndex}";
+        public ExcelStyleInfoType StyleInfo { get; set; }
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelInfoPharmacist.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelInfoPharmacist.cs
new file mode 100644
index 0000000..3326290
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelInfoPharmacist.cs
@@ -0,0 +1,21 @@
+using HospitalContracts.ViewModels;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HospitalContracts.ViewModels;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelInfoPharmacist
+    {
+        public string FileName { get; set; } = string.Empty;
+        public string Title { get; set; } = string.Empty;
+        public List<ListRecipesViewModel> ProceduresRecipes
+        {
+            get;
+            set;
+        } = new();
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
new file mode 100644
index 0000000..9b6b6b0
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperModels
+{
+    public class ExcelMergeParameters
+    {
+        public string CellFromName { get; set; } = string.Empty;
+        public string CellToName { get; set; } = string.Empty;
+        public string Merge => $"{CellFromName}:{CellToName}";
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordInfoPharmacist.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordInfoPharmacist.cs
new file mode 100644
index 0000000..33747e3
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordInfoPharmacist.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HospitalContracts.ViewModels;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordInfoPharmacist
+    {
+        public string FileName { get; set; } = string.Empty;
+        public string Title { get; set; } = string.Empty;
+        public List<ListRecipesViewModel> ProceduresRecipes { get; set; } = new();
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
new file mode 100644
index 0000000..d8a1a46
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordParagraph
+    {
+        public List<(string, WordTextProperties)> Texts { get; set; } = new();
+        public WordTextProperties? TextProperties { get; set; }
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
new file mode 100644
index 0000000..fe3f868
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs
@@ -0,0 +1,17 @@
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+
+namespace HospitalBusinessLogic.OfficePackage.HelperModels
+{
+    public class WordTextProperties
+    {
+        public string Size { get; set; } = string.Empty;
+        public bool Bold { get; set; }
+        public WordJustificationType JustificationType { get; set; }
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToExcelPharmacist.cs b/Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToExcelPharmacist.cs
new file mode 100644
index 0000000..0e8cb79
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToExcelPharmacist.cs
@@ -0,0 +1,335 @@
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Office2010.Excel;
+using DocumentFormat.OpenXml.Office2013.Excel;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Spreadsheet;
+using HospitalBusinessLogic.OfficePackage;
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+using HospitalBusinessLogic.OfficePackage.HelperModels;
+using Microsoft.Extensions.Primitives;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace VetClinicBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToExcelPharmacist : AbstractSaveToExcelPharmacist
+    {
+        private SpreadsheetDocument? _spreadsheetDocument;
+        private SharedStringTablePart? _shareStringPart;
+        private Worksheet? _worksheet;
+
+        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);
+        }
+
+        private static uint GetStyleValue(ExcelStyleInfoType styleInfo)
+        {
+            return styleInfo switch
+            {
+                ExcelStyleInfoType.Title => 2U,
+                ExcelStyleInfoType.TextWithBroder => 1U,
+                ExcelStyleInfoType.Text => 0U,
+                _ => 0U,
+            };
+        }
+
+        protected override void CreateExcel(ExcelInfoPharmacist 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>();
+
+            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(ExcelInfoPharmacist info)
+        {
+            if (_spreadsheetDocument == null)
+            {
+                return;
+            }
+            _spreadsheetDocument.WorkbookPart!.Workbook.Save();
+            _spreadsheetDocument.Dispose();
+        }
+    }
+}
diff --git a/Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToWordPharmacist.cs b/Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToWordPharmacist.cs
new file mode 100644
index 0000000..4a88152
--- /dev/null
+++ b/Hospital/HospitalBusinessLogic/OfficePackage/Implements/SaveToWordPharmacist.cs
@@ -0,0 +1,117 @@
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+using DocumentFormat.OpenXml;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HospitalBusinessLogic.OfficePackage.HelperEnums;
+using HospitalBusinessLogic.OfficePackage.HelperModels;
+
+namespace VetClinicBusinessLogic.OfficePackage.Implements
+{
+    public class SaveToWordPharmacist : AbstractSaveToWordPharmacist
+    {
+        private WordprocessingDocument? _wordDocument;
+        private Body? _docBody;
+        private static JustificationValues
+       GetJustificationValues(WordJustificationType type)
+        {
+            return type switch
+            {
+                WordJustificationType.Both => JustificationValues.Both,
+                WordJustificationType.Center => JustificationValues.Center,
+                _ => JustificationValues.Left,
+            };
+        }
+        private static SectionProperties CreateSectionProperties()
+        {
+            var properties = new SectionProperties();
+            var pageSize = new PageSize
+            {
+                Orient = PageOrientationValues.Portrait
+            };
+            properties.AppendChild(pageSize);
+            return properties;
+        }
+
+        private static ParagraphProperties?
+       CreateParagraphProperties(WordTextProperties? paragraphProperties)
+        {
+            if (paragraphProperties == null)
+            {
+                return null;
+            }
+            var properties = new ParagraphProperties();
+            properties.AppendChild(new Justification()
+            {
+                Val =
+           GetJustificationValues(paragraphProperties.JustificationType)
+            });
+            properties.AppendChild(new SpacingBetweenLines
+            {
+                LineRule = LineSpacingRuleValues.Auto
+            });
+            properties.AppendChild(new Indentation());
+            var paragraphMarkRunProperties = new ParagraphMarkRunProperties();
+            if (!string.IsNullOrEmpty(paragraphProperties.Size))
+            {
+                paragraphMarkRunProperties.AppendChild(new FontSize
+                {
+                    Val =
+               paragraphProperties.Size
+                });
+            }
+            properties.AppendChild(paragraphMarkRunProperties);
+            return properties;
+        }
+        protected override void CreateWord(WordInfoPharmacist 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(WordInfoPharmacist info)
+        {
+            if (_docBody == null || _wordDocument == null)
+            {
+                return;
+            }
+            _docBody.AppendChild(CreateSectionProperties());
+            _wordDocument.MainDocumentPart!.Document.Save();
+            _wordDocument.Dispose();
+        }
+    }
+}
diff --git a/Hospital/HospitalContracts/BusinessLogicContracts/IReportLogicPharmacist.cs b/Hospital/HospitalContracts/BusinessLogicContracts/IReportLogicPharmacist.cs
index 8158896..5880ecf 100644
--- a/Hospital/HospitalContracts/BusinessLogicContracts/IReportLogicPharmacist.cs
+++ b/Hospital/HospitalContracts/BusinessLogicContracts/IReportLogicPharmacist.cs
@@ -11,7 +11,7 @@ namespace HospitalContracts.BusinessLogicsContracts
 {
     public interface IReportLogicPharmacist //В процессе
     {
-        List<ListAnimalsViewModel> GetServiceAnimals(List<int> services);
+        List<ListRecipesViewModel> GetServiceAnimals(List<int> services);
         void SaveAnimalsToWordFile(ListRecipesBindingModel model);
         void SaveAnimalsToExcelFile(ListRecipesBindingModel model);
     }
diff --git a/Hospital/HospitalContracts/SearchModels/MedicineSearchModel.cs b/Hospital/HospitalContracts/SearchModels/MedicineSearchModel.cs
index f32f3bd..64b88a1 100644
--- a/Hospital/HospitalContracts/SearchModels/MedicineSearchModel.cs
+++ b/Hospital/HospitalContracts/SearchModels/MedicineSearchModel.cs
@@ -13,5 +13,6 @@ namespace HospitalContracts.SearchModels
         public string? CountryOrigin { get; set; }
         public double? Price { get; set; }
         public int? PharmacistId { get; set; }
+        public int? ProcedureId { get; set; }
     }
 }
diff --git a/Hospital/HospitalContracts/ViewModels/ListRecipeViewModel.cs b/Hospital/HospitalContracts/ViewModels/ListRecipeViewModel.cs
index dd33a56..935f6f9 100644
--- a/Hospital/HospitalContracts/ViewModels/ListRecipeViewModel.cs
+++ b/Hospital/HospitalContracts/ViewModels/ListRecipeViewModel.cs
@@ -6,9 +6,9 @@ using System.Threading.Tasks;
 
 namespace HospitalContracts.ViewModels
 {
-    public class ListAnimalsViewModel
+    public class ListRecipesViewModel
     {
         public string ProcedureName { get; set; } = string.Empty;
-        public List<RecipeViewModel> Animals { get; set; } = new();
+        public List<RecipeViewModel> Recipes { get; set; } = new();
     }
 }
diff --git a/Hospital/HospitalDataBaseImplement/Implementss/MedicineStorage.cs b/Hospital/HospitalDataBaseImplement/Implementss/MedicineStorage.cs
index e5c062b..f6b3764 100644
--- a/Hospital/HospitalDataBaseImplement/Implementss/MedicineStorage.cs
+++ b/Hospital/HospitalDataBaseImplement/Implementss/MedicineStorage.cs
@@ -19,23 +19,22 @@ namespace HospitalDatabaseImplement.Implements
         public List<MedicineViewModel> GetFullList()
         {
             using var context = new HospitalDatabase();
-            return context.Medicines
-                .Select(x => x.GetViewModel).ToList();
+            return context.Medicines.Include(x => x.Pharmacist).Include(x => x.Recipes)
+            .ThenInclude(x => x.Recipe)
+            .Select(x => x.GetViewModel)
+            .ToList();
         }
 
         public List<MedicineViewModel> GetFilteredList(MedicineSearchModel model)
         {
             using var context = new HospitalDatabase();
-            if (string.IsNullOrEmpty(model.Name) && !model.Id.HasValue)
-            {
-                return context.Medicines
-                    .Where(x => x.Name.Contains(model.Name)).ToList()
-                    .Select(x => x.GetViewModel).ToList();
-            }
-            else
-            {
-                return new();
-            }
+            return context.Medicines.Include(x => x.Pharmacist).Include(x => x.Recipes)
+            .ThenInclude(x => x.Recipe).Include(x => x.Procedures).ThenInclude(x => x.Procedure)
+            .Where(x => (string.IsNullOrEmpty(model.Name) || x.Name.Contains(model.Name))
+            && (!model.PharmacistId.HasValue || x.PharmacistId == model.PharmacistId)
+            && (!model.ProcedureId.HasValue || x.Procedures.Select(x => x.ProcedureId).ToList().Contains(model.ProcedureId.Value)))
+            .Select(x => x.GetViewModel)
+            .ToList();
         }
 
         public MedicineViewModel? GetElement(MedicineSearchModel model)
@@ -45,8 +44,14 @@ namespace HospitalDatabaseImplement.Implements
                 return null;
             }
             using var context = new HospitalDatabase();
-            return context.Medicines
-                .FirstOrDefault(x => (!string.IsNullOrEmpty(model.Name) && x.Name == model.Name) || (model.Id.HasValue && x.Id == model.Id))?.GetViewModel;
+            return context.Medicines.Include(x => x.Pharmacist)
+             .Include(x => x.Recipes)
+             .ThenInclude(x => x.Recipe)
+             .FirstOrDefault(x => (!string.IsNullOrEmpty(model.Name) &&
+            x.Name == model.Name) ||
+            (model.Id.HasValue && x.Id ==
+            model.Id))
+            ?.GetViewModel;
         }
 
         public MedicineViewModel? Insert(MedicineBindingModel model)
@@ -68,14 +73,18 @@ namespace HospitalDatabaseImplement.Implements
             using var transaction = context.Database.BeginTransaction();
             try
             {
-                var medicine = context.Medicines
-                    .FirstOrDefault(rec => rec.Id == model.Id);
+                var medicine = context.Medicines.Include(x => x.Pharmacist)
+             .Include(x => x.Recipes)
+             .ThenInclude(x => x.Recipe).FirstOrDefault(rec =>
+                rec.Id == model.Id);
                 if (medicine == null)
                 {
                     return null;
                 }
                 medicine.Update(model);
                 context.SaveChanges();
+                if (model.MedicineRecipes != null)
+                    medicine.UpdateRecipes(context, model);
                 transaction.Commit();
                 return medicine.GetViewModel;
             }
@@ -84,13 +93,15 @@ namespace HospitalDatabaseImplement.Implements
                 transaction.Rollback();
                 throw;
             }
+
         }
 
         public MedicineViewModel? Delete(MedicineBindingModel model)
         {
             using var context = new HospitalDatabase();
-            var element = context.Medicines
-                .FirstOrDefault(rec => rec.Id == model.Id);
+            var element = context.Medicines.Include(x => x.Pharmacist)
+            .Include(x => x.Recipes).ThenInclude(x => x.Recipe)
+            .FirstOrDefault(rec => rec.Id == model.Id);
             if (element != null)
             {
                 context.Medicines.Remove(element);
diff --git a/Hospital/HospitalDatabaseImplement/Models/Medicine.cs b/Hospital/HospitalDatabaseImplement/Models/Medicine.cs
index 0925c91..c15384f 100644
--- a/Hospital/HospitalDatabaseImplement/Models/Medicine.cs
+++ b/Hospital/HospitalDatabaseImplement/Models/Medicine.cs
@@ -51,7 +51,7 @@ namespace HospitalDatabaseImplement.Models
 		[ForeignKey("MedicineId")]
 		public virtual List<RecipeMedicine> Recipes { get; set; } = new();
 		[ForeignKey("MedicineId")]
-		public virtual List<ProcedureMedicine> Services { get; set; } = new();
+		public virtual List<ProcedureMedicine> Procedures { get; set; } = new();
 		public static Medicine Create(HospitalDatabase context,
 	   MedicineBindingModel model)
 		{