From 2572c1bd10414aeb3c31f5709fc77cd20f7f38ff Mon Sep 17 00:00:00 2001
From: IlyasValiulov <148232695+IlyasValiulov@users.noreply.github.com>
Date: Sun, 24 Nov 2024 16:47:50 +0400
Subject: [PATCH 1/2] =?UTF-8?q?=D0=9B=D0=B0=D0=B1=D0=B0=D1=80=D0=B0=D1=82?=
=?UTF-8?q?=D0=BE=D1=80=D0=BD=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?=
=?UTF-8?q?=D0=B0=203?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../CarpentryWorkshop.csproj | 3 +
.../CarpentryWorkshop/Entities/TempOrder.cs | 9 +
.../FormCarpentryWorkshop.Designer.cs | 31 ++
.../FormCarpentryWorkshop.cs | 36 ++
.../Forms/FormDirectoryReport.Designer.cs | 86 +++++
.../Forms/FormDirectoryReport.cs | 52 +++
.../Forms/FormDirectoryReport.resx | 120 +++++++
...RepleneshmentDistibutionReport.Designer.cs | 107 ++++++
...mMaterialRepleneshmentDistibutionReport.cs | 55 ++++
...aterialRepleneshmentDistibutionReport.resx | 120 +++++++
.../Forms/FormMaterialReplenishment.cs | 1 +
.../Forms/FormMaterialReport.Designer.cs | 161 +++++++++
.../Forms/FormMaterialReport.cs | 68 ++++
.../Forms/FormMaterialReport.resx | 120 +++++++
.../CarpentryWorkshop/Program.cs | 1 +
.../CarpentryWorkshop/Reports/ChartReport.cs | 42 +++
.../CarpentryWorkshop/Reports/DocReport.cs | 61 ++++
.../CarpentryWorkshop/Reports/ExcelBuilder.cs | 310 ++++++++++++++++++
.../CarpentryWorkshop/Reports/PdfBuilder.cs | 76 +++++
.../CarpentryWorkshop/Reports/TableReport.cs | 62 ++++
.../CarpentryWorkshop/Reports/WordBuilder.cs | 102 ++++++
.../Repositories/IOrderMaterialsRepository.cs | 8 +
.../OrderMaterialsRepository.cs | 35 ++
23 files changed, 1666 insertions(+)
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.Designer.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.resx
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.Designer.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.resx
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.Designer.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.resx
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Reports/ChartReport.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Reports/DocReport.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Reports/ExcelBuilder.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Reports/PdfBuilder.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Reports/TableReport.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Reports/WordBuilder.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Repositories/IOrderMaterialsRepository.cs
create mode 100644 CarpentryWorkshop/CarpentryWorkshop/Repositories/Implementations/OrderMaterialsRepository.cs
diff --git a/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshop.csproj b/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshop.csproj
index 20f5176..a2f071e 100644
--- a/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshop.csproj
+++ b/CarpentryWorkshop/CarpentryWorkshop/CarpentryWorkshop.csproj
@@ -10,15 +10,18 @@
+
+
+
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs b/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs
new file mode 100644
index 0000000..bebc63b
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs
@@ -0,0 +1,9 @@
+using CarpentryWorkshop.Entities.Enums;
+
+namespace CarpentryWorkshop.Entities;
+
+public class TempOrder
+{
+ public DateTime DataOrder { get; private set; }
+ public int Count { get; private set; }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.Designer.cs
index 0027659..50973ab 100644
--- a/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.Designer.cs
+++ b/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.Designer.cs
@@ -36,6 +36,9 @@
OrderToolStripMenuItem = new ToolStripMenuItem();
MaterialReplenishmentToolStripMenuItem = new ToolStripMenuItem();
отчетыToolStripMenuItem = new ToolStripMenuItem();
+ documentReportToolStripMenuItem = new ToolStripMenuItem();
+ materialToolStripMenuItem = new ToolStripMenuItem();
+ distributionMaterialReplenishmentToolStripMenuItem = new ToolStripMenuItem();
menuStrip1.SuspendLayout();
SuspendLayout();
//
@@ -92,10 +95,35 @@
//
// отчетыToolStripMenuItem
//
+ отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { documentReportToolStripMenuItem, materialToolStripMenuItem, distributionMaterialReplenishmentToolStripMenuItem });
отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem";
отчетыToolStripMenuItem.Size = new Size(60, 20);
отчетыToolStripMenuItem.Text = "Отчеты";
//
+ // documentReportToolStripMenuItem
+ //
+ documentReportToolStripMenuItem.Name = "documentReportToolStripMenuItem";
+ documentReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.W;
+ documentReportToolStripMenuItem.Size = new Size(339, 22);
+ documentReportToolStripMenuItem.Text = "Документ со справочниками";
+ documentReportToolStripMenuItem.Click += DocumentReportToolStripMenuItem_Click;
+ //
+ // materialToolStripMenuItem
+ //
+ materialToolStripMenuItem.Name = "materialToolStripMenuItem";
+ materialToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.E;
+ materialToolStripMenuItem.Size = new Size(339, 22);
+ materialToolStripMenuItem.Text = "Движение по материалам";
+ materialToolStripMenuItem.Click += MaterialToolStripMenuItem_Click;
+ //
+ // distributionMaterialReplenishmentToolStripMenuItem
+ //
+ distributionMaterialReplenishmentToolStripMenuItem.Name = "distributionMaterialReplenishmentToolStripMenuItem";
+ distributionMaterialReplenishmentToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.P;
+ distributionMaterialReplenishmentToolStripMenuItem.Size = new Size(339, 22);
+ distributionMaterialReplenishmentToolStripMenuItem.Text = "Распределение пополнения материалов";
+ distributionMaterialReplenishmentToolStripMenuItem.Click += DistributionMaterialReplenishmentToolStripMenuItem_Click;
+ //
// FormCarpentryWorkshop
//
AutoScaleDimensions = new SizeF(7F, 15F);
@@ -123,5 +151,8 @@
private ToolStripMenuItem отчетыToolStripMenuItem;
private ToolStripMenuItem OrderToolStripMenuItem;
private ToolStripMenuItem MaterialReplenishmentToolStripMenuItem;
+ private ToolStripMenuItem documentReportToolStripMenuItem;
+ private ToolStripMenuItem materialToolStripMenuItem;
+ private ToolStripMenuItem distributionMaterialReplenishmentToolStripMenuItem;
}
}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.cs b/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.cs
index 2c88bc1..c56b79f 100644
--- a/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.cs
+++ b/CarpentryWorkshop/CarpentryWorkshop/FormCarpentryWorkshop.cs
@@ -55,5 +55,41 @@ namespace CarpentryWorkshop
MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
+
+ private void DocumentReportToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void MaterialToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ private void DistributionMaterialReplenishmentToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ _container.Resolve().ShowDialog();
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, " ", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
}
}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.Designer.cs
new file mode 100644
index 0000000..7b43c89
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.Designer.cs
@@ -0,0 +1,86 @@
+namespace CarpentryWorkshop.Forms
+{
+ partial class FormDirectoryReport
+ {
+ ///
+ /// 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()
+ {
+ buttonBuild = new Button();
+ checkBoxProducts = new CheckBox();
+ checkBoxMaterials = new CheckBox();
+ SuspendLayout();
+ //
+ // buttonBuild
+ //
+ buttonBuild.Location = new Point(178, 61);
+ buttonBuild.Name = "buttonBuild";
+ buttonBuild.Size = new Size(102, 23);
+ buttonBuild.TabIndex = 0;
+ buttonBuild.Text = "Сформировать";
+ buttonBuild.UseVisualStyleBackColor = true;
+ buttonBuild.Click += buttonBuild_Click;
+ //
+ // checkBoxProducts
+ //
+ checkBoxProducts.AutoSize = true;
+ checkBoxProducts.Location = new Point(38, 35);
+ checkBoxProducts.Name = "checkBoxProducts";
+ checkBoxProducts.Size = new Size(81, 19);
+ checkBoxProducts.TabIndex = 1;
+ checkBoxProducts.Text = "Продукты";
+ checkBoxProducts.UseVisualStyleBackColor = true;
+ //
+ // checkBoxMaterials
+ //
+ checkBoxMaterials.AutoSize = true;
+ checkBoxMaterials.Location = new Point(38, 88);
+ checkBoxMaterials.Name = "checkBoxMaterials";
+ checkBoxMaterials.Size = new Size(90, 19);
+ checkBoxMaterials.TabIndex = 2;
+ checkBoxMaterials.Text = "Материалы";
+ checkBoxMaterials.UseVisualStyleBackColor = true;
+ //
+ // FormDirectotyReport
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(292, 123);
+ Controls.Add(checkBoxMaterials);
+ Controls.Add(checkBoxProducts);
+ Controls.Add(buttonBuild);
+ Name = "FormDirectotyReport";
+ Text = "FormDirectotyReport";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Button buttonBuild;
+ private CheckBox checkBoxProducts;
+ private CheckBox checkBoxMaterials;
+ }
+}
\ No newline at end of file
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.cs
new file mode 100644
index 0000000..3600ee2
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.cs
@@ -0,0 +1,52 @@
+using CarpentryWorkshop.Reports;
+using Unity;
+
+namespace CarpentryWorkshop.Forms
+{
+ public partial class FormDirectoryReport : Form
+ {
+ private readonly IUnityContainer _container;
+
+ public FormDirectoryReport(IUnityContainer container)
+ {
+ InitializeComponent();
+ _container = container ?? throw new ArgumentNullException(nameof(container));
+ }
+
+ private void buttonBuild_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (!checkBoxProducts.Checked && !checkBoxMaterials.Checked)
+ {
+ throw new Exception("Не выбран ни один справочник для выгрузки");
+ }
+
+ var sfd = new SaveFileDialog()
+ {
+ Filter = "Docx Files | *.docx"
+ };
+
+ if (sfd.ShowDialog() != DialogResult.OK)
+ {
+ throw new Exception("Не выбран файла для отчета");
+ }
+
+ if (_container.Resolve().CreateDoc(sfd.FileName, checkBoxProducts.Checked, checkBoxMaterials.Checked))
+ {
+ MessageBox.Show("Документ сформирован","Формирование документа",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах",
+ "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при создании отчета", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.resx b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormDirectoryReport.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.Designer.cs
new file mode 100644
index 0000000..93ef790
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.Designer.cs
@@ -0,0 +1,107 @@
+namespace CarpentryWorkshop.Forms
+{
+ partial class FormMaterialRepleneshmentDistibutionReport
+ {
+ ///
+ /// 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()
+ {
+ dateTimePicker = new DateTimePicker();
+ labelFileName = new Label();
+ buttonCreate = new Button();
+ buttonSelectFileName = new Button();
+ labelDate = new Label();
+ SuspendLayout();
+ //
+ // dateTimePicker
+ //
+ dateTimePicker.Location = new Point(104, 64);
+ dateTimePicker.Name = "dateTimePicker";
+ dateTimePicker.Size = new Size(200, 23);
+ dateTimePicker.TabIndex = 7;
+ //
+ // labelFileName
+ //
+ labelFileName.AutoSize = true;
+ labelFileName.Location = new Point(104, 25);
+ labelFileName.Name = "labelFileName";
+ labelFileName.Size = new Size(36, 15);
+ labelFileName.TabIndex = 8;
+ labelFileName.Text = "Файл";
+ //
+ // buttonCreate
+ //
+ buttonCreate.Location = new Point(63, 106);
+ buttonCreate.Name = "buttonCreate";
+ buttonCreate.Size = new Size(317, 23);
+ buttonCreate.TabIndex = 11;
+ buttonCreate.Text = "Сформировать";
+ buttonCreate.UseVisualStyleBackColor = true;
+ buttonCreate.Click += buttonCreate_Click;
+ //
+ // buttonSelectFileName
+ //
+ buttonSelectFileName.Location = new Point(12, 21);
+ buttonSelectFileName.Name = "buttonSelectFileName";
+ buttonSelectFileName.Size = new Size(86, 23);
+ buttonSelectFileName.TabIndex = 12;
+ buttonSelectFileName.Text = "Выбрать";
+ buttonSelectFileName.UseVisualStyleBackColor = true;
+ buttonSelectFileName.Click += buttonSelectFileName_Click;
+ //
+ // labelDate
+ //
+ labelDate.AutoSize = true;
+ labelDate.Location = new Point(36, 70);
+ labelDate.Name = "labelDate";
+ labelDate.Size = new Size(32, 15);
+ labelDate.TabIndex = 13;
+ labelDate.Text = "Дата";
+ //
+ // FormMaterialRepleneshmentDistibutionReport
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(445, 139);
+ Controls.Add(labelDate);
+ Controls.Add(buttonSelectFileName);
+ Controls.Add(buttonCreate);
+ Controls.Add(labelFileName);
+ Controls.Add(dateTimePicker);
+ Name = "FormMaterialRepleneshmentDistibutionReport";
+ Text = "FormMaterialRepleneshmentDistibutionReport";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private DateTimePicker dateTimePicker;
+ private Label labelFileName;
+ private Button buttonCreate;
+ private Button buttonSelectFileName;
+ private Label labelDate;
+ }
+}
\ No newline at end of file
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.cs
new file mode 100644
index 0000000..cc686df
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.cs
@@ -0,0 +1,55 @@
+using CarpentryWorkshop.Reports;
+using Unity;
+
+namespace CarpentryWorkshop.Forms
+{
+ public partial class FormMaterialRepleneshmentDistibutionReport : Form
+ {
+ private string _fileName = string.Empty;
+ private readonly IUnityContainer _container;
+
+ public FormMaterialRepleneshmentDistibutionReport(IUnityContainer container)
+ {
+ InitializeComponent();
+ _container = container ?? throw new ArgumentNullException(nameof(container));
+ }
+
+ private void buttonSelectFileName_Click(object sender, EventArgs e)
+ {
+ var sfd = new SaveFileDialog()
+ {
+ Filter = "Pdf Files | *.pdf"
+ };
+ if (sfd.ShowDialog() == DialogResult.OK)
+ {
+ _fileName = sfd.FileName;
+ labelFileName.Text = Path.GetFileName(_fileName);
+ }
+ }
+
+ private void buttonCreate_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(_fileName))
+ {
+ throw new Exception("Отсутствует имя файла для отчета");
+ }
+ if (_container.Resolve().CreateChart(_fileName, dateTimePicker.Value))
+ {
+ MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Возникли ошибки при формировании документа. Подробности в логах", "Формирование документа",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при создании очета",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.resx b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialRepleneshmentDistibutionReport.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReplenishment.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReplenishment.cs
index e4d8bbb..5451233 100644
--- a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReplenishment.cs
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReplenishment.cs
@@ -19,6 +19,7 @@ namespace CarpentryWorkshop.Forms
throw new InvalidDataException(nameof(materialSpent));
}
textBoxName.Text = materialSpent.Name;
+ comboBoxMaterial.Text = materialSpent.Name;
numericUpDownCount.Value = materialSpent.Count;
_materialSpentId = value;
}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.Designer.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.Designer.cs
new file mode 100644
index 0000000..8070852
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.Designer.cs
@@ -0,0 +1,161 @@
+namespace CarpentryWorkshop.Forms
+{
+ partial class FormMaterialReport
+ {
+ ///
+ /// 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()
+ {
+ labelFilePath = new Label();
+ labelMaterial = new Label();
+ labelDateStart = new Label();
+ labelDateEnd = new Label();
+ comboBoxMaterial = new ComboBox();
+ dateTimePickerStart = new DateTimePicker();
+ dateTimePickerEnd = new DateTimePicker();
+ textBoxFilePath = new TextBox();
+ buttonSelectFilePath = new Button();
+ buttonMakeReport = new Button();
+ SuspendLayout();
+ //
+ // labelFilePath
+ //
+ labelFilePath.AutoSize = true;
+ labelFilePath.Location = new Point(21, 37);
+ labelFilePath.Name = "labelFilePath";
+ labelFilePath.Size = new Size(87, 15);
+ labelFilePath.TabIndex = 1;
+ labelFilePath.Text = "Путь до файла";
+ //
+ // labelMaterial
+ //
+ labelMaterial.AutoSize = true;
+ labelMaterial.Location = new Point(21, 97);
+ labelMaterial.Name = "labelMaterial";
+ labelMaterial.Size = new Size(62, 15);
+ labelMaterial.TabIndex = 2;
+ labelMaterial.Text = "Материал";
+ //
+ // labelDateStart
+ //
+ labelDateStart.AutoSize = true;
+ labelDateStart.Location = new Point(21, 153);
+ labelDateStart.Name = "labelDateStart";
+ labelDateStart.Size = new Size(74, 15);
+ labelDateStart.TabIndex = 3;
+ labelDateStart.Text = "Дата начала";
+ //
+ // labelDateEnd
+ //
+ labelDateEnd.AutoSize = true;
+ labelDateEnd.Location = new Point(21, 219);
+ labelDateEnd.Name = "labelDateEnd";
+ labelDateEnd.Size = new Size(68, 15);
+ labelDateEnd.TabIndex = 4;
+ labelDateEnd.Text = "Дата конца";
+ //
+ // comboBoxMaterial
+ //
+ comboBoxMaterial.FormattingEnabled = true;
+ comboBoxMaterial.Location = new Point(138, 97);
+ comboBoxMaterial.Name = "comboBoxMaterial";
+ comboBoxMaterial.Size = new Size(121, 23);
+ comboBoxMaterial.TabIndex = 5;
+ //
+ // dateTimePickerStart
+ //
+ dateTimePickerStart.Location = new Point(138, 153);
+ dateTimePickerStart.Name = "dateTimePickerStart";
+ dateTimePickerStart.Size = new Size(200, 23);
+ dateTimePickerStart.TabIndex = 6;
+ //
+ // dateTimePickerEnd
+ //
+ dateTimePickerEnd.Location = new Point(138, 211);
+ dateTimePickerEnd.Name = "dateTimePickerEnd";
+ dateTimePickerEnd.Size = new Size(200, 23);
+ dateTimePickerEnd.TabIndex = 7;
+ //
+ // textBoxFilePath
+ //
+ textBoxFilePath.Location = new Point(135, 38);
+ textBoxFilePath.Name = "textBoxFilePath";
+ textBoxFilePath.Size = new Size(165, 23);
+ textBoxFilePath.TabIndex = 8;
+ //
+ // buttonSelectFilePath
+ //
+ buttonSelectFilePath.Location = new Point(308, 38);
+ buttonSelectFilePath.Name = "buttonSelectFilePath";
+ buttonSelectFilePath.Size = new Size(30, 23);
+ buttonSelectFilePath.TabIndex = 9;
+ buttonSelectFilePath.UseVisualStyleBackColor = true;
+ buttonSelectFilePath.Click += buttonSelectFilePath_Click;
+ //
+ // buttonMakeReport
+ //
+ buttonMakeReport.Location = new Point(21, 256);
+ buttonMakeReport.Name = "buttonMakeReport";
+ buttonMakeReport.Size = new Size(317, 23);
+ buttonMakeReport.TabIndex = 10;
+ buttonMakeReport.Text = "Сформировать";
+ buttonMakeReport.UseVisualStyleBackColor = true;
+ buttonMakeReport.Click += buttonMakeReport_Click;
+ //
+ // FormMaterialReport
+ //
+ AutoScaleDimensions = new SizeF(7F, 15F);
+ AutoScaleMode = AutoScaleMode.Font;
+ ClientSize = new Size(366, 290);
+ Controls.Add(buttonMakeReport);
+ Controls.Add(buttonSelectFilePath);
+ Controls.Add(textBoxFilePath);
+ Controls.Add(dateTimePickerEnd);
+ Controls.Add(dateTimePickerStart);
+ Controls.Add(comboBoxMaterial);
+ Controls.Add(labelDateEnd);
+ Controls.Add(labelDateStart);
+ Controls.Add(labelMaterial);
+ Controls.Add(labelFilePath);
+ Name = "FormMaterialReport";
+ Text = "FormMaterialReport";
+ ResumeLayout(false);
+ PerformLayout();
+ }
+
+ #endregion
+
+ private Label labelFilePath;
+ private Label labelMaterial;
+ private Label labelDateStart;
+ private Label labelDateEnd;
+ private ComboBox comboBoxMaterial;
+ private DateTimePicker dateTimePickerStart;
+ private DateTimePicker dateTimePickerEnd;
+ private TextBox textBoxFilePath;
+ private Button buttonSelectFilePath;
+ private Button buttonMakeReport;
+ }
+}
\ No newline at end of file
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.cs b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.cs
new file mode 100644
index 0000000..ed1163d
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.cs
@@ -0,0 +1,68 @@
+using CarpentryWorkshop.Reports;
+using CarpentryWorkshop.Repositories;
+using Unity;
+
+namespace CarpentryWorkshop.Forms
+{
+ public partial class FormMaterialReport : Form
+ {
+ private readonly IUnityContainer _container;
+
+ public FormMaterialReport(IUnityContainer container, IMaterialRepository materialRepository)
+ {
+ InitializeComponent();
+ _container = container;
+
+ comboBoxMaterial.DataSource = materialRepository.ReadMaterials();
+ comboBoxMaterial.DisplayMember = "Name";
+ comboBoxMaterial.ValueMember = "Id";
+ }
+
+ private void buttonSelectFilePath_Click(object sender, EventArgs e)
+ {
+ var sfd = new SaveFileDialog()
+ {
+ Filter = "Excel Files | *.xlsx"
+ };
+ if (sfd.ShowDialog() != DialogResult.OK)
+ {
+ return;
+ }
+ textBoxFilePath.Text = sfd.FileName;
+ }
+
+ private void buttonMakeReport_Click(object sender, EventArgs e)
+ {
+ try
+ {
+ if (string.IsNullOrWhiteSpace(textBoxFilePath.Text))
+ {
+ throw new Exception("Отсутствует имя файла для отчета");
+ }
+ if (comboBoxMaterial.SelectedIndex < 0)
+ {
+ throw new Exception("Не выбран корм");
+ }
+ if (dateTimePickerEnd.Value <= dateTimePickerStart.Value)
+ {
+ throw new Exception("Дата начала должна быть раньше даты окончания");
+ }
+ if (_container.Resolve().CreateTable(textBoxFilePath.Text, (int)comboBoxMaterial.SelectedValue!,
+ dateTimePickerStart.Value, dateTimePickerEnd.Value))
+ {
+ MessageBox.Show("Документ сформирован", "Формирование документа", MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ else
+ {
+ MessageBox.Show("Возникли ошибки при формировании документа. Подробности в логах", "Формирование документа",
+ MessageBoxButtons.OK, MessageBoxIcon.Information);
+ }
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show(ex.Message, "Ошибка при создании очета",
+ MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.resx b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Forms/FormMaterialReport.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Program.cs b/CarpentryWorkshop/CarpentryWorkshop/Program.cs
index c962f01..c3d8708 100644
--- a/CarpentryWorkshop/CarpentryWorkshop/Program.cs
+++ b/CarpentryWorkshop/CarpentryWorkshop/Program.cs
@@ -31,6 +31,7 @@ namespace CarpentryWorkshop
container.RegisterType();
container.RegisterType();
container.RegisterType();
+ container.RegisterType();
container.RegisterType();
return container;
}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Reports/ChartReport.cs b/CarpentryWorkshop/CarpentryWorkshop/Reports/ChartReport.cs
new file mode 100644
index 0000000..3f061cb
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Reports/ChartReport.cs
@@ -0,0 +1,42 @@
+using CarpentryWorkshop.Repositories;
+using Microsoft.Extensions.Logging;
+
+namespace CarpentryWorkshop.Reports;
+
+internal class ChartReport
+{
+ private readonly IMaterialReplenishmentRepository _materialReplenishmentRepository;
+ private readonly ILogger _logger;
+
+ public ChartReport(IMaterialReplenishmentRepository materialReplenishmentRepository, ILogger logger)
+ {
+ _materialReplenishmentRepository = materialReplenishmentRepository ?? throw new ArgumentNullException(nameof(materialReplenishmentRepository));
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ }
+
+ public bool CreateChart(string filePath, DateTime dateTime)
+ {
+ try
+ {
+ new PdfBuilder(filePath)
+ .AddHeader("Пополенение материала")
+ .AddPieChart("Виды материалов", GetData(dateTime))
+ .Build();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при формировании документа");
+ return false;
+ }
+ }
+ private List<(string Caption, double Value)> GetData(DateTime dateTime)
+ {
+ return _materialReplenishmentRepository
+ .ReadMaterialsSpent()
+ .Where(x => x.DateReplenishment.Date == dateTime.Date)
+ .GroupBy(x => x.Name, (key, group) => new { Id = key, Count = group.Sum(x => x.Count) })
+ .Select(x => (x.Id.ToString(), (double)x.Count))
+ .ToList();
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Reports/DocReport.cs b/CarpentryWorkshop/CarpentryWorkshop/Reports/DocReport.cs
new file mode 100644
index 0000000..307a0cb
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Reports/DocReport.cs
@@ -0,0 +1,61 @@
+using CarpentryWorkshop.Repositories;
+using Microsoft.Extensions.Logging;
+
+namespace CarpentryWorkshop.Reports;
+
+internal class DocReport
+{
+ private readonly IProductRepository _productRepository;
+ private readonly IMaterialRepository _materialRepository;
+ private readonly ILogger _logger;
+
+ public DocReport(IProductRepository productRepository, IMaterialRepository materialRepository, ILogger logger)
+ {
+ _productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
+ _materialRepository = materialRepository ?? throw new ArgumentNullException(nameof(materialRepository));
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ }
+
+ public bool CreateDoc(string filePath, bool includeProducts, bool includeMaterials)
+ {
+ try
+ {
+ var builder = new WordBuilder(filePath).AddHeader("Документ со справочниками");
+ if (includeProducts)
+ {
+ builder.AddParagraph("Изделия").AddTable([2400, 2400, 2400], GetProducts());
+ }
+ if (includeMaterials)
+ {
+ builder.AddParagraph("Материалы").AddTable([2400, 2400, 2400], GetMaterials());
+ }
+ builder.Build();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при формировании документа");
+ return false;
+ }
+ }
+
+ private List GetProducts()
+ {
+ return [
+ ["Название", "Тип", "Количество на складе"],
+ .. _productRepository
+ .ReadProducts()
+ .Select(x => new string[] { x.Name, x.Type.ToString(), x.CountInWarehouse.ToString() }),
+ ];
+ }
+
+ private List GetMaterials()
+ {
+ return [
+ ["Название", "Количество на складе", "Зарезервируемое количество"],
+ .. _materialRepository
+ .ReadMaterials()
+ .Select(x => new string[] { x.Name, x.Count.ToString(), x.ReservInWarehouse.ToString() }),
+ ];
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Reports/ExcelBuilder.cs b/CarpentryWorkshop/CarpentryWorkshop/Reports/ExcelBuilder.cs
new file mode 100644
index 0000000..db89749
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Reports/ExcelBuilder.cs
@@ -0,0 +1,310 @@
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Spreadsheet;
+
+namespace CarpentryWorkshop.Reports;
+
+internal class ExcelBuilder
+{
+ private readonly string _filePath;
+ private readonly SheetData _sheetData;
+ private readonly MergeCells _mergeCells;
+ private readonly Columns _columns;
+ private uint _rowIndex = 0;
+
+ public ExcelBuilder(string filePath)
+ {
+ if (string.IsNullOrWhiteSpace(filePath))
+ {
+ throw new ArgumentNullException(nameof(filePath));
+ }
+ if (File.Exists(filePath))
+ {
+ File.Delete(filePath);
+ }
+ _filePath = filePath;
+ _sheetData = new SheetData();
+ _mergeCells = new MergeCells();
+ _columns = new Columns();
+ _rowIndex = 1;
+ }
+
+ public ExcelBuilder AddHeader(string header, int startIndex, int count)
+ {
+ CreateCell(startIndex, _rowIndex, header, StyleIndex.BoldTextWithoutBorder);
+ for (int i = startIndex + 1; i < startIndex + count; ++i)
+ {
+ CreateCell(i, _rowIndex, "", StyleIndex.SimpleTextWithoutBorder);
+ }
+ _mergeCells.Append(new MergeCell()
+ {
+ Reference = new StringValue($"{GetExcelColumnName(startIndex)}{_rowIndex}:{GetExcelColumnName(startIndex + count - 1)}{_rowIndex}")});
+ _rowIndex++;
+ return this;
+ }
+
+ public ExcelBuilder AddParagraph(string text, int columnIndex)
+ {
+ CreateCell(columnIndex, _rowIndex++, text, StyleIndex.SimpleTextWithoutBorder);
+ return this;
+ }
+
+ public ExcelBuilder AddTable(int[] columnsWidths, List data)
+ {
+ if (columnsWidths == null || columnsWidths.Length == 0)
+ {
+ throw new ArgumentNullException(nameof(columnsWidths));
+ }
+ if (data == null || data.Count == 0)
+ {
+ throw new ArgumentNullException(nameof(data));
+ }
+ if (data.Any(x => x.Length != columnsWidths.Length))
+ {
+ throw new InvalidOperationException("widths.Length != data.Length");
+ }
+
+ uint counter = 1;
+ int coef = 2;
+ _columns.Append(columnsWidths.Select(x => new Column
+ {
+ Min = counter,
+ Max = counter++,
+ Width = x * coef,
+ CustomWidth = true
+ }));
+ for (var j = 0; j < data.First().Length; ++j)
+ {
+ CreateCell(j, _rowIndex, data.First()[j], StyleIndex.BoldTextWithBorder);
+ }
+ _rowIndex++;
+
+ for (var i = 1; i < data.Count - 1; ++i)
+ {
+ for (var j = 0; j < data[i].Length; ++j)
+ {
+ CreateCell(j, _rowIndex, data[i][j], StyleIndex.SimpleTextWithBorder);
+ }
+ _rowIndex++;
+ }
+ for (var j = 0; j < data.Last().Length; ++j)
+ {
+ CreateCell(j, _rowIndex, data.Last()[j], StyleIndex.BoldTextWithBorder);
+ }
+ _rowIndex++;
+ return this;
+ }
+
+ public void Build()
+ {
+ using var spreadsheetDocument = SpreadsheetDocument.Create(_filePath, SpreadsheetDocumentType.Workbook);
+ var workbookpart = spreadsheetDocument.AddWorkbookPart();
+ GenerateStyle(workbookpart);
+ workbookpart.Workbook = new Workbook();
+ var worksheetPart = workbookpart.AddNewPart();
+ worksheetPart.Worksheet = new Worksheet();
+
+ if (_columns.HasChildren)
+ {
+ worksheetPart.Worksheet.Append(_columns);
+ }
+
+ worksheetPart.Worksheet.Append(_sheetData);
+ var sheets = spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets());
+ var sheet = new Sheet()
+ {
+ Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
+ SheetId = 1,
+ Name = "Лист 1"
+ };
+ sheets.Append(sheet);
+ if (_mergeCells.HasChildren)
+ {
+ worksheetPart.Worksheet.InsertAfter(_mergeCells,
+ worksheetPart.Worksheet.Elements().First());
+ }
+ }
+
+ private static void GenerateStyle(WorkbookPart workbookPart)
+ {
+ var workbookStylesPart = workbookPart.AddNewPart();
+ workbookStylesPart.Stylesheet = new Stylesheet();
+
+ var fonts = new Fonts()
+ {
+ Count = 2,
+ KnownFonts = BooleanValue.FromBoolean(true)
+ };
+ fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font
+ {
+ FontSize = new FontSize() { Val = 11 },
+ FontName = new FontName() { Val = "Calibri" },
+ FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 },
+ FontScheme = new FontScheme()
+ {
+ Val = new EnumValue(FontSchemeValues.Minor)
+ }
+ });
+ fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font
+ {
+ FontSize = new FontSize() { Val = 11 },
+ FontName = new FontName() { Val = "Calibri" },
+ FontFamilyNumbering = new FontFamilyNumbering() { Val = 2 },
+ FontScheme = new FontScheme()
+ {
+ Val = new EnumValue(FontSchemeValues.Minor)
+ },
+ Bold = new Bold() { Val = true }
+ });
+ workbookStylesPart.Stylesheet.Append(fonts);
+
+ // Default Fill
+ var fills = new Fills() { Count = 1 };
+ fills.Append(new Fill
+ {
+ PatternFill = new PatternFill()
+ {
+ PatternType = new EnumValue(PatternValues.None)
+ }
+ });
+ workbookStylesPart.Stylesheet.Append(fills);
+
+ // Default Border
+ var borders = new Borders() { Count = 2 };
+ borders.Append(new Border
+ {
+ LeftBorder = new LeftBorder(),
+ RightBorder = new RightBorder(),
+ TopBorder = new TopBorder(),
+ BottomBorder = new BottomBorder(),
+ DiagonalBorder = new DiagonalBorder()
+ });
+ borders.Append(new Border
+ {
+ LeftBorder = new LeftBorder() { Style = BorderStyleValues.Thin },
+ RightBorder = new RightBorder() { Style = BorderStyleValues.Thin },
+ TopBorder = new TopBorder() { Style = BorderStyleValues.Thin },
+ BottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin },
+ DiagonalBorder = new DiagonalBorder()
+ });
+ workbookStylesPart.Stylesheet.Append(borders);
+
+ // Default cell format and a date cell format
+ var cellFormats = new CellFormats() { Count = 4 };
+ cellFormats.Append(new CellFormat
+ {
+ NumberFormatId = 0,
+ FormatId = 0,
+ FontId = 0,
+ BorderId = 0,
+ FillId = 0,
+ Alignment = new Alignment()
+ {
+ Horizontal = HorizontalAlignmentValues.Left,
+ Vertical = VerticalAlignmentValues.Center,
+ WrapText = true
+ }
+ });
+ cellFormats.Append(new CellFormat
+ {
+ NumberFormatId = 0,
+ FormatId = 0,
+ FontId = 0,
+ BorderId = 1,
+ FillId = 0,
+ Alignment = new Alignment()
+ {
+ Horizontal = HorizontalAlignmentValues.Right,
+ Vertical = VerticalAlignmentValues.Center,
+ WrapText = true
+ }
+ });
+ cellFormats.Append(new CellFormat
+ {
+ NumberFormatId = 0,
+ FormatId = 0,
+ FontId = 1,
+ BorderId = 0,
+ FillId = 0,
+ Alignment = new Alignment()
+ {
+ Horizontal = HorizontalAlignmentValues.Center,
+ Vertical = VerticalAlignmentValues.Center,
+ WrapText = true
+ }
+ });
+ cellFormats.Append(new CellFormat
+ {
+ NumberFormatId = 0,
+ FormatId = 0,
+ FontId = 1,
+ BorderId = 1,
+ FillId = 0,
+ Alignment = new Alignment()
+ {
+ Horizontal = HorizontalAlignmentValues.Center,
+ Vertical = VerticalAlignmentValues.Center,
+ WrapText = true
+ }
+ });
+ workbookStylesPart.Stylesheet.Append(cellFormats);
+ }
+
+ private enum StyleIndex
+ {
+ SimpleTextWithoutBorder = 0,
+ SimpleTextWithBorder = 1,
+ BoldTextWithoutBorder = 2,
+ BoldTextWithBorder = 3,
+ }
+
+ private void CreateCell(int columnIndex, uint rowIndex, string text, StyleIndex styleIndex)
+ {
+ var columnName = GetExcelColumnName(columnIndex);
+ var cellReference = columnName + rowIndex;
+ var row = _sheetData.Elements().FirstOrDefault(r => r.RowIndex! == rowIndex);
+ if (row == null)
+ {
+ row = new Row() { RowIndex = rowIndex };
+ _sheetData.Append(row);
+ }
+ var newCell = row.Elements().FirstOrDefault(c => c.CellReference != null &&
+ c.CellReference.Value == columnName + rowIndex);
+ if (newCell == null)
+ {
+ Cell? refCell = null;
+ foreach (Cell cell in row.Elements())
+ {
+ if (cell.CellReference?.Value != null &&
+ cell.CellReference.Value.Length == cellReference.Length)
+ {
+ if (string.Compare(cell.CellReference.Value, cellReference, true) > 0)
+ {
+ refCell = cell;
+ break;
+ }
+ }
+ }
+ newCell = new Cell() { CellReference = cellReference };
+ row.InsertBefore(newCell, refCell);
+ }
+ newCell.CellValue = new CellValue(text);
+ newCell.DataType = CellValues.String;
+ newCell.StyleIndex = (uint)styleIndex;
+ }
+
+ private static string GetExcelColumnName(int columnNumber)
+ {
+ columnNumber += 1;
+ int dividend = columnNumber;
+ string columnName = string.Empty;
+ int modulo;
+ while (dividend > 0)
+ {
+ modulo = (dividend - 1) % 26;
+ columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
+ dividend = (dividend - modulo) / 26;
+ }
+ return columnName;
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Reports/PdfBuilder.cs b/CarpentryWorkshop/CarpentryWorkshop/Reports/PdfBuilder.cs
new file mode 100644
index 0000000..104b3e5
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Reports/PdfBuilder.cs
@@ -0,0 +1,76 @@
+using MigraDoc.DocumentObjectModel;
+using MigraDoc.DocumentObjectModel.Shapes.Charts;
+using MigraDoc.Rendering;
+using System.Text;
+
+namespace CarpentryWorkshop.Reports;
+
+internal class PdfBuilder
+{
+ private readonly string _filePath;
+ private readonly Document _document;
+
+ public PdfBuilder(string filePath)
+ {
+ if (string.IsNullOrWhiteSpace(filePath))
+ {
+ throw new ArgumentNullException(nameof(filePath));
+ }
+ if (File.Exists(filePath))
+ {
+ File.Delete(filePath);
+ }
+ _filePath = filePath;
+ _document = new Document();
+ DefineStyles();
+ }
+
+ public PdfBuilder AddHeader(string header)
+ {
+ _document.AddSection().AddParagraph(header, "NormalBold");
+ return this;
+ }
+
+ public PdfBuilder AddPieChart(string title, List<(string Caption, double Value)> data)
+ {
+ if (data == null || data.Count == 0)
+ {
+ return this;
+ }
+ var chart = new Chart(ChartType.Pie2D);
+ var series = chart.SeriesCollection.AddSeries();
+ series.Add(data.Select(x => x.Value).ToArray());
+ var xseries = chart.XValues.AddXSeries();
+ xseries.Add(data.Select(x => x.Caption).ToArray());
+ chart.DataLabel.Type = DataLabelType.Percent;
+ chart.DataLabel.Position = DataLabelPosition.OutsideEnd;
+ chart.Width = Unit.FromCentimeter(16);
+ chart.Height = Unit.FromCentimeter(12);
+ chart.TopArea.AddParagraph(title);
+ chart.XAxis.MajorTickMark = TickMarkType.Outside;
+ chart.YAxis.MajorTickMark = TickMarkType.Outside;
+ chart.YAxis.HasMajorGridlines = true;
+ chart.PlotArea.LineFormat.Width = 1;
+ chart.PlotArea.LineFormat.Visible = true;
+ chart.TopArea.AddLegend();
+ _document.LastSection.Add(chart);
+ return this;
+ }
+
+ public void Build()
+ {
+ Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
+ var renderer = new PdfDocumentRenderer(true)
+ {
+ Document = _document
+ };
+ renderer.RenderDocument();
+ renderer.PdfDocument.Save(_filePath);
+ }
+ private void DefineStyles()
+ {
+ var headerStyle = _document.Styles.AddStyle("NormalBold", "Normal");
+ headerStyle.Font.Bold = true;
+ headerStyle.Font.Size = 14;
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Reports/TableReport.cs b/CarpentryWorkshop/CarpentryWorkshop/Reports/TableReport.cs
new file mode 100644
index 0000000..7151eba
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Reports/TableReport.cs
@@ -0,0 +1,62 @@
+using CarpentryWorkshop.Repositories;
+using Microsoft.Extensions.Logging;
+using System.Linq;
+
+namespace CarpentryWorkshop.Reports;
+
+internal class TableReport
+{
+ private readonly IMaterialReplenishmentRepository _materialReplenishmentRepository;
+ private readonly IMaterialRepository _materialRepository;
+ private readonly IOrderMaterialsRepository _orderMaterialsRepository;
+ private readonly ILogger _logger;
+ internal static readonly string[] item = ["Дата", "Количество пришло", "Количество ушло"];
+
+ public TableReport(IMaterialReplenishmentRepository materialrepRepository,
+ IMaterialRepository materialRepository, IOrderMaterialsRepository orderMaterialsRepository, ILogger logger)
+ {
+ _materialReplenishmentRepository = materialrepRepository ?? throw new ArgumentNullException(nameof(materialrepRepository));
+ _materialRepository = materialRepository ?? throw new ArgumentNullException(nameof(materialRepository));
+ _orderMaterialsRepository = orderMaterialsRepository ?? throw new ArgumentNullException(nameof(materialRepository));
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ }
+
+ public bool CreateTable(string filePath, int materialId, DateTime startDate, DateTime endDate)
+ {
+ try
+ {
+ new ExcelBuilder(filePath)
+ .AddHeader("Сводка по движению материала", 0, 3)
+ .AddParagraph("за период", 0)
+ .AddTable([10, 15, 15], GetData(materialId, startDate, endDate))
+ .Build();
+ return true;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Ошибка при формировании документа");
+ return false;
+ }
+ }
+
+ private List GetData(int materialId, DateTime startDate, DateTime endDate)
+ {
+ var data = _materialReplenishmentRepository
+ .ReadMaterialsSpent()
+ .Where(x => x.DateReplenishment >= startDate && x.DateReplenishment <= endDate && x.Name == _materialRepository.ReadMaterialById(materialId).Name)
+ .Select(x => new { Date = x.DateReplenishment, CountIn = (int?)x.Count, CountOut = (int?)null })
+ .Union(
+ _orderMaterialsRepository
+ .ReadOrders(materialId)
+ .Where(x => x.DataOrder >= startDate && x.DataOrder <= endDate)
+ .Select(x => new { Date = x.DataOrder, CountIn = (int?)null, CountOut = (int?)x.Count }))
+ .OrderBy(x => x.Date);
+ return new List() { item }
+ .Union(
+ data
+ .Select(x => new string[] {x.Date.ToString(), x.CountIn?.ToString() ?? string.Empty, x.CountOut?.ToString() ?? string.Empty}))
+ .Union(
+ [["Всего", data.Sum(x => x.CountIn ?? 0).ToString(), data.Sum(x => x.CountOut ?? 0).ToString()]])
+ .ToList();
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Reports/WordBuilder.cs b/CarpentryWorkshop/CarpentryWorkshop/Reports/WordBuilder.cs
new file mode 100644
index 0000000..7c965fe
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Reports/WordBuilder.cs
@@ -0,0 +1,102 @@
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+
+namespace CarpentryWorkshop.Reports;
+
+internal class WordBuilder
+{
+ private readonly string _filePath;
+ private readonly Document _document;
+ private readonly Body _body;
+
+ public WordBuilder(string filePath)
+ {
+ if (string.IsNullOrWhiteSpace(filePath))
+ {
+ throw new ArgumentNullException(nameof(filePath));
+ }
+ if (File.Exists(filePath))
+ {
+ File.Delete(filePath);
+ }
+ _filePath = filePath;
+ _document = new Document();
+ _body = _document.AppendChild(new Body());
+ }
+
+ public WordBuilder AddHeader(string header)
+ {
+ var paragraph = _body.AppendChild(new Paragraph());
+ var run = paragraph.AppendChild(new Run());
+ var runProperties = run.AppendChild(new RunProperties());
+ runProperties.AppendChild(new Bold());
+ run.AppendChild(new Text(header));
+ return this;
+ }
+
+ public WordBuilder AddParagraph(string text)
+ {
+ var paragraph = _body.AppendChild(new Paragraph());
+ var run = paragraph.AppendChild(new Run());
+ run.AppendChild(new Text(text));
+ return this;
+ }
+
+ public WordBuilder AddTable(int[] widths, List data)
+ {
+ if (widths == null || widths.Length == 0)
+ {
+ throw new ArgumentNullException(nameof(widths));
+ }
+ if (data == null || data.Count == 0)
+ {
+ throw new ArgumentNullException(nameof(data));
+ }
+ if (data.Any(x => x.Length != widths.Length))
+ {
+ throw new InvalidOperationException("widths.Length != data.Length");
+ }
+
+ var table = new Table();
+ table.AppendChild(new TableProperties(
+ new TableBorders(
+ new TopBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 },
+ new BottomBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 },
+ new LeftBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 },
+ new RightBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 },
+ new InsideHorizontalBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 },
+ new InsideVerticalBorder() { Val = new EnumValue(BorderValues.Single), Size = 12 }
+ )
+ ));
+
+ // Заголовок
+ var tr = new TableRow();
+ for (var j = 0; j < widths.Length; ++j)
+ {
+ tr.Append(new TableCell(
+ new TableCellProperties(new TableCellWidth()
+ {
+ Width =
+ widths[j].ToString()
+ }),
+ new Paragraph(new Run(new RunProperties(new Bold()), new
+ Text(data.First()[j])))));
+ }
+ table.Append(tr);
+
+ // Данные
+ table.Append(data.Skip(1).Select(x =>
+ new TableRow(x.Select(y => new TableCell(new Paragraph(new
+ Run(new Text(y))))))));
+ _body.Append(table);
+ return this;
+ }
+
+ public void Build()
+ {
+ using var wordDocument = WordprocessingDocument.Create(_filePath, WordprocessingDocumentType.Document);
+ var mainPart = wordDocument.AddMainDocumentPart();
+ mainPart.Document = _document;
+ }
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Repositories/IOrderMaterialsRepository.cs b/CarpentryWorkshop/CarpentryWorkshop/Repositories/IOrderMaterialsRepository.cs
new file mode 100644
index 0000000..a66342c
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Repositories/IOrderMaterialsRepository.cs
@@ -0,0 +1,8 @@
+using CarpentryWorkshop.Entities;
+
+namespace CarpentryWorkshop.Repositories;
+
+public interface IOrderMaterialsRepository
+{
+ IEnumerable ReadOrders(int id);
+}
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Repositories/Implementations/OrderMaterialsRepository.cs b/CarpentryWorkshop/CarpentryWorkshop/Repositories/Implementations/OrderMaterialsRepository.cs
new file mode 100644
index 0000000..71f1660
--- /dev/null
+++ b/CarpentryWorkshop/CarpentryWorkshop/Repositories/Implementations/OrderMaterialsRepository.cs
@@ -0,0 +1,35 @@
+using CarpentryWorkshop.Entities;
+using Dapper;
+using Microsoft.Extensions.Logging;
+using Newtonsoft.Json;
+using Npgsql;
+
+namespace CarpentryWorkshop.Repositories.Implementations;
+
+public class OrderMaterialsRepository : IOrderMaterialsRepository
+{
+ private readonly IConnectionString _connectionString;
+ private readonly ILogger _logger;
+
+ public OrderMaterialsRepository(IConnectionString connectionString, ILogger logger)
+ {
+ _connectionString = connectionString;
+ _logger = logger;
+ }
+
+ public IEnumerable ReadOrders(int matid)
+ {
+ using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
+ var querySelect = @"
+ SELECT orders.*, materials.id AS materialid, pm.count*op.count AS count
+ FROM orders
+ INNER JOIN orders_products AS op ON orders.id = op.orderid
+ INNER JOIN products ON op.productid = products.id
+ INNER JOIN products_materials AS pm ON products.id = pm.productid
+ INNER JOIN materials ON pm.materialid = materials.id
+ Where materials.id = @matid";
+ var orderMaterials = connection.Query(querySelect, new { matid });
+ _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(orderMaterials));
+ return orderMaterials;
+ }
+}
--
2.25.1
From f2544270a71d69ed82bdb6b2def3d5b3d9ed683b Mon Sep 17 00:00:00 2001
From: IlyasValiulov
Date: Mon, 25 Nov 2024 09:18:27 +0400
Subject: [PATCH 2/2] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?=
=?UTF-8?q?=D0=BF=D0=BE=203=20=D0=BB=D0=B0=D0=B1=D0=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs b/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs
index bebc63b..a60112a 100644
--- a/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs
+++ b/CarpentryWorkshop/CarpentryWorkshop/Entities/TempOrder.cs
@@ -1,6 +1,4 @@
-using CarpentryWorkshop.Entities.Enums;
-
-namespace CarpentryWorkshop.Entities;
+namespace CarpentryWorkshop.Entities;
public class TempOrder
{
--
2.25.1
| |