JobRequisitionStockSelectionPage.xaml.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. using System.Threading.Tasks;
  7. using System.Windows;
  8. using System.Windows.Controls;
  9. using com.sun.tools.javac.util;
  10. using Comal.Classes;
  11. using InABox.Clients;
  12. using InABox.Core;
  13. using InABox.Wpf;
  14. using javax.swing;
  15. namespace PRSDesktop
  16. {
  17. /// <summary>
  18. /// Interaction logic for JobRequisitionStockSelectionPage.xaml
  19. /// </summary>
  20. public partial class JobRequisitionStockSelectionPage : ThemableWindow
  21. {
  22. ObservableCollection<JobRequistionStockSelectionViewModel> ViewModels = new ObservableCollection<JobRequistionStockSelectionViewModel>();
  23. JobRequisitionItem Item = new JobRequisitionItem();
  24. public Guid EmpID { get; set; }
  25. public Guid IssuingJobID { get; set; }
  26. public bool Requisitioned = false;
  27. public JobRequisitionStockSelectionPage(IEnumerable<StockHolding> holdings, JobRequisitionItem item, Job issuingJob, bool requisitioned = false)
  28. {
  29. InitializeComponent();
  30. Item = item;
  31. IssuingJobID = issuingJob.ID;
  32. jobLbl.Text = "Taking stock from Job: " + issuingJob.Name + " (" + issuingJob.JobNumber + ")";
  33. foreach (var holding in holdings)
  34. {
  35. ViewModels.Add(new JobRequistionStockSelectionViewModel
  36. {
  37. Location = holding.Location.Description,
  38. Area = holding.Location.Area.Description,
  39. Units = holding.Units,
  40. Style = holding.Style.Description,
  41. Holding = holding,
  42. }) ;
  43. }
  44. listView.ItemsSource = ViewModels;
  45. Task.Run(() =>
  46. {
  47. EmpID = new Client<Employee>().Query(new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid), new Columns<Employee>(x => x.ID)).Rows.FirstOrDefault().Get<Employee, Guid>(x => x.ID);
  48. });
  49. if (requisitioned)
  50. {
  51. availableUnitsLbl.Text = "Requisitioned";
  52. listView.IsEnabled = false;
  53. okButton.IsEnabled = false;
  54. }
  55. }
  56. private void SaveButton_Click(object sender, RoutedEventArgs e)
  57. {
  58. var models = ViewModels.Where(x => x.ChosenUnits > 0);
  59. double total = 0;
  60. foreach (var model in models)
  61. {
  62. CreateStockMovements(model);
  63. total = total + model.ChosenUnits;
  64. }
  65. if (Item.Qty > total)
  66. {
  67. SplitLine(Item, total, Item.Qty - total);
  68. }
  69. DialogResult = true;
  70. }
  71. private void CreateStockMovements(JobRequistionStockSelectionViewModel model)
  72. {
  73. StockMovementBatch batch = new StockMovementBatch();
  74. batch.TimeStamp = DateTime.Now;
  75. batch.Type = StockMovementBatchType.Transfer;
  76. batch.Notes = "Requisitioned for Job " + Item.Job.JobNumber;
  77. new Client<StockMovementBatch>().Save(batch, "Created for requisitioning stock");
  78. var issuing = CreateBaseMovement(model, batch.ID);
  79. issuing.Job.ID = IssuingJobID;
  80. issuing.Issued = model.ChosenUnits;
  81. var receiving = CreateBaseMovement(model, batch.ID);
  82. receiving.Job.ID = Item.Job.ID;
  83. receiving.Received = model.ChosenUnits;
  84. receiving.JobRequisitionItem.ID = Item.ID;
  85. new Client<StockMovement>().Save(new StockMovement[] { issuing, receiving }, "Created from Job Requisition Stock Reserve Screen");
  86. }
  87. private StockMovement CreateBaseMovement(JobRequistionStockSelectionViewModel model, Guid batchid)
  88. {
  89. StockMovement mvt = new StockMovement();
  90. mvt.Style.ID = model.Holding.Style.ID;
  91. mvt.Location.ID = model.Holding.Location.ID;
  92. mvt.Dimensions.CopyFrom(model.Holding.Dimensions);
  93. mvt.Batch.ID = batchid;
  94. mvt.Employee.ID = EmpID;
  95. mvt.IsTransfer = true;
  96. mvt.Date = DateTime.Now;
  97. mvt.Product.ID = Item.Product.ID;
  98. return mvt;
  99. }
  100. private void Cancel_Click(object sender, RoutedEventArgs e)
  101. {
  102. DialogResult = false;
  103. }
  104. private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
  105. {
  106. var box = sender as TextBox;
  107. if (!string.IsNullOrWhiteSpace(box.Text))
  108. {
  109. if (double.TryParse(box.Text, out double value) == false)
  110. box.Text = "0";
  111. else
  112. {
  113. var holdingUnits = (box.DataContext as JobRequistionStockSelectionViewModel).Holding.Units;
  114. if (holdingUnits >= value && value >= 0)
  115. (box.DataContext as JobRequistionStockSelectionViewModel).ChosenUnits = value;
  116. else
  117. (box.DataContext as JobRequistionStockSelectionViewModel).ChosenUnits = holdingUnits;
  118. }
  119. }
  120. }
  121. private void All_Clicked(object sender, RoutedEventArgs e)
  122. {
  123. var holdingUnits = ((sender as Button).DataContext as JobRequistionStockSelectionViewModel).Holding.Units;
  124. ((sender as Button).DataContext as JobRequistionStockSelectionViewModel).ChosenUnits = holdingUnits;
  125. }
  126. private void Minus_Click(object sender, RoutedEventArgs e)
  127. {
  128. var model = (sender as Button).DataContext as JobRequistionStockSelectionViewModel;
  129. if (model.ChosenUnits > 0)
  130. model.ChosenUnits--;
  131. }
  132. private void Plus_Click(object sender, RoutedEventArgs e)
  133. {
  134. var holdingUnits = ((sender as Button).DataContext as JobRequistionStockSelectionViewModel).Holding.Units;
  135. var model = (sender as Button).DataContext as JobRequistionStockSelectionViewModel;
  136. if (model.ChosenUnits < holdingUnits)
  137. model.ChosenUnits++;
  138. }
  139. private void SplitLine(JobRequisitionItem item, double oldItemQty, double newItemQty)
  140. {
  141. List<JobRequisitionItem> items = new List<JobRequisitionItem>();
  142. JobRequisitionItem newItem = new JobRequisitionItem();
  143. newItem.Requisition.ID = item.Requisition.ID;
  144. newItem.Status = JobRequisitionItemStatus.NotChecked;
  145. newItem.Requisition.Job.ID = item.Requisition.Job.ID;
  146. newItem.Requisition.Job.JobNumber = item.Requisition.Job.JobNumber;
  147. newItem.Requisition.Job.Name = item.Requisition.Job.Name;
  148. newItem.Job.ID = item.Job.ID;
  149. newItem.Product.ID = item.Product.ID;
  150. newItem.Product.Name = item.Product.Name;
  151. newItem.Product.Code = item.Product.Code;
  152. newItem.Product.Group.ID = item.Product.Group.ID;
  153. newItem.Product.Group.Description = item.Product.Group.Description;
  154. newItem.Dimensions.CopyFrom(item.Dimensions);
  155. newItem.Style.ID = item.Style.ID;
  156. newItem.Style.Description = item.Style.Description;
  157. newItem.Style.Code = item.Style.Code;
  158. newItem.Notes = item.Notes + Environment.NewLine + "Line split from original line when reserving";
  159. item.Notes = newItem.Notes;
  160. item.Qty = oldItemQty;
  161. newItem.Qty = newItemQty;
  162. items.Add(newItem);
  163. items.Add(item);
  164. new Client<JobRequisitionItem>().Save(items, "Split lines from Job Requi Item Review Dashboard");
  165. MessageBox.Show("Requisition Line split due to " + oldItemQty + " stock selected of " + (oldItemQty + newItemQty) + " required.");
  166. }
  167. }
  168. public class JobRequistionStockSelectionViewModel : INotifyPropertyChanged
  169. {
  170. public event PropertyChangedEventHandler? PropertyChanged;
  171. public string Location { get; set; }
  172. public string Area { get; set; }
  173. public string Style { get; set; }
  174. public double Units { get; set; }
  175. private double chosenUnits;
  176. public double ChosenUnits
  177. {
  178. get => chosenUnits;
  179. set
  180. {
  181. chosenUnits = value;
  182. OnPropertyChanged("ChosenUnits");
  183. }
  184. }
  185. public StockHolding Holding { get; set; }
  186. public JobRequistionStockSelectionViewModel()
  187. {
  188. Location = "";
  189. Area = "";
  190. Style = "";
  191. Units = 0;
  192. ChosenUnits = 0;
  193. }
  194. protected virtual void OnPropertyChanged(string propertyName)
  195. {
  196. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  197. }
  198. }
  199. }