using BusinessLogics.BusinessLogics;
using Components.NonVisualComponents;
using ComponentsLibrary.NonVisualComponents.HelperModels;
using ComponentsLibrary.NonVisualComponents;
using ComponentsLibrary.VisualComponents;
using ComponentsLibraryNet60.DocumentWithTable;
using ComponentsLibraryNet60.Models;
using Contracts.BindingModels;
using Contracts.BusinessLogicsContracts;
using Contracts.ViewModels;
using DatabaseImplement.Implements;
using Microsoft.Extensions.Logging;
using Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NLog.Extensions.Logging;
namespace WinForms
{
///
/// Реализация интерфейса-соглашения для плагинов
///
public class PluginsConvention : IPluginsConvention
{
///
/// Название плагина
///
public string PluginName => "Orders";
///
/// Визуальный компонент для вывода списка в виде дерева
///
private readonly UserTreeView _userTreeView;
///
/// Бизнес-логика для сущности "Счет"
///
private readonly IOrderLogic _orderLogic;
///
/// Бизнес-логика для сущности "Тип заказа"
///
private readonly IOrderTypeLogic _orderTypeLogic;
///
/// Конструктор
///
public PluginsConvention()
{
_userTreeView = new UserTreeView();
var hierarchy = new List()
{
"Type",
"Sum",
"Id",
"WaiterFullName"
};
_userTreeView.SetHierarchy(hierarchy);
var loggerFactory = LoggerFactory.Create(builder => builder.AddNLog());
var orderLogicLogger = loggerFactory.CreateLogger();
var orderTypeLogicLogger = loggerFactory.CreateLogger();
_orderLogic = new OrderLogic(orderLogicLogger, new OrderStorage());
_orderTypeLogic = new OrderTypeLogic(orderTypeLogicLogger, new OrderTypeStorage());
}
///
/// Получение контрола для вывода набора данных
///
public UserControl GetControl
{
get
{
ReloadData();
return _userTreeView;
}
}
///
/// Получение элемента, выбранного в контроле
///
public PluginsConventionElement GetElement
{
get
{
var order = _userTreeView.GetSelectedObject();
int id = -1;
if (order != null)
{
id = order.Id;
}
byte[] bytes = new byte[16];
BitConverter.GetBytes(id).CopyTo(bytes, 0);
return new PluginsConventionElement { Id = new Guid(bytes) };
}
}
///
/// Получение формы для создания/редактирования объекта
///
///
///
public Form GetForm(PluginsConventionElement element)
{
if (element == null)
{
return new FormOrder(_orderLogic, _orderTypeLogic);
}
if (element.Id.GetHashCode() >= 0)
{
byte[] bytes = element.Id.ToByteArray();
int Id = BitConverter.ToInt32(bytes, 0);
var form = new FormOrder(_orderLogic, _orderTypeLogic);
form.Id = Id;
return form;
}
return null;
}
///
/// Получение формы для работы со справочником
///
///
public Form GetThesaurus()
{
return new FormOrderTypes(_orderTypeLogic);
}
///
/// Удаление элемента
///
///
///
public bool DeleteElement(PluginsConventionElement element)
{
if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
return false;
}
byte[] bytes = element.Id.ToByteArray();
int Id = BitConverter.ToInt32(bytes, 0);
try
{
_orderLogic.Delete(new OrderBindingModel() { Id = Id });
ReloadData();
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
///
/// Обновление набора данных в контроле
///
public void ReloadData()
{
try
{
var orders = _orderLogic.ReadList(null);
if (orders == null)
{
return;
}
foreach (var order in orders)
{
if (string.IsNullOrEmpty(order.Sum))
{
order.Sum = "По акции";
}
_userTreeView.AddObjectToTree(order);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
///
/// Создание простого документа
///
///
///
public bool CreateSimpleDocument(PluginsConventionSaveDocument saveDocument)
{
try
{
var orders = _orderLogic.ReadList(null);
if (orders == null)
{
return false;
}
string title = "Информация по аукционным счетам.";
List rows = new List();
foreach (var order in orders)
{
if (string.IsNullOrEmpty(order.Sum))
{
string row = $"ФИО официанта: {order.WaiterFullName} -- Описание счета: {order.Info}";
rows.Add(row);
}
}
string[] rowsArray = rows.ToArray();
var bigTextComponent = new BigTextComponent();
bigTextComponent.CreateDocument(saveDocument.FileName, title, rowsArray);
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
///
/// Создание документа с настраиваемой таблицей
///
///
///
public bool CreateTableDocument(PluginsConventionSaveDocument saveDocument)
{
try
{
var orders = _orderLogic.ReadList(null);
if (orders == null)
{
return false;
}
foreach (var order in orders)
{
if (string.IsNullOrEmpty(order.Sum))
{
order.Sum = "По акции";
}
}
var componentDocumentWithTableMultiHeaderWord = new ComponentDocumentWithTableMultiHeaderWord();
componentDocumentWithTableMultiHeaderWord.CreateDoc(new ComponentDocumentWithTableHeaderDataConfig
{
FilePath = saveDocument.FileName,
Header = "Информация по счетам.",
ColumnsRowsWidth = new List<(int Column, int Row)>()
{
(5, 5),
(10, 5),
(15, 0),
(15, 0),
},
Headers = new List<(int ColumnIndex, int RowIndex, string Header, string PropertyName)>()
{
(0, 0, "Id", "Id"),
(1, 0, "ФИО официанта", "WaiterFullName"),
(2, 0, "Тип заказа", "Type"),
(3, 0, "Сумма заказа", "Sum")
},
Data = orders,
});
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
///
/// Создание документа с диаграммой
///
///
///
public bool CreateChartDocument(PluginsConventionSaveDocument saveDocument)
{
try
{
var orders = _orderLogic.ReadList(null);
if (orders == null)
{
return false;
}
var orderTypes = _orderTypeLogic.ReadList(null);
if (orderTypes == null)
{
return false;
}
List<(double, string)> items = new List<(double, string)>();
foreach (var orderType in orderTypes)
{
int count = 0;
foreach (var order in orders)
{
if (order.Type == orderType.Name && string.IsNullOrEmpty(order.Sum))
{
count++;
}
}
items.Add((count, orderType.Name));
}
var pdfPieChart = new PdfPieChart();
pdfPieChart.CreatePieChart(new DataForPieChart(saveDocument.FileName, "Информация по оплаченным счетам каждого типа заказов", "Круговая диаграмма", DiagramLegendEnum.Top, "Типы заказов", items));
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
}
}
}