aboutsummaryrefslogtreecommitdiff
path: root/src/PriceListTools/PriceListTool.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/PriceListTools/PriceListTool.cs')
-rw-r--r--src/PriceListTools/PriceListTool.cs195
1 files changed, 195 insertions, 0 deletions
diff --git a/src/PriceListTools/PriceListTool.cs b/src/PriceListTools/PriceListTool.cs
new file mode 100644
index 0000000..9d898e7
--- /dev/null
+++ b/src/PriceListTools/PriceListTool.cs
@@ -0,0 +1,195 @@
+using ExcelDna.Integration;
+using Microsoft.Office.Interop.Excel;
+using System;
+using System.Collections.Generic;
+using System.Windows.Forms;
+using Application = Microsoft.Office.Interop.Excel.Application;
+
+namespace RehauSku.PriceListTools
+{
+ internal abstract class PriceListTool
+ {
+ protected private Application ExcelApp = (Application)ExcelDnaUtil.Application;
+ protected private Target TargetFile;
+ protected private List<KeyValuePair<Position, double>> Missing;
+
+ public void OpenNewPrice()
+ {
+ Workbook wb = ExcelApp.Workbooks.Open(RegistryUtil.PriceListPath);
+
+ try
+ {
+ TargetFile = new Target(wb);
+ }
+
+ catch (Exception ex)
+ {
+ MessageBox.Show
+ (ex.Message,
+ "Ошибка открытия шаблонного прайс-листа",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ wb.Close();
+ throw ex;
+ }
+ }
+
+ protected private void FillColumnsWithDictionary(IEnumerable<KeyValuePair<Position, double>> dictionary, params int[] columns)
+ {
+ Missing = new List<KeyValuePair<Position, double>>();
+
+ foreach (var positionAmount in dictionary)
+ {
+ FillPositionAmountToColumns(positionAmount, columns);
+ }
+
+ if (Missing.Count > 0)
+ {
+ DialogResult result =
+ MessageBox.Show
+ ($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath} Попробовать найти новый вариант?",
+ "Отсутствует позиция в конечной таблице заказов",
+ MessageBoxButtons.YesNo,
+ MessageBoxIcon.Information);
+
+ if (result == DialogResult.Yes)
+ {
+ var lookUp = new List<KeyValuePair<Position, double>>(Missing);
+
+ foreach (var missingPosition in lookUp)
+ {
+ TryFillVariantlessSkuToColumns(missingPosition, columns);
+ }
+ }
+ }
+
+ if (Missing.Count > 0)
+ {
+ FillMissing();
+ MessageBox.Show
+ ($"{Missing.Count} артикулов отсутствует в таблице заказов {RegistryUtil.PriceListPath}\n" +
+ $"Под основной таблицей составлен список не найденных артикулов",
+ "Отсутствует позиция в конечной таблице заказов",
+ MessageBoxButtons.OK,
+ MessageBoxIcon.Information);
+ }
+ }
+
+ protected private void FillPositionAmountToColumns(KeyValuePair<Position, double> positionAmount, int[] columns)
+ {
+ Range foundCell = TargetFile.skuCell.EntireColumn.Find(positionAmount.Key.Sku);
+
+ if (foundCell == null)
+ {
+ Missing.Add(positionAmount);
+ return;
+ }
+
+ string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
+
+ while (foundCell != null && foundCellGroup != positionAmount.Key.Group)
+ {
+ foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
+ foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
+ }
+
+ if (foundCell == null)
+ {
+ Missing.Add(positionAmount);
+ }
+
+ else
+ {
+ foreach (var column in columns)
+ {
+ Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
+
+ if (sumCell.Value2 == null)
+ {
+ sumCell.Value2 = positionAmount.Value;
+ }
+
+ else
+ {
+ sumCell.Value2 += positionAmount.Value;
+ }
+ }
+ }
+ }
+
+ protected private void TryFillVariantlessSkuToColumns(KeyValuePair<Position, double> positionAmount, int[] columns)
+ {
+ string sku = positionAmount.Key.Sku.Substring(1, 6);
+
+ Range foundCell = TargetFile.skuCell.EntireColumn.Find(sku);
+
+ if (foundCell == null)
+ {
+ return;
+ }
+
+ string foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
+
+ while (foundCell != null && foundCellGroup != positionAmount.Key.Group)
+ {
+ foundCell = TargetFile.skuCell.EntireColumn.FindNext(foundCell);
+ foundCellGroup = TargetFile.Sheet.Cells[foundCell.Row, TargetFile.groupCell.Column].Value2.ToString();
+ }
+
+ if (foundCell == null)
+ {
+ return;
+ }
+
+ foreach (var column in columns)
+ {
+ Range sumCell = TargetFile.Sheet.Cells[foundCell.Row, column];
+
+ if (sumCell.Value2 == null)
+ {
+ sumCell.Value2 = positionAmount.Value;
+ }
+
+ else
+ {
+ sumCell.Value2 += positionAmount.Value;
+ }
+ }
+
+ Missing.Remove(positionAmount);
+ }
+
+ protected private void FillMissing()
+ {
+ int startRow =
+ TargetFile.Sheet.AutoFilter.Range.Row +
+ TargetFile.Sheet.AutoFilter.Range.Rows.Count + 5;
+
+ for (int i = 0; i < Missing.Count; i++)
+ {
+ Range group = TargetFile.Sheet.Cells[startRow + i, TargetFile.groupCell.Column];
+ Range sku = TargetFile.Sheet.Cells[startRow + i, TargetFile.skuCell.Column];
+ Range name = TargetFile.Sheet.Cells[startRow + i, TargetFile.nameCell.Column];
+ Range amount = TargetFile.Sheet.Cells[startRow + i, TargetFile.amountCell.Column];
+
+ group.Value2 = Missing[i].Key.Group;
+ sku.Value2 = Missing[i].Key.Sku;
+ name.Value2 = Missing[i].Key.Name;
+ amount.Value2 = Missing[i].Value;
+
+ group.ClearFormats();
+ sku.ClearFormats();
+ name.ClearFormats();
+ amount.ClearFormats();
+ }
+ }
+
+ protected private void FilterByAmount()
+ {
+ AutoFilter filter = TargetFile.Sheet.AutoFilter;
+
+ filter.Range.AutoFilter(TargetFile.amountCell.Column, "<>");
+ TargetFile.Sheet.Range["A1"].Activate();
+ }
+ }
+} \ No newline at end of file