using Comal.Classes;
using InABox.Core;
using InABox.Wpf;
using InABox.WPF;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using InABox.Configuration;
using InABox.Clients;
using InABox.DynamicGrid;
namespace PRSDesktop;
public class StockForecastOrderScreenSettings : IGlobalConfigurationSettings
{
public StockForecastOrderingType OrderingType { get; set; } =
StockForecastOrderingType.StockOrder;
public StockForecastOrderingStrategy OrderingStrategy { get; set; } =
StockForecastOrderingStrategy.LowestOverallPrice;
}
///
/// Interaction logic for StockForecastOrderScreen.xaml
///
public partial class StockForecastOrderScreen : Window, INotifyPropertyChanged
{
private StockForecastOrderScreenSettings settings;
private bool _canSave;
public bool CanSave
{
get => _canSave;
set
{
_canSave = true;
OnPropertyChanged();
}
}
public StockForecastOrderingType OrderType
{
get => Grid.OrderType;
set => Grid.OrderType = value;
}
public StockForecastOrderingStrategy Strategy
{
get => Grid.OrderStrategy;
set => Grid.OrderStrategy = value;
}
public StockForecastCombineMode CombineMode
{
get => Grid.CombineMode;
set => Grid.CombineMode = value;
}
public IEnumerable Results => Grid.Results;
public StockForecastOrderScreen(List items, bool allowstockOrder = true)
{
settings = new GlobalConfiguration().Load();
InitializeComponent();
if (allowstockOrder)
{
OrderType = settings.OrderingType;
OrderTypeBox.ItemsSource = Enum.GetValues()
.Select(x => new KeyValuePair(x, CoreUtils.Neatify(x.ToString())));
OrderTypeBox.SelectedValuePath = "Key";
OrderTypeBox.DisplayMemberPath = "Value";
OrderTypeBox.VerticalContentAlignment = VerticalAlignment.Center;
OrderTypeBox.Bind(ComboBox.SelectedValueProperty, this, x => x.OrderType);
}
else
{
OrderType = StockForecastOrderingType.Breakup;
OrderTypeBox.Visibility = System.Windows.Visibility.Collapsed;
OrderTypeLabel.Visibility = System.Windows.Visibility.Collapsed;
}
Strategy = settings.OrderingStrategy;
OrderStrategyBox.ItemsSource = Enum.GetValues()
.Select(x => new KeyValuePair(x, CoreUtils.Neatify(x.ToString())));
OrderStrategyBox.SelectedValuePath = "Key";
OrderStrategyBox.DisplayMemberPath = "Value";
OrderStrategyBox.VerticalContentAlignment = VerticalAlignment.Center;
OrderStrategyBox.Bind(ComboBox.SelectedValueProperty, this, x => x.Strategy);
CombineModeBox.ItemsSource = Enum.GetValues()
.Select(x => new KeyValuePair(x, CoreUtils.Neatify(x.ToString())));
CombineModeBox.SelectedValuePath = "Key";
CombineModeBox.DisplayMemberPath = "Value";
CombineModeBox.VerticalContentAlignment = VerticalAlignment.Center;
CombineModeBox.Bind(ComboBox.SelectedValueProperty, this, x => x.CombineMode);
Grid.OrderData = items;
Grid.Refresh(true, true);
}
private void CancelButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
Close();
}
private void OKButton_Click(object sender, RoutedEventArgs e)
{
DialogResult = true;
Close();
}
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private void Grid_OnChanged(object sender, EventArgs e)
{
CanSave = Grid.TotalQuantity > 0;
}
private void OrderTypeBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (Grid.OrderData == null)
return;
settings.OrderingType = (StockForecastOrderingType)OrderTypeBox.SelectedValue;
new GlobalConfiguration().Save(settings);
}
private void OrderStrategyBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (Grid.OrderData == null)
return;
settings.OrderingStrategy = (StockForecastOrderingStrategy)OrderStrategyBox.SelectedValue;
new GlobalConfiguration().Save(settings);
}
public void CreateOrders(string screenName)
{
var orders = new List>>();
Progress.ShowModal("Creating Orders", progress =>
{
int iOrder = 1;
foreach(var perSupplier in Results.GroupBy(x => x.Supplier.ID))
{
progress.Report($"Creating Orders ({iOrder++}/{Results.ToArray().Length})");
var order = new PurchaseOrder();
order.Description = $"Purchase Order created from {screenName} Screen";
order.RaisedBy.ID = App.EmployeeID;
LookupFactory.DoLookup(order, x => x.SupplierLink, perSupplier.Key);
var orderItems = new Dictionary();
var results = perSupplier.ToArray();
foreach(var item in results)
{
var orderItem = new PurchaseOrderItem();
orderItem.Product.ID = item.Item.Product.ID;
orderItem.Style.ID = item.Item.Style.ID;
orderItem.Job.ID = item.SupplierProduct.Job.ID;
orderItems[item] = orderItem;
}
var jobIDs = orderItems.Values.ToArray(x => new Tuple(x, x.Job.ID));
var productIDs = orderItems.Values.ToArray(x => new Tuple(x, x.Product.ID));
var styleIDs = orderItems.Values.ToArray(x => new Tuple(x, x.Style.ID));
var taxCodeIDs = orderItems.Values.ToArray(x => new Tuple(x, x.TaxCode.ID));
LookupFactory.DoLookups(jobIDs, x => x.Job);
LookupFactory.DoLookups(productIDs, x => x.Product);
LookupFactory.DoLookups(styleIDs, x => x.Style);
LookupFactory.DoLookups(taxCodeIDs, x => x.TaxCode);
foreach(var item in results)
{
var orderItem = orderItems[item];
orderItem.Dimensions.CopyFrom(item.SupplierProduct.Dimensions);
orderItem.Qty = item.Quantity;
orderItem.ForeignCurrencyCost = item.SupplierProduct.ForeignCurrencyPrice;
orderItem.Cost = item.SupplierProduct.CostPrice;
}
orders.Add(new(order, orderItems));
}
progress.Report($"Saving {orders.Count} Orders");
Client.Save(orders.Select(x => x.Item1), $"Created from {screenName} screen");
foreach(var (order, orderItems) in orders)
{
foreach(var pair in orderItems)
pair.Value.PurchaseOrderLink.ID = order.ID;
}
Client.Save(orders.SelectMany(x => x.Item2.Values), $"Created from {screenName} screen");
var allocations = new List();
progress.Report($"Processing Breakups");
foreach(var (order, orderItems) in orders)
{
foreach(var (result, poi) in orderItems)
{
foreach (var breakup in result.Breakups)
{
// Skip the nominated job.
if (breakup.JobID == poi.Job.ID && breakup.JobRequiItemID == Guid.Empty) continue;
var alloc = new PurchaseOrderItemAllocation();
alloc.Item.ID = poi.ID;
alloc.Job.ID = breakup.JobID;
alloc.JobRequisitionItem.ID = breakup.JobRequiItemID;
alloc.Quantity = breakup.Quantity;
allocations.Add(alloc);
}
}
}
if (allocations.Count != 0)
Client.Save(allocations, $"Created from {screenName} Screen");
});
MessageWindow.ShowMessage($"The following orders were created:\n- {string.Join("\n- ",orders.Select(x=>x.Item1.PONumber))}", $"Created {orders.Count} orders");
}
private void StyleSelectButton_Click(object sender, RoutedEventArgs e)
{
var dlg = new MultiSelectDialog(
null,
Columns.None().Add(x => x.ID).Add(x => x.Code),
multiselect: false);
var result = dlg.ShowDialog();
if(result == true)
{
Grid.SetStyle(dlg.Data().ToObjects().First());
}
else if(result == false)
{
Grid.SetStyle(null);
}
}
private void Grid_OnSelectItem(object sender, InABox.DynamicGrid.DynamicGridSelectionEventArgs e)
{
StyleSelectButton.IsEnabled = e.Rows is not null && e.Rows.Length > 0;
}
private void CollapseModeBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
}
}