From 700e2efbde11a065c5edd3e62d6a434ee9752106 Mon Sep 17 00:00:00 2001 From: danilafilippov7299 Date: Fri, 17 May 2024 20:16:17 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bar/1.docx | Bin 0 -> 1305 bytes Bar/1.pdf | Bin 0 -> 38442 bytes Bar/1.xlsx | Bin 0 -> 3086 bytes Bar/Bar/BarView.csproj | 9 +- ...ssLogicContracts.ICocktailLogic.datasource | 10 + Bar/Bar/FormMain.Designer.cs | 42 +- Bar/Bar/FormMain.cs | 34 +- .../FormReportCocktailComponents.Designer.cs | 107 ++++ Bar/Bar/Forms/FormReportCocktailComponents.cs | 75 +++ .../Forms/FormReportCocktailComponents.resx | 69 +++ Bar/Bar/Forms/FormReportOrders.Designer.cs | 131 ++++ Bar/Bar/Forms/FormReportOrders.cs | 100 +++ Bar/Bar/Forms/FormReportOrders.resx | 60 ++ Bar/Bar/Program.cs | 10 + ...sLogicContracts.IComponentLogic.datasource | 10 + ...inessLogicContracts.IOrderLogic.datasource | 10 + ...ragesContracts.ICocktailStorage.datasource | 10 + ...agesContracts.IComponentStorage.datasource | 10 + ...StoragesContracts.IOrderStorage.datasource | 10 + Bar/Bar/ReportOrder.rdlc | 572 ++++++++++++++++++ .../BarBusinessLogic/BarBusinessLogic.csproj | 18 +- .../BusinessLogics/ReportLogic.cs | 90 +++ .../OfficePackage/AbstractSaveToExcel.cs | 90 +++ .../OfficePackage/AbstractSaveToPdf.cs | 47 ++ .../OfficePackage/AbstractSaveToWord.cs | 48 ++ .../HelperEnums/ExcelStyleInfoType.cs | 9 + .../HelperEnums/PdfParagraphAlignmentType.cs | 9 + .../HelperEnums/WordJustificationType.cs | 8 + .../HelperModels/ExcelCellParameters.cs | 17 + .../OfficePackage/HelperModels/ExcelInfo.cs | 13 + .../HelperModels/ExcelMergeParameters.cs | 11 + .../OfficePackage/HelperModels/PdfInfo.cs | 17 + .../HelperModels/PdfParagraph.cs | 13 + .../HelperModels/PdfRowParameters.cs | 13 + .../OfficePackage/HelperModels/WordInfo.cs | 13 + .../HelperModels/WordParagraph.cs | 9 + .../HelperModels/WordTextProperties.cs | 13 + .../OfficePackage/Implements/SaveToExcel.cs | 281 +++++++++ .../OfficePackage/Implements/SaveToPdf.cs | 108 ++++ .../OfficePackage/Implements/SaveToWord.cs | 118 ++++ .../BindingModels/ReportBindingModel.cs | 11 + .../BusinessLogicContracts/IReportLogic.cs | 18 + .../SearchModels/OrderSearchModel.cs | 4 + .../ViewModels/ReportOrdersViewModel.cs | 15 + .../ReportRepairComponentViewModel.cs | 11 + .../Implements/OrderStorage.cs | 11 +- .../Implements/OrderStorage.cs | 7 +- .../Implements/OrderStorage.cs | 4 +- 48 files changed, 2286 insertions(+), 9 deletions(-) create mode 100644 Bar/1.docx create mode 100644 Bar/1.pdf create mode 100644 Bar/1.xlsx create mode 100644 Bar/Bar/DataSources/BarContracts.BusinessLogicContracts.ICocktailLogic.datasource create mode 100644 Bar/Bar/Forms/FormReportCocktailComponents.Designer.cs create mode 100644 Bar/Bar/Forms/FormReportCocktailComponents.cs create mode 100644 Bar/Bar/Forms/FormReportCocktailComponents.resx create mode 100644 Bar/Bar/Forms/FormReportOrders.Designer.cs create mode 100644 Bar/Bar/Forms/FormReportOrders.cs create mode 100644 Bar/Bar/Forms/FormReportOrders.resx create mode 100644 Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IComponentLogic.datasource create mode 100644 Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IOrderLogic.datasource create mode 100644 Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.ICocktailStorage.datasource create mode 100644 Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IComponentStorage.datasource create mode 100644 Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IOrderStorage.datasource create mode 100644 Bar/Bar/ReportOrder.rdlc create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/BusinessLogics/ReportLogic.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/AbstractSaveToExcel.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/AbstractSaveToPdf.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/AbstractSaveToWord.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperEnums/ExcelStyleInfoType.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperEnums/PdfParagraphAlignmentType.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperEnums/WordJustificationType.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/ExcelCellParameters.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/ExcelInfo.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/ExcelMergeParameters.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/PdfInfo.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/PdfParagraph.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/PdfRowParameters.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/WordInfo.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/WordParagraph.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/HelperModels/WordTextProperties.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/Implements/SaveToExcel.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/Implements/SaveToPdf.cs create mode 100644 Bar/BarBusinessLogic/BarBusinessLogic/OfficePackage/Implements/SaveToWord.cs create mode 100644 Bar/BarContracts/BarContracts/BindingModels/ReportBindingModel.cs create mode 100644 Bar/BarContracts/BarContracts/BusinessLogicContracts/IReportLogic.cs create mode 100644 Bar/BarContracts/BarContracts/ViewModels/ReportOrdersViewModel.cs create mode 100644 Bar/BarContracts/BarContracts/ViewModels/ReportRepairComponentViewModel.cs diff --git a/Bar/1.docx b/Bar/1.docx new file mode 100644 index 0000000000000000000000000000000000000000..6f15e9ab23ccb7c070fd46add3607021b102766f GIT binary patch literal 1305 zcmWIWW@Zs#VBp|j*c7%tB1vC-fh{8gg9Hl$gCGL~LwSBtihfFda%paAUWr~sZqD7w z-hPJ-1lq3OIrM4Xu1>GkMa%XwH3{$NyDg=<&9qD^fj!&rK%cY1#|aO(-t|hT^DYv) zz{`E)nDMtWHT%<-%sivFYSJ22i_{Xo$pEcQzu-?s}ljl5mo0(tiJ!$T@Z!6v$m0$Am;{SQ!zjlB2I<{E<`O_sIVwc9wb6vyO zy1Hd6n@z#f>bm(IdD}Z*e2KQJWe^^21;QgaiF_3{f+^MEpG`9-;jB|vUbx_&`oa&}^Rs=kqdftfzg zMuZtksAejJR2HNXV`6?+|g~eu23M0*GXmSCiO+-q8 zTcHmQDPUAEGKnzYE=z#%fdnuj9ibh2_CV;(0md#;Wc_cLKl5&_<F< OK)4e~djShS1_l6jW7o+5 literal 0 HcmV?d00001 diff --git a/Bar/1.pdf b/Bar/1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8a0927549190bc9aa6155700ff794cadf9f33708 GIT binary patch literal 38442 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 literal 0 HcmV?d00001 diff --git a/Bar/1.xlsx b/Bar/1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e180f89c9b614ee81a3c1ff77fa0efb57f08aeab GIT binary patch literal 3086 zcma)82{=@1A0NAjG=nHHCR`$8Nl_@}PL{0M_c3M|#tbtfyQ$EuDWL?2*c>KrCBYEgWvi}qKe!2rfC-? zoK;xP3SA-Ky`MwfEITN_M?6h0BAD*-dd4)%YKRpCvf}}P_`Z8hA_wBoq-~#HTiFvH zC<$)L|LV_^dq+C|kzFdxXr>U`-QsjqDN4=xj<4NI>{e)luYPT%opr$=q`iG*HU0Vf zwd9JJ+u(WrC}C0}b42R17Tv%J`M7(dzBs&^;v3e7F3}Vq*Iv{M^5pWWP+avlKV>WO zc#_}j4RwK2S zd^F44dO}@z_LZ1wTn)=fO87!*U%sdj;L2xT|0Lh86w7!;yQTb`TY8 zXZl6|=fcCa4Yu_K216;rfAA^15G>D2&iJiCxV|Wz<-tuca?)vUxez|FwPR_bC%T)H zMw{LtikhHJ_K1V`-rnZ@nt>somA}tc5SHt7C91RFy;CD5wnnGq%-BP5;~-)O<4*~+ z??Q0RJH}>gnDaBKx^8hu)WE!Iex^>U<#2L?hr+;;pEPflz_n>Z=qO_2s2E47&2fts zt-G^Gb1lK}4N=PglX2whLm}-s_G*LuHImm-Xl9oJh7H{7N9%`p)0pQTCQ1kw6~Xu! zFNoq&d9r-M(?p@{XOqOrnr1_ty5lD;?Xs4a_R{?x#TIkQoa4zc+%>j6IS-90F6bIK$B2g4 zjl5uY?YXaK``nlFvTjtibrD@xXpEooDbLn5_R@_@={@V2Z9JZ0ae zmK?-l;4_ zk_z7}wjak6M;s*i6ja_BYRXnlMs!>qAssWBZ9AmZU*d{Sn2V-%7%eb7%K~96Ir~x` z_%^k3bx*m|QfbHfxWIM<%;5NPI#S9|%q81Ep?j@9i$f!Id>}QCp`cl|&^Yp{DMjMI z)0QTq%w-1L}`>xX)uS;cc8{~$WxkiCO&%XwE9@XQ) zE$)8^F({`PNL5@GrK_59AlRPH;0k&KByJp6nz5qCM4K_krf8HCp-;@ID(bU|t-ZPS z?|XV2mg*S2Qt9I0y0cby`-2Y9U9Ot@Qz+7}PyaoClyAd`L0z~Lm62ihA+QY84G@xT`hf#{7S1FuAPxDOKLg>*;5Rg{!Y!GRTb zFkrhep%#HY=>G?ifWcrbq&d%vCX{ z)2iyKYD%XxkSASFqF_+CwkCX+zuJEh`n{G%XtyF(0U{lMcs~4Hx8FJaXGQbzhn6Lw0}8fbd}#ztsWFHNA!#9=EWuT=3vjrE?))Zgw$e zhcNzB#OGVu`+FWYs&cZIkUh&ndGqoKo^QNQ2aElD`ScA@#`%|!BX&y4J*x?vSRb$? zNpO!^Cn|6_zi=$wwa~Pt zD)(*7V!MmLxZTIR4UO~1Lo$X&=z - + + + + + Always + + + \ No newline at end of file diff --git a/Bar/Bar/DataSources/BarContracts.BusinessLogicContracts.ICocktailLogic.datasource b/Bar/Bar/DataSources/BarContracts.BusinessLogicContracts.ICocktailLogic.datasource new file mode 100644 index 0000000..70422a1 --- /dev/null +++ b/Bar/Bar/DataSources/BarContracts.BusinessLogicContracts.ICocktailLogic.datasource @@ -0,0 +1,10 @@ + + + + BarContracts.BusinessLogicContracts.ICocktailLogic, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Bar/Bar/FormMain.Designer.cs b/Bar/Bar/FormMain.Designer.cs index 59d2b32..a69ba79 100644 --- a/Bar/Bar/FormMain.Designer.cs +++ b/Bar/Bar/FormMain.Designer.cs @@ -38,6 +38,10 @@ this.ToolStripMenu = new System.Windows.Forms.ToolStripMenuItem(); this.ComponentsStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.CocktailStripMenuItem = 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(); @@ -106,7 +110,8 @@ // this.menuStrip1.ImageScalingSize = new System.Drawing.Size(20, 20); this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.ToolStripMenu}); + this.ToolStripMenu, + this.отчётыToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(1279, 28); @@ -136,6 +141,37 @@ this.CocktailStripMenuItem.Text = "Коктейль"; this.CocktailStripMenuItem.Click += new System.EventHandler(this.CocktailsStripMenuItem_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(276, 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(276, 26); + this.компонентыПоИзделиямToolStripMenuItem.Text = "Компоненты по коктейлям"; + this.компонентыПоИзделиямToolStripMenuItem.Click += new System.EventHandler(this.ComponentCocktailToolStripMenuItem_Click); + // + // списокЗаказовToolStripMenuItem + // + this.списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; + this.списокЗаказовToolStripMenuItem.Size = new System.Drawing.Size(276, 26); + this.списокЗаказовToolStripMenuItem.Text = "Список заказов"; + this.списокЗаказовToolStripMenuItem.Click += new System.EventHandler(this.OrdersToolStripMenuItem_Click); + // // FormMain // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); @@ -171,5 +207,9 @@ private ToolStripMenuItem ToolStripMenu; private ToolStripMenuItem ComponentsStripMenuItem; private ToolStripMenuItem CocktailStripMenuItem; + private ToolStripMenuItem отчётыToolStripMenuItem; + private ToolStripMenuItem списокКомпонентовToolStripMenuItem; + private ToolStripMenuItem компонентыПоИзделиямToolStripMenuItem; + private ToolStripMenuItem списокЗаказовToolStripMenuItem; } } \ No newline at end of file diff --git a/Bar/Bar/FormMain.cs b/Bar/Bar/FormMain.cs index 7440c36..8413d32 100644 --- a/Bar/Bar/FormMain.cs +++ b/Bar/Bar/FormMain.cs @@ -9,12 +9,14 @@ namespace BarView { private readonly ILogger _logger; private readonly IOrderLogic _orderLogic; - public FormMain(ILogger Logger, IOrderLogic OrderLogic) + private readonly IReportLogic _reportLogic; + public FormMain(ILogger Logger, IOrderLogic OrderLogic, IReportLogic ReportLogic) { InitializeComponent(); _logger = Logger; _orderLogic = OrderLogic; + _reportLogic = ReportLogic; } private void FormMain_Load(object sender, EventArgs e) @@ -164,5 +166,35 @@ namespace BarView { 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 ComponentCocktailToolStripMenuItem_Click(object sender, EventArgs e) + { + var Service = Program.ServiceProvider?.GetService(typeof(FormReportCocktailComponents)); + + if (Service is FormReportCocktailComponents 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(); + } + } } } diff --git a/Bar/Bar/Forms/FormReportCocktailComponents.Designer.cs b/Bar/Bar/Forms/FormReportCocktailComponents.Designer.cs new file mode 100644 index 0000000..7dcd6a6 --- /dev/null +++ b/Bar/Bar/Forms/FormReportCocktailComponents.Designer.cs @@ -0,0 +1,107 @@ +namespace BarView.Forms +{ + partial class FormReportCocktailComponents + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.ButtonSaveToExcel = new System.Windows.Forms.Button(); + this.DataGridView = new System.Windows.Forms.DataGridView(); + this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn(); + ((System.ComponentModel.ISupportInitialize)(this.DataGridView)).BeginInit(); + this.SuspendLayout(); + // + // ButtonSaveToExcel + // + this.ButtonSaveToExcel.Location = new System.Drawing.Point(31, 12); + this.ButtonSaveToExcel.Name = "ButtonSaveToExcel"; + this.ButtonSaveToExcel.Size = new System.Drawing.Size(162, 26); + this.ButtonSaveToExcel.TabIndex = 0; + this.ButtonSaveToExcel.Text = "Сохранить в Excel"; + this.ButtonSaveToExcel.UseVisualStyleBackColor = true; + this.ButtonSaveToExcel.Click += new System.EventHandler(this.ButtonSaveToExcel_Click); + // + // DataGridView + // + this.DataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.DataGridView.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { + this.Column1, + this.Column2, + this.Column3}); + this.DataGridView.Location = new System.Drawing.Point(12, 56); + this.DataGridView.Name = "DataGridView"; + this.DataGridView.RowHeadersWidth = 51; + this.DataGridView.RowTemplate.Height = 29; + this.DataGridView.Size = new System.Drawing.Size(581, 368); + this.DataGridView.TabIndex = 1; + // + // Column1 + // + this.Column1.HeaderText = "Коктейль"; + this.Column1.MinimumWidth = 6; + this.Column1.Name = "Column1"; + this.Column1.Width = 125; + // + // Column2 + // + this.Column2.HeaderText = "Компонент"; + this.Column2.MinimumWidth = 6; + this.Column2.Name = "Column2"; + this.Column2.Width = 125; + // + // Column3 + // + this.Column3.HeaderText = "Количество"; + this.Column3.MinimumWidth = 6; + this.Column3.Name = "Column3"; + this.Column3.Width = 125; + // + // FormReportCocktailComponents + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.DataGridView); + this.Controls.Add(this.ButtonSaveToExcel); + this.Name = "FormReportCocktailComponents"; + this.Text = "FormReportCoctailComponents"; + this.Load += new System.EventHandler(this.FormReportCoctailComponents_Load); + ((System.ComponentModel.ISupportInitialize)(this.DataGridView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Button ButtonSaveToExcel; + private DataGridView DataGridView; + private DataGridViewTextBoxColumn Column1; + private DataGridViewTextBoxColumn Column2; + private DataGridViewTextBoxColumn Column3; + } +} \ No newline at end of file diff --git a/Bar/Bar/Forms/FormReportCocktailComponents.cs b/Bar/Bar/Forms/FormReportCocktailComponents.cs new file mode 100644 index 0000000..0f84698 --- /dev/null +++ b/Bar/Bar/Forms/FormReportCocktailComponents.cs @@ -0,0 +1,75 @@ +using BarContracts.BindingModels; +using BarContracts.BusinessLogicContracts; +using Microsoft.Extensions.Logging; + +namespace BarView.Forms +{ + public partial class FormReportCocktailComponents : Form + { + private readonly ILogger _logger; + private readonly IReportLogic _logic; + + public FormReportCocktailComponents(ILogger Logger, IReportLogic Logic) + { + InitializeComponent(); + + _logger = Logger; + _logic = Logic; + } + + private void FormReportCoctailComponents_Load(object sender, EventArgs e) + { + try + { + var Dict = _logic.GetCocktailComponents(); + + if (Dict != null) + { + DataGridView.Rows.Clear(); + + foreach (var Elem in Dict) + { + DataGridView.Rows.Add(new object[] { Elem.CocktailName, "", "" }); + + foreach (var ListElem in Elem.Components) + DataGridView.Rows.Add(new object[] { "", ListElem.Item1, ListElem.Item2 }); + + DataGridView.Rows.Add(new object[] { "Итого", "", Elem.TotalCount }); + DataGridView.Rows.Add(Array.Empty()); + } + } + + _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.SaveCocktailComponentToExcelFile(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/Bar/Bar/Forms/FormReportCocktailComponents.resx b/Bar/Bar/Forms/FormReportCocktailComponents.resx new file mode 100644 index 0000000..cdfa6a5 --- /dev/null +++ b/Bar/Bar/Forms/FormReportCocktailComponents.resx @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/Bar/Bar/Forms/FormReportOrders.Designer.cs b/Bar/Bar/Forms/FormReportOrders.Designer.cs new file mode 100644 index 0000000..7a7a9ed --- /dev/null +++ b/Bar/Bar/Forms/FormReportOrders.Designer.cs @@ -0,0 +1,131 @@ +namespace BarView.Forms +{ + partial class FormReportOrders + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.Panel = new System.Windows.Forms.Panel(); + this.ToPdfButton = new System.Windows.Forms.Button(); + this.CreateButton = new System.Windows.Forms.Button(); + this.ToDateTimePicker = new System.Windows.Forms.DateTimePicker(); + this.ToLabel = new System.Windows.Forms.Label(); + this.FromDateTimePicker = new System.Windows.Forms.DateTimePicker(); + this.FromLabel = new System.Windows.Forms.Label(); + this.Panel.SuspendLayout(); + this.SuspendLayout(); + // + // Panel + // + this.Panel.Controls.Add(this.ToPdfButton); + this.Panel.Controls.Add(this.CreateButton); + this.Panel.Controls.Add(this.ToDateTimePicker); + this.Panel.Controls.Add(this.ToLabel); + this.Panel.Controls.Add(this.FromDateTimePicker); + this.Panel.Controls.Add(this.FromLabel); + this.Panel.Dock = System.Windows.Forms.DockStyle.Top; + this.Panel.Location = new System.Drawing.Point(0, 0); + this.Panel.Name = "Panel"; + this.Panel.Size = new System.Drawing.Size(1105, 52); + this.Panel.TabIndex = 0; + // + // ToPdfButton + // + this.ToPdfButton.Location = new System.Drawing.Point(781, 9); + this.ToPdfButton.Name = "ToPdfButton"; + this.ToPdfButton.Size = new System.Drawing.Size(165, 29); + this.ToPdfButton.TabIndex = 5; + this.ToPdfButton.Text = "В PDF"; + this.ToPdfButton.UseVisualStyleBackColor = true; + this.ToPdfButton.Click += new System.EventHandler(this.ButtonToPdf_Click); + // + // CreateButton + // + this.CreateButton.Location = new System.Drawing.Point(542, 11); + this.CreateButton.Name = "CreateButton"; + this.CreateButton.Size = new System.Drawing.Size(165, 29); + this.CreateButton.TabIndex = 4; + this.CreateButton.Text = "Сформировать"; + this.CreateButton.UseVisualStyleBackColor = true; + this.CreateButton.Click += new System.EventHandler(this.ButtonMake_Click); + // + // ToDateTimePicker + // + this.ToDateTimePicker.Location = new System.Drawing.Point(299, 9); + this.ToDateTimePicker.Name = "ToDateTimePicker"; + this.ToDateTimePicker.Size = new System.Drawing.Size(199, 27); + this.ToDateTimePicker.TabIndex = 3; + // + // ToLabel + // + this.ToLabel.AutoSize = true; + this.ToLabel.Location = new System.Drawing.Point(254, 13); + this.ToLabel.Name = "ToLabel"; + this.ToLabel.Size = new System.Drawing.Size(27, 20); + this.ToLabel.TabIndex = 2; + this.ToLabel.Text = "по"; + // + // FromDateTimePicker + // + this.FromDateTimePicker.Location = new System.Drawing.Point(37, 9); + this.FromDateTimePicker.Name = "FromDateTimePicker"; + this.FromDateTimePicker.Size = new System.Drawing.Size(199, 27); + this.FromDateTimePicker.TabIndex = 1; + // + // FromLabel + // + this.FromLabel.AutoSize = true; + this.FromLabel.Location = new System.Drawing.Point(11, 13); + this.FromLabel.Name = "FromLabel"; + this.FromLabel.Size = new System.Drawing.Size(18, 20); + this.FromLabel.TabIndex = 0; + this.FromLabel.Text = "C"; + // + // FormReportOrders + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1105, 451); + this.Controls.Add(this.Panel); + this.Name = "FormReportOrders"; + this.Text = "Заказы"; + this.Panel.ResumeLayout(false); + this.Panel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private Panel Panel; + private Button ToPdfButton; + private Button CreateButton; + private DateTimePicker ToDateTimePicker; + private Label ToLabel; + private DateTimePicker FromDateTimePicker; + private Label FromLabel; + } +} \ No newline at end of file diff --git a/Bar/Bar/Forms/FormReportOrders.cs b/Bar/Bar/Forms/FormReportOrders.cs new file mode 100644 index 0000000..f21b75a --- /dev/null +++ b/Bar/Bar/Forms/FormReportOrders.cs @@ -0,0 +1,100 @@ +using BarContracts.BindingModels; +using BarContracts.BusinessLogicContracts; +using Microsoft.Extensions.Logging; +using Microsoft.Reporting.WinForms; + +namespace BarView.Forms +{ + public partial class FormReportOrders : Form + { + private readonly ReportViewer _reportViewer; + private readonly ILogger _logger; + private readonly IReportLogic _logic; + + public FormReportOrders(ILogger Logger, IReportLogic Logic) + { + InitializeComponent(); + _logger = Logger; + _logic = Logic; + + _reportViewer = new ReportViewer + { + Dock = DockStyle.Fill + }; + _reportViewer.LocalReport.LoadReportDefinition(new FileStream("ReportOrder.rdlc", FileMode.Open)); + + Controls.Clear(); + Controls.Add(_reportViewer); + Controls.Add(Panel); + } + + private void ButtonMake_Click(object sender, EventArgs e) + { + if (FromDateTimePicker.Value.Date >= ToDateTimePicker.Value.Date) + { + MessageBox.Show("Дата начала должна быть меньше даты окончания", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + try + { + var DataSource = _logic.GetOrders(new ReportBindingModel + { + DateFrom = FromDateTimePicker.Value, + DateTo = ToDateTimePicker.Value + }); + + var Source = new ReportDataSource("DataSetOrders", DataSource); + + _reportViewer.LocalReport.DataSources.Clear(); + _reportViewer.LocalReport.DataSources.Add(Source); + + var Parameters = new[] { + new ReportParameter("ReportParameterPeriod", $"c {FromDateTimePicker.Value.ToShortDateString()} по {ToDateTimePicker.Value.ToShortDateString()}") + }; + _reportViewer.LocalReport.SetParameters(Parameters); + + _reportViewer.RefreshReport(); + _logger.LogInformation("Загрузка списка заказов на период {From}-{To}", FromDateTimePicker.Value.ToShortDateString(), ToDateTimePicker.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 (FromDateTimePicker.Value.Date >= ToDateTimePicker.Value.Date) + { + MessageBox.Show("Дата начала должна быть меньше даты окончания", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + using var Dialog = new SaveFileDialog { Filter = "pdf|*.pdf" }; + + if (Dialog.ShowDialog() == DialogResult.OK) + { + try + { + System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); + _logic.SaveOrdersToPdfFile(new ReportBindingModel + { + FileName = Dialog.FileName, + DateFrom = FromDateTimePicker.Value, + DateTo = ToDateTimePicker.Value + }); + + _logger.LogInformation("Сохранение списка заказов на период {From}-{To}", FromDateTimePicker.Value.ToShortDateString(), ToDateTimePicker.Value.ToShortDateString()); + MessageBox.Show("Выполнено", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения списка заказов на период"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } +} diff --git a/Bar/Bar/Forms/FormReportOrders.resx b/Bar/Bar/Forms/FormReportOrders.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Bar/Bar/Forms/FormReportOrders.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Bar/Bar/Program.cs b/Bar/Bar/Program.cs index f2d9b0b..672c99e 100644 --- a/Bar/Bar/Program.cs +++ b/Bar/Bar/Program.cs @@ -1,4 +1,6 @@ using BarBusinessLogic.BusinessLogics; +using BarBusinessLogic.OfficePackage.Implements; +using BarBusinessLogic.OfficePackage; using BarContracts.BusinessLogicContracts; using BarContracts.StoragesContracts; using BarDatabaseImplement.Implements; @@ -38,9 +40,15 @@ namespace BarView Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); + + Services.AddTransient(); + Services.AddTransient(); + Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); @@ -49,6 +57,8 @@ namespace BarView Services.AddTransient(); Services.AddTransient(); Services.AddTransient(); + Services.AddTransient(); + Services.AddTransient(); } } } \ No newline at end of file diff --git a/Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IComponentLogic.datasource b/Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IComponentLogic.datasource new file mode 100644 index 0000000..03fb8c8 --- /dev/null +++ b/Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IComponentLogic.datasource @@ -0,0 +1,10 @@ + + + + BarContracts.BusinessLogicContracts.IComponentLogic, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IOrderLogic.datasource b/Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IOrderLogic.datasource new file mode 100644 index 0000000..3505fd3 --- /dev/null +++ b/Bar/Bar/Properties/DataSources/BarContracts.BusinessLogicContracts.IOrderLogic.datasource @@ -0,0 +1,10 @@ + + + + BarContracts.BusinessLogicContracts.IOrderLogic, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.ICocktailStorage.datasource b/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.ICocktailStorage.datasource new file mode 100644 index 0000000..0bc97b2 --- /dev/null +++ b/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.ICocktailStorage.datasource @@ -0,0 +1,10 @@ + + + + BarContracts.StoragesContracts.ICocktailStorage, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IComponentStorage.datasource b/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IComponentStorage.datasource new file mode 100644 index 0000000..c6dfc8e --- /dev/null +++ b/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IComponentStorage.datasource @@ -0,0 +1,10 @@ + + + + BarContracts.StoragesContracts.IComponentStorage, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IOrderStorage.datasource b/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IOrderStorage.datasource new file mode 100644 index 0000000..89b55b0 --- /dev/null +++ b/Bar/Bar/Properties/DataSources/BarContracts.StoragesContracts.IOrderStorage.datasource @@ -0,0 +1,10 @@ + + + + BarContracts.StoragesContracts.IOrderStorage, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + \ No newline at end of file diff --git a/Bar/Bar/ReportOrder.rdlc b/Bar/Bar/ReportOrder.rdlc new file mode 100644 index 0000000..9539be3 --- /dev/null +++ b/Bar/Bar/ReportOrder.rdlc @@ -0,0 +1,572 @@ + + + 0 + + + + System.Data.DataSet + /* Local Connection */ + + 10791c83-cee8-4a38-bbd0-245fc17cefb3 + + + + + + BarContractsViewModels + /* Local Query */ + + + + Id + System.Int32 + + + DateCreate + System.DateTime + + + CocktailName + System.String + + + Sum + System.Decimal + + + Status + System.String + + + + BarContracts.ViewModels + ReportOrdersViewModel + BarContracts.ViewModels.ReportOrdersViewModel, BarContracts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null + + + + + + + + + true + true + + + + + Заказы + + + + 0.6cm + 22.058cm + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Parameters!ReportParameterPeriod.Value + + + + ReportParameterPeriod + 0.6cm + 0.6cm + 22.058cm + 1 + + + Middle + 2pt + 2pt + 2pt + 2pt + + + + + + + 2.60583cm + + + 5.27517cm + + + 6.1195cm + + + 4.76483cm + + + 2.5cm + + + + + 0.6cm + + + + + true + true + + + + + Номер + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Дата создания + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Коктейль + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Статус + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + Сумма + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + 0.6cm + + + + + true + true + + + + + =Fields!Id.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!DateCreate.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!CocktailName.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Status.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + true + true + + + + + =Fields!Sum.Value + + + 2pt + 2pt + 2pt + 2pt + + + + + + + + + + + + + + + + + + + + + After + + + + + + + DataSetOrders + 1.9177cm + 0.79267cm + 1.2cm + 21.26533cm + 2 + + + + + + true + true + + + + + Итого: + + + + 3.46287cm + 16.61349cm + 0.6cm + 2.5cm + 3 + + + 2pt + 2pt + 2pt + 2pt + + + + true + true + + + + + =Sum(Fields!Sum.Value, "DataSetOrders") + + + 2pt + 2pt + 2pt + 2pt + + + + 2in +