using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using com.sun.tools.javac.util;
using Comal.Classes;
using InABox.Clients;
using InABox.Core;
using InABox.Wpf;
using javax.swing;
namespace PRSDesktop
{
///
/// Interaction logic for JobRequisitionStockSelectionPage.xaml
///
public partial class JobRequisitionStockSelectionPage : ThemableWindow
{
ObservableCollection ViewModels = new ObservableCollection();
JobRequisitionItem Item = new JobRequisitionItem();
public Guid EmpID { get; set; }
public Guid IssuingJobID { get; set; }
public bool Requisitioned = false;
public JobRequisitionStockSelectionPage(IEnumerable holdings, JobRequisitionItem item, Job issuingJob, bool requisitioned = false)
{
InitializeComponent();
Item = item;
IssuingJobID = issuingJob.ID;
jobLbl.Text = "Taking stock from Job: " + issuingJob.Name + " (" + issuingJob.JobNumber + ")";
foreach (var holding in holdings)
{
ViewModels.Add(new JobRequistionStockSelectionViewModel
{
Location = holding.Location.Description,
Units = holding.Units,
Style = holding.Style.Description,
Holding = holding,
});
}
listView.ItemsSource = ViewModels;
Task.Run(() =>
{
EmpID = new Client().Query(new Filter(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid), new Columns(x => x.ID)).Rows.FirstOrDefault().Get(x => x.ID);
});
if(requisitioned)
{
availableUnitsLbl.Text = "Requisitioned";
listView.IsEnabled = false;
okButton.IsEnabled = false;
}
}
private void SaveButton_Click(object sender, RoutedEventArgs e)
{
var models = ViewModels.Where(x => x.ChosenUnits > 0);
foreach (var model in models)
CreateStockMovements(model);
DialogResult = true;
}
private void CreateStockMovements(JobRequistionStockSelectionViewModel model)
{
StockMovementBatch batch = new StockMovementBatch();
batch.TimeStamp = DateTime.Now;
batch.Type = StockMovementBatchType.Transfer;
batch.Notes = "Requisitioned for Job " + Item.Job.JobNumber;
new Client().Save(batch, "Created for requisitioning stock");
var issuing = CreateBaseMovement(model, batch.ID);
issuing.Job.ID = IssuingJobID;
issuing.Issued = model.ChosenUnits;
var receiving = CreateBaseMovement(model, batch.ID);
receiving.Job.ID = Item.Job.ID;
receiving.Received = model.ChosenUnits;
receiving.JobRequisitionItem.ID = Item.ID;
new Client().Save(new StockMovement[] { issuing, receiving }, "Created from Job Requisition Stock Reserve Screen");
}
private StockMovement CreateBaseMovement(JobRequistionStockSelectionViewModel model, Guid batchid)
{
StockMovement mvt = new StockMovement();
mvt.Style.ID = model.Holding.Style.ID;
mvt.Location.ID = model.Holding.Location.ID;
mvt.Dimensions.CopyFrom(model.Holding.Dimensions);
mvt.Batch.ID = batchid;
mvt.Employee.ID = EmpID;
mvt.IsTransfer = true;
mvt.Date = DateTime.Now;
mvt.Product.ID = Item.Product.ID;
return mvt;
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
DialogResult = false;
}
private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
var box = sender as TextBox;
if (!string.IsNullOrWhiteSpace(box.Text))
{
if (double.TryParse(box.Text, out double value) == false)
box.Text = "0";
else
{
var holdingUnits = (box.DataContext as JobRequistionStockSelectionViewModel).Holding.Units;
if (holdingUnits >= value && value >= 0)
(box.DataContext as JobRequistionStockSelectionViewModel).ChosenUnits = value;
else
(box.DataContext as JobRequistionStockSelectionViewModel).ChosenUnits = holdingUnits;
}
}
}
private void All_Clicked(object sender, RoutedEventArgs e)
{
var holdingUnits = ((sender as Button).DataContext as JobRequistionStockSelectionViewModel).Holding.Units;
((sender as Button).DataContext as JobRequistionStockSelectionViewModel).ChosenUnits = holdingUnits;
}
private void Minus_Click(object sender, RoutedEventArgs e)
{
var model = (sender as Button).DataContext as JobRequistionStockSelectionViewModel;
if (model.ChosenUnits > 0)
model.ChosenUnits--;
}
private void Plus_Click(object sender, RoutedEventArgs e)
{
var holdingUnits = ((sender as Button).DataContext as JobRequistionStockSelectionViewModel).Holding.Units;
var model = (sender as Button).DataContext as JobRequistionStockSelectionViewModel;
if (model.ChosenUnits < holdingUnits)
model.ChosenUnits++;
}
}
public class JobRequistionStockSelectionViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public string Location { get; set; }
public string Style { get; set; }
public double Units { get; set; }
private double chosenUnits;
public double ChosenUnits
{
get => chosenUnits;
set
{
chosenUnits = value;
OnPropertyChanged("ChosenUnits");
}
}
public StockHolding Holding { get; set; }
public JobRequistionStockSelectionViewModel()
{
Location = "";
Style = "";
Units = 0;
ChosenUnits = 0;
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}