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)); } } }