using iTextSharp.text.pdf;
using iTextSharp.text;
using Sessioa.BaseModel;
using Sessioa.Classes;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Win32;
using System.Drawing;
using System.Windows.Documents;
using System.Data.Entity;
namespace Sessioa.Pages
{
///
/// Логика взаимодействия для OrderCard.xaml
///
public partial class OrderCard : Page
{
List products = (List)Application.Current.Properties["ListOrderUser"];
List points = BaseClass.C_Base.PointsOfIssue.ToList();
List statesOrder = BaseClass.C_Base.StatusOrder.ToList();
Dictionary keyValuePairs = (Dictionary)(Application.Current.Properties["ListOrderCountUser"]);
User user = null;
Order orderEdit = null;
bool state = false;
public OrderCard(User userSign)
{
InitializeComponent();
user = userSign;
LB_ProductsOrder.ItemsSource = products;
OrderTitle.Text = $"Заказ #{BaseClass.C_Base.Order.OrderByDescending(x => x.OrderID).First().OrderID + 1}";
if (keyValuePairs != null)
{
if (keyValuePairs.Count == 0)
{
foreach (Product product in products)
{
keyValuePairs.Add($"{product.ProductArticleNumber}", 1);
}
}
}
else
{
foreach (Product product in products)
{
try
{
keyValuePairs.Add($"{product.ProductArticleNumber}", 1);
}
catch { }
}
}
CB_Punkt.ItemsSource = points;
CB_Punkt.DisplayMemberPath = "PointName";
CB_Punkt.SelectedValuePath = "PointID";
ItogoSkidka();
}
public OrderCard(User userSign, int order_ID)
{
InitializeComponent();
state = true;
user = userSign;
if (user.UserRole < 2)
{
B_Save.Visibility = Visibility.Collapsed;
}
orderEdit = BaseClass.C_Base.Order.FirstOrDefault(x => x.OrderID == order_ID);
OrderTitle.Text = $"Заказ #{orderEdit.OrderID}";
if (orderEdit != null)
{
foreach (OrderProduct op in BaseClass.C_Base.OrderProduct.Where(x => x.OrderID == orderEdit.OrderID).ToList())
{
products.Add(op.Product);
try
{
keyValuePairs.Add($"{op.Product.ProductArticleNumber}", op.ProductCount);
}
catch { }
}
}
LB_ProductsOrder.ItemsSource = products;
B_Save.Content = "Сохранить";
CB_Punkt.Visibility = Visibility.Collapsed;
TB_Punkt.Visibility = Visibility.Visible;
TB_Punkt.Text = $"{points[orderEdit.OrderPickupPoint - 1].PointName}";
StateOrder.ItemsSource = statesOrder;
StateOrder.DisplayMemberPath = "StatusTitle";
StateOrder.SelectedValuePath = "StatusId";
StateOrder.SelectedItem = statesOrder[BaseClass.C_Base.Order.FirstOrDefault(x => x.OrderID == order_ID).OrderStatus - 1];
if (orderEdit.OrderDeliveryDate != null)
DP_Order.SelectedDate = orderEdit.OrderDeliveryDate;
OrderCode.Text = $"Код выдачи: {orderEdit.IssueCode}";
ItogoSkidka();
}
private void countPr_Loaded(object sender, RoutedEventArgs e)
{
TextBlock textBlock = (TextBlock)sender;
Product product = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == textBlock.Uid);
if (product.ProductDiscountAmount != null)
textBlock.TextDecorations = TextDecorations.Strikethrough;
}
private void countDPr_Loaded(object sender, RoutedEventArgs e)
{
TextBlock textBlock = (TextBlock)sender;
Product product = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == textBlock.Uid);
if (product.ProductDiscountAmount != null)
{
textBlock.Visibility = Visibility.Visible;
textBlock.Text = $" {(double)(product.ProductCost - product.ProductCost * product.ProductDiscountAmount / 100)} ₽";
}
}
private void Discount_Loaded(object sender, RoutedEventArgs e)
{
TextBlock textBlock = (TextBlock)sender;
Product product = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == textBlock.Uid);
if (product.ProductDiscountAmount != null)
{
textBlock.Visibility = Visibility.Visible;
textBlock.Text = $"Скидка {product.ProductDiscountAmount}%";
}
}
private void B_Back_Click(object sender, RoutedEventArgs e)
{
if (state == false)
{
Application.Current.Properties["ListOrderCountUser"] = keyValuePairs;
FrameClass.C_Frame.Navigate(new ProductsPage(user));
}
else
{
Application.Current.Properties["ListOrderCountUser"] = new Dictionary();
Application.Current.Properties["ListOrderUser"] = new List();
FrameClass.C_Frame.Navigate(new OrderNew(user));
}
}
public static string filePath = "";
private void B_Save_Click(object sender, RoutedEventArgs e)
{
if (state == false)
{
Application.Current.Properties["ListOrderUser"] = new List();
Application.Current.Properties["ListOrderCountUser"] = new Dictionary();
if (CB_Punkt.SelectedIndex == -1)
MessageBox.Show("Выберите пункт выдачи.", "Предупреждение", MessageBoxButton.OK, MessageBoxImage.Warning);
else
{
try
{
Random rnd = new Random();
int code = rnd.Next(100, 999);
Order newOrder = new Order()
{
//OrderID = BaseClass.C_Base.Order.OrderByDescending(x => x.OrderID).FirstOrDefault().OrderID + 1,
OrderStatus = 2,
OrderDate = DateTime.Now,
OrderPickupPoint = ((PointsOfIssue)CB_Punkt.SelectedItem).PointID,
UserID = user.UserID,
IssueCode = code
};
BaseClass.C_Base.Order.Add(newOrder);
BaseClass.C_Base.SaveChanges();
foreach (KeyValuePair pair in keyValuePairs)
{
OrderProduct op = new OrderProduct()
{
OrderID = newOrder.OrderID,
ProductArticleNumber = pair.Key,
ProductCount = pair.Value
};
BaseClass.C_Base.OrderProduct.Add(op);
}
BaseClass.C_Base.SaveChanges();
MessageBoxResult res = MessageBox.Show($"Заказ оформлен. Код для выдачи: {code}. Отследить заказ можно в разделе \"Заказы\" на странице товаров.\nСохранить чек в pdf?", "Уведомление", MessageBoxButton.YesNo, MessageBoxImage.Information);
if (res == MessageBoxResult.Yes)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.FileName = $"Талон #{newOrder.OrderID}.pdf";
dlg.DefaultExt = ".pdf";
dlg.Filter = "PDF documents (.pdf)|*.pdf";
if (dlg.ShowDialog() == true)
{
try
{
decimal itogoBezSkidki = 0;
decimal itogoSoSkidkoy = 0;
List tmpOP = BaseClass.C_Base.OrderProduct.Where(x => x.OrderID == newOrder.OrderID).ToList();
foreach (OrderProduct opItem in tmpOP)
{
Product prAdd = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == opItem.ProductArticleNumber);
itogoBezSkidki += prAdd.ProductCost * opItem.ProductCount;
if (prAdd.ProductDiscountAmount != null && prAdd.ProductDiscountAmount != 0)
{
itogoSoSkidkoy += (prAdd.ProductCost - (prAdd.ProductCost * ((decimal)prAdd.ProductDiscountAmount / 100))) * opItem.ProductCount;
}
else
itogoSoSkidkoy += prAdd.ProductCost * opItem.ProductCount;
}
newOrder.Cost = itogoSoSkidkoy;
newOrder.Discount = Math.Round((1 - (itogoSoSkidkoy / itogoBezSkidki)) * 100, 2);
filePath = dlg.FileName;
Document document = new Document();
document.AddLanguage("ru-RU");
PdfWriter.GetInstance(document, new FileStream(filePath, FileMode.Create));
document.Open();
BaseFont baseFont = BaseFont.CreateFont("C:\\Windows\\Fonts\\Arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
iTextSharp.text.Font font = new iTextSharp.text.Font(baseFont, iTextSharp.text.Font.DEFAULTSIZE, iTextSharp.text.Font.NORMAL); //чтобы не было проблем с русскими символами
document.Add(new iTextSharp.text.Paragraph($"Заказ #{newOrder.OrderID}", font));
document.Add(new iTextSharp.text.Paragraph($"Дата заказа: {newOrder.OrderDate}", font));
document.Add(new iTextSharp.text.Paragraph($"\nСостав заказа:", font));
List op = BaseClass.C_Base.OrderProduct.Include(x => x.Product).Where(x => x.OrderID == newOrder.OrderID).ToList();
int i = 1;
foreach (OrderProduct opItem in op)
{
document.Add(new iTextSharp.text.Paragraph($"{i}. " + opItem.ToString(), font));
i++;
}
document.Add(new iTextSharp.text.Paragraph($"Общая скидка: {newOrder.Discount}%", font));
document.Add(new iTextSharp.text.Paragraph($"Стоимость заказа: {Math.Round(newOrder.Cost, 2)} руб.", font));
document.Add(new iTextSharp.text.Paragraph($"Пункт выдачи: {BaseClass.C_Base.PointsOfIssue.FirstOrDefault(x=>x.PointID == newOrder.OrderPickupPoint).PointName}", font));
document.Add(new iTextSharp.text.Paragraph($"Код выдачи: {newOrder.IssueCode}", font));
document.Close();
MessageBox.Show("Документ сохранен", "Уведомление", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch
{
MessageBox.Show("Не удалось сохранить документ", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
FrameClass.C_Frame.Navigate(new ProductsPage(user));
}
catch
{
MessageBoxResult res = MessageBox.Show("что-то сломалось.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
else
{
orderEdit.OrderStatus = ((StatusOrder)StateOrder.SelectedItem).StatusId;
if (DP_Order.SelectedDate != null)
orderEdit.OrderDeliveryDate = DP_Order.SelectedDate;
BaseClass.C_Base.SaveChanges();
MessageBoxResult res = MessageBox.Show("Изменения внесены.", "Уведомление", MessageBoxButton.OK, MessageBoxImage.Information);
FrameClass.C_Frame.Navigate(new OrderNew(user));
}
}
private void Back_B_Click(object sender, RoutedEventArgs e)
{
Button bBack = (Button)sender;
Grid grid = (Grid)bBack.Parent;
TextBlock textBlock = (TextBlock)grid.FindName("CountProduct");
Product pr = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == bBack.Uid);
if (pr != null)
{
foreach (KeyValuePair pair in keyValuePairs)
{
if (pair.Key == bBack.Uid)
{
if (pair.Value > 1)
{
keyValuePairs[pair.Key]--;
textBlock.Text = keyValuePairs[pair.Key].ToString();
break;
}
}
}
}
ItogoSkidka();
}
private void Next_B_Click(object sender, RoutedEventArgs e)
{
Button bNext = (Button)sender;
Grid grid = (Grid)bNext.Parent;
TextBlock textBlock = (TextBlock)grid.FindName("CountProduct");
Product pr = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == bNext.Uid);
if (pr != null)
{
foreach (KeyValuePair pair in keyValuePairs)
{
if (pair.Key == bNext.Uid)
{
keyValuePairs[pair.Key]++;
textBlock.Text = keyValuePairs[pair.Key].ToString();
break;
}
}
}
ItogoSkidka();
}
private void CountProduct_Loaded(object sender, RoutedEventArgs e)
{
TextBlock tb = (TextBlock)sender;
if (keyValuePairs.Count > 0)
{
foreach (KeyValuePair pair in keyValuePairs)
{
if (pair.Key == tb.Uid)
{
tb.Text = keyValuePairs[pair.Key].ToString();
break;
}
}
}
}
public void ItogoSkidka()
{
decimal itogoBezSkidki = 0;
foreach (Product item in products)
{
foreach (KeyValuePair pair in keyValuePairs)
{
if (pair.Key == item.ProductArticleNumber)
{
itogoBezSkidki += item.ProductCost * pair.Value;
}
}
}
decimal itogoSoSkidkoy = 0;
foreach (Product item in products)
{
foreach (KeyValuePair pair in keyValuePairs)
{
if (pair.Key == item.ProductArticleNumber)
{
if (item.ProductDiscountAmount != null)
{
itogoSoSkidkoy += (item.ProductCost - (item.ProductCost * ((decimal)item.ProductDiscountAmount / 100))) * pair.Value;
}
else
itogoSoSkidkoy += item.ProductCost * pair.Value;
}
}
}
decimal ITOGO = Math.Round((1 - (itogoSoSkidkoy / itogoBezSkidki)) * 100, 2);
TB_ItogoSkidka.Text = $"Скидка {ITOGO}%";
TB_Itogo.Text = $"{(double)itogoSoSkidkoy} ₽";
}
private void SP_EditOrder_Loaded(object sender, RoutedEventArgs e)
{
StackPanel sp = (StackPanel)sender;
if (state == false || user.UserRole < 2)
sp.Visibility = Visibility.Collapsed;
}
private void Back_B_Loaded(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
if (state == true)
btn.Visibility = Visibility.Collapsed;
}
private void Next_B_Loaded(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
if (state == true)
btn.Visibility = Visibility.Collapsed;
}
private void OrderCode_Loaded(object sender, RoutedEventArgs e)
{
TextBlock tb = (TextBlock)sender;
if (state == false)
tb.Visibility = Visibility.Collapsed;
}
private void DelProduct_Click(object sender, RoutedEventArgs e)
{
foreach (KeyValuePair item in keyValuePairs)
{
Product tmp = BaseClass.C_Base.Product.FirstOrDefault(x => x.ProductArticleNumber == ((Product)LB_ProductsOrder.SelectedItem).ProductArticleNumber);
if (item.Key == tmp.ProductArticleNumber)
{
keyValuePairs.Remove(item.Key);
products.Remove(tmp);
break;
}
}
LB_ProductsOrder.ItemsSource = null;
LB_ProductsOrder.ItemsSource = products;
}
}
}