diff --git a/SushiBar/SushiBar.sln b/SushiBar/SushiBar.sln index 32bb190..2d3fe85 100644 --- a/SushiBar/SushiBar.sln +++ b/SushiBar/SushiBar.sln @@ -47,22 +47,6 @@ Global {FE2BCA7B-A6E4-4628-9DCE-2F04F258BE1F}.Debug|Any CPU.Build.0 = Debug|Any CPU {FE2BCA7B-A6E4-4628-9DCE-2F04F258BE1F}.Release|Any CPU.ActiveCfg = Release|Any CPU {FE2BCA7B-A6E4-4628-9DCE-2F04F258BE1F}.Release|Any CPU.Build.0 = Release|Any CPU - {4F721F76-EF7A-4FF3-80B0-77A459D091D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4F721F76-EF7A-4FF3-80B0-77A459D091D7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4F721F76-EF7A-4FF3-80B0-77A459D091D7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4F721F76-EF7A-4FF3-80B0-77A459D091D7}.Release|Any CPU.Build.0 = Release|Any CPU - {C9C66AFC-1246-4A0C-AB70-8D5C0CF311D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9C66AFC-1246-4A0C-AB70-8D5C0CF311D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9C66AFC-1246-4A0C-AB70-8D5C0CF311D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9C66AFC-1246-4A0C-AB70-8D5C0CF311D9}.Release|Any CPU.Build.0 = Release|Any CPU - {0895AC4A-6C0A-4244-92AB-CD3AFD8B691A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0895AC4A-6C0A-4244-92AB-CD3AFD8B691A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0895AC4A-6C0A-4244-92AB-CD3AFD8B691A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0895AC4A-6C0A-4244-92AB-CD3AFD8B691A}.Release|Any CPU.Build.0 = Release|Any CPU - {C9EF2604-E657-4223-A7C3-945E7A4E2341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C9EF2604-E657-4223-A7C3-945E7A4E2341}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C9EF2604-E657-4223-A7C3-945E7A4E2341}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C9EF2604-E657-4223-A7C3-945E7A4E2341}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/SushiBar/SushiBar/Forms/FormMain.Designer.cs b/SushiBar/SushiBar/Forms/FormMain.Designer.cs index 9501c98..9b9c4f8 100644 --- a/SushiBar/SushiBar/Forms/FormMain.Designer.cs +++ b/SushiBar/SushiBar/Forms/FormMain.Designer.cs @@ -33,11 +33,14 @@ ToolStripMenuItem = new ToolStripMenuItem(); sushiToolStripMenuItem = new ToolStripMenuItem(); componentsToolStripMenuItem = new ToolStripMenuItem(); - clientsToolStripMenuItem = new ToolStripMenuItem(); отчётыToolStripMenuItem = new ToolStripMenuItem(); sushisToolStripMenuItem = new ToolStripMenuItem(); componentSushisToolStripMenuItem = new ToolStripMenuItem(); ordersToolStripMenuItem = new ToolStripMenuItem(); + buttonCreateOrder = new Button(); + buttonTakeOrderInWork = new Button(); + buttonOrderReady = new Button(); + buttonIssuedOrder = new Button(); buttonRef = new Button(); buttonIssuedOrder = new Button(); buttonOrderReady = new Button(); @@ -91,7 +94,35 @@ componentsToolStripMenuItem.Text = "Компоненты"; componentsToolStripMenuItem.Click += componentsToolStripMenuItem_Click; // - // clientsToolStripMenuItem + // отчётыToolStripMenuItem + // + отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { sushisToolStripMenuItem, componentSushisToolStripMenuItem, ordersToolStripMenuItem }); + отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; + отчётыToolStripMenuItem.Size = new Size(73, 24); + отчётыToolStripMenuItem.Text = "Отчёты"; + // + // sushisToolStripMenuItem + // + sushisToolStripMenuItem.Name = "sushisToolStripMenuItem"; + sushisToolStripMenuItem.Size = new Size(276, 26); + sushisToolStripMenuItem.Text = "Список суши"; + sushisToolStripMenuItem.Click += sushisToolStripMenuItem_Click; + // + // componentSushisToolStripMenuItem + // + componentSushisToolStripMenuItem.Name = "componentSushisToolStripMenuItem"; + componentSushisToolStripMenuItem.Size = new Size(276, 26); + componentSushisToolStripMenuItem.Text = "Компоненты по изделиям"; + componentSushisToolStripMenuItem.Click += componentSushisToolStripMenuItem_Click; + // + // ordersToolStripMenuItem + // + ordersToolStripMenuItem.Name = "ordersToolStripMenuItem"; + ordersToolStripMenuItem.Size = new Size(276, 26); + ordersToolStripMenuItem.Text = "Список заказов"; + ordersToolStripMenuItem.Click += ordersToolStripMenuItem_Click; + // + // buttonCreateOrder // clientsToolStripMenuItem.Name = "clientsToolStripMenuItem"; clientsToolStripMenuItem.Size = new Size(182, 26); @@ -210,11 +241,5 @@ private ToolStripMenuItem sushisToolStripMenuItem; private ToolStripMenuItem componentSushisToolStripMenuItem; private ToolStripMenuItem ordersToolStripMenuItem; - private ToolStripMenuItem clientsToolStripMenuItem; - private Button buttonRef; - private Button buttonIssuedOrder; - private Button buttonOrderReady; - private Button buttonTakeOrderInWork; - private Button buttonCreateOrder; } } \ No newline at end of file diff --git a/SushiBar/SushiBarBusinessLogic/BusinessLogics/ReportLogic.cs b/SushiBar/SushiBarBusinessLogic/BusinessLogics/ReportLogic.cs index 740053c..50b641b 100644 --- a/SushiBar/SushiBarBusinessLogic/BusinessLogics/ReportLogic.cs +++ b/SushiBar/SushiBarBusinessLogic/BusinessLogics/ReportLogic.cs @@ -34,12 +34,21 @@ namespace SushiBarBusinessLogic.BusinessLogics { var sushis = _sushiStorage.GetFullList(); var list = new List(); + foreach (var sushi in sushis) { var record = new ReportSushiComponentViewModel { + SushiName = sushi.SushiName, + Components = new List>(), TotalCount = 0 }; + foreach (var component in sushi.SushiComponents) { + record.Components.Add(new Tuple( + component.Value.Item1.ComponentName, + component.Value.Item2 + )); + record.TotalCount += component.Value.Item2; } list.Add(record); } @@ -54,6 +63,7 @@ namespace SushiBarBusinessLogic.BusinessLogics { return _orderStorage.GetFilteredList(new OrderSearchModel { + DateFrom = model.DateFrom, DateTo = model.DateTo }) .Select(x => new ReportOrdersViewModel @@ -70,10 +80,13 @@ namespace SushiBarBusinessLogic.BusinessLogics /// Сохранение компонент в файл-Word /// /// + public void SaveSushisToWordFile(ReportBindingModel model) { _saveToWord.CreateDoc(new WordInfo { FileName = model.FileName, + Title = "Список суши", + Sushis = _sushiStorage.GetFullList() }); } /// @@ -85,6 +98,7 @@ namespace SushiBarBusinessLogic.BusinessLogics _saveToExcel.CreateReport(new ExcelInfo { FileName = model.FileName, + Title = "Список суши", SushiComponents = GetSushiComponent() }); } diff --git a/SushiBar/SushiBarBusinessLogic/OfficePackage/Implements/SaveToPdf.cs b/SushiBar/SushiBarBusinessLogic/OfficePackage/Implements/SaveToPdf.cs index 7390ab6..a56a2ab 100644 --- a/SushiBar/SushiBarBusinessLogic/OfficePackage/Implements/SaveToPdf.cs +++ b/SushiBar/SushiBarBusinessLogic/OfficePackage/Implements/SaveToPdf.cs @@ -82,6 +82,7 @@ namespace SushiBarBusinessLogic.OfficePackage.Implements 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; } } diff --git a/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs b/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs index f83dc48..89c1e8d 100644 --- a/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs +++ b/SushiBar/SushiBarDatabaseImplement/Implements/ClientStorage.cs @@ -20,16 +20,20 @@ namespace SushiBarDatabaseImplement.Implements { using var context = new SushiBarDatabase(); return context.Clients - .Where(c => + .Where(c => (!model.Id.HasValue || c.Id == model.Id) && (string.IsNullOrEmpty(model.ClientFIO) || c.ClientFIO.Contains(model.ClientFIO)) && (string.IsNullOrEmpty(model.Email) || c.Email.Contains(model.Email)) && (string.IsNullOrEmpty(model.Password) || c.Password.Contains(model.Password))) .Select(c => c.GetViewModel) - .ToList(); + .ToList(); } public ClientViewModel? GetElement(ClientSearchModel model) { + if (!model.Id.HasValue) + { + return null; + } using var context = new SushiBarDatabase(); return context.Clients .FirstOrDefault(c => diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20240424132544_InitialCreate.Designer.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20240424132544_InitialCreate.Designer.cs new file mode 100644 index 0000000..1aa7242 --- /dev/null +++ b/SushiBar/SushiBarDatabaseImplement/Migrations/20240424132544_InitialCreate.Designer.cs @@ -0,0 +1,171 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using SushiBarDatabaseImplement; + +#nullable disable + +namespace SushiBarDatabaseImplement.Migrations +{ + [DbContext(typeof(SushiBarDatabase))] + [Migration("20240424132544_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.16") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Cost") + .HasColumnType("double precision"); + + b.HasKey("Id"); + + b.ToTable("Components"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("DateCreate") + .HasColumnType("timestamp without time zone"); + + b.Property("DateImplement") + .HasColumnType("timestamp without time zone"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("Sum") + .HasColumnType("double precision"); + + b.Property("SushiId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("SushiId"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Price") + .HasColumnType("double precision"); + + b.Property("SushiName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Sushis"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ComponentId") + .HasColumnType("integer"); + + b.Property("Count") + .HasColumnType("integer"); + + b.Property("SushiId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("ComponentId"); + + b.HasIndex("SushiId"); + + b.ToTable("SushiComponents"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Order", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi") + .WithMany("Orders") + .HasForeignKey("SushiId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Sushi"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.SushiComponent", b => + { + b.HasOne("SushiBarDatabaseImplement.Models.Component", "Component") + .WithMany("SushiComponents") + .HasForeignKey("ComponentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("SushiBarDatabaseImplement.Models.Sushi", "Sushi") + .WithMany("Components") + .HasForeignKey("SushiId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Component"); + + b.Navigation("Sushi"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Component", b => + { + b.Navigation("SushiComponents"); + }); + + modelBuilder.Entity("SushiBarDatabaseImplement.Models.Sushi", b => + { + b.Navigation("Components"); + + b.Navigation("Orders"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/SushiBar/SushiBarDatabaseImplement/Migrations/20240424132544_InitialCreate.cs b/SushiBar/SushiBarDatabaseImplement/Migrations/20240424132544_InitialCreate.cs new file mode 100644 index 0000000..545b5b1 --- /dev/null +++ b/SushiBar/SushiBarDatabaseImplement/Migrations/20240424132544_InitialCreate.cs @@ -0,0 +1,126 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace SushiBarDatabaseImplement.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Components", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ComponentName = table.Column(type: "text", nullable: false), + Cost = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Components", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Sushis", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + SushiName = table.Column(type: "text", nullable: false), + Price = table.Column(type: "double precision", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Sushis", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Orders", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Count = table.Column(type: "integer", nullable: false), + Sum = table.Column(type: "double precision", nullable: false), + Status = table.Column(type: "integer", nullable: false), + DateCreate = table.Column(type: "timestamp without time zone", nullable: false), + DateImplement = table.Column(type: "timestamp without time zone", nullable: true), + SushiId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Orders", x => x.Id); + table.ForeignKey( + name: "FK_Orders_Sushis_SushiId", + column: x => x.SushiId, + principalTable: "Sushis", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SushiComponents", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + SushiId = table.Column(type: "integer", nullable: false), + ComponentId = table.Column(type: "integer", nullable: false), + Count = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SushiComponents", x => x.Id); + table.ForeignKey( + name: "FK_SushiComponents_Components_ComponentId", + column: x => x.ComponentId, + principalTable: "Components", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SushiComponents_Sushis_SushiId", + column: x => x.SushiId, + principalTable: "Sushis", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Orders_SushiId", + table: "Orders", + column: "SushiId"); + + migrationBuilder.CreateIndex( + name: "IX_SushiComponents_ComponentId", + table: "SushiComponents", + column: "ComponentId"); + + migrationBuilder.CreateIndex( + name: "IX_SushiComponents_SushiId", + table: "SushiComponents", + column: "SushiId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Orders"); + + migrationBuilder.DropTable( + name: "SushiComponents"); + + migrationBuilder.DropTable( + name: "Components"); + + migrationBuilder.DropTable( + name: "Sushis"); + } + } +} diff --git a/SushiBar/SushiBarFileImplement/Models/Order.cs b/SushiBar/SushiBarFileImplement/Models/Order.cs index 7bdda2a..44de8ef 100644 --- a/SushiBar/SushiBarFileImplement/Models/Order.cs +++ b/SushiBar/SushiBarFileImplement/Models/Order.cs @@ -2,6 +2,11 @@ using SushiBarContracts.ViewModels; using SushiBarDataModels.Enums; using SushiBarDataModels.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; using System.Xml.Linq; namespace SushiBarFileImplement.Models @@ -78,6 +83,6 @@ namespace SushiBarFileImplement.Models new XElement("Status", Status.ToString()), new XElement("DateCreate", DateCreate.ToString()), new XElement("DateImplement", DateImplement.ToString()) - ); + ); } }