StockSelectionPage.xaml.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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 StockSelectionPage : ThemableWindow
  21. {
  22. ObservableCollection<StockSelectionViewModel> ViewModels = new ObservableCollection<StockSelectionViewModel>();
  23. JobRequisitionItem Item = new JobRequisitionItem();
  24. public Guid EmpID { get; set; }
  25. public Guid IssuingJobID { get; set; }
  26. public bool Allocated = false;
  27. PageMode _mode;
  28. enum PageMode
  29. {
  30. Reservation,
  31. Picking
  32. }
  33. public StockSelectionPage(IEnumerable<StockHolding> holdings, JobRequisitionItem item, Job issuingJob, bool requisitioned = false)
  34. {
  35. InitializeComponent();
  36. _mode = PageMode.Reservation;
  37. Item = item;
  38. IssuingJobID = issuingJob.ID;
  39. jobLbl.Text = "Taking stock from Job: " + issuingJob.Name + " (" + issuingJob.JobNumber + ")";
  40. foreach (var holding in holdings)
  41. {
  42. ViewModels.Add(new StockSelectionViewModel
  43. {
  44. Location = holding.Location.Description,
  45. Area = holding.Location.Area.Description,
  46. Units = holding.Units,
  47. Style = holding.Style.Description,
  48. Holding = holding,
  49. }) ;
  50. }
  51. listView.ItemsSource = ViewModels;
  52. Task.Run(() =>
  53. {
  54. 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);
  55. });
  56. if (requisitioned)
  57. {
  58. availableUnitsLbl.Text = "Allocated";
  59. listView.IsEnabled = false;
  60. okButton.IsEnabled = false;
  61. }
  62. }
  63. private void SaveButton_Click(object sender, RoutedEventArgs e)
  64. {
  65. var models = ViewModels.Where(x => x.ChosenUnits > 0);
  66. double total = 0;
  67. foreach (var model in models)
  68. {
  69. CreateStockMovements(model);
  70. total = total + model.ChosenUnits;
  71. }
  72. if (Item.Qty > total)
  73. {
  74. SplitLine(Item, total, Item.Qty - total);
  75. }
  76. DialogResult = true;
  77. }
  78. private void CreateStockMovements(StockSelectionViewModel model)
  79. {
  80. var batch = new StockMovementBatch
  81. {
  82. TimeStamp = DateTime.Now,
  83. Type = StockMovementBatchType.Transfer,
  84. Notes = "Allocated to Job " + Item.Job.JobNumber
  85. };
  86. new Client<StockMovementBatch>().Save(batch, "Created for requisitioning stock");
  87. var issuing = CreateBaseMovement(model, batch.ID);
  88. issuing.Job.ID = IssuingJobID;
  89. issuing.Issued = model.ChosenUnits;
  90. issuing.Type = StockMovementType.TransferOut;
  91. var receiving = CreateBaseMovement(model, batch.ID);
  92. receiving.Job.ID = Item.Job.ID;
  93. receiving.Received = model.ChosenUnits;
  94. receiving.JobRequisitionItem.ID = Item.ID;
  95. receiving.Type = StockMovementType.TransferIn;
  96. receiving.Transaction = issuing.Transaction;
  97. Client.Save(new StockMovement[] { issuing, receiving }, "Created from Reservation Management Screen");
  98. }
  99. private StockMovement CreateBaseMovement(StockSelectionViewModel model, Guid batchid)
  100. {
  101. var mvt = new StockMovement();
  102. mvt.Style.ID = model.Holding.Style.ID;
  103. mvt.Location.ID = model.Holding.Location.ID;
  104. mvt.Dimensions.CopyFrom(model.Holding.Dimensions);
  105. mvt.Batch.ID = batchid;
  106. mvt.Employee.ID = EmpID;
  107. mvt.IsTransfer = true;
  108. mvt.Date = DateTime.Now;
  109. mvt.Product.ID = Item.Product.ID;
  110. mvt.Notes = "Reservation Management Screen - allocating to Job" + Item.Job.JobNumber + " for Requisition Line";
  111. return mvt;
  112. }
  113. private void Cancel_Click(object sender, RoutedEventArgs e)
  114. {
  115. DialogResult = false;
  116. }
  117. private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
  118. {
  119. var box = sender as TextBox;
  120. if (!string.IsNullOrWhiteSpace(box.Text))
  121. {
  122. if (double.TryParse(box.Text, out double value) == false)
  123. box.Text = "0";
  124. else
  125. {
  126. var holdingUnits = (box.DataContext as StockSelectionViewModel).Holding.Units;
  127. if (holdingUnits >= value && value >= 0)
  128. (box.DataContext as StockSelectionViewModel).ChosenUnits = value;
  129. else
  130. (box.DataContext as StockSelectionViewModel).ChosenUnits = holdingUnits;
  131. }
  132. }
  133. }
  134. private void All_Clicked(object sender, RoutedEventArgs e)
  135. {
  136. var holdingUnits = ((sender as Button).DataContext as StockSelectionViewModel).Holding.Units;
  137. ((sender as Button).DataContext as StockSelectionViewModel).ChosenUnits = holdingUnits;
  138. }
  139. private void Minus_Click(object sender, RoutedEventArgs e)
  140. {
  141. var model = (sender as Button).DataContext as StockSelectionViewModel;
  142. if (model.ChosenUnits > 0)
  143. model.ChosenUnits--;
  144. }
  145. private void Plus_Click(object sender, RoutedEventArgs e)
  146. {
  147. var holdingUnits = ((sender as Button).DataContext as StockSelectionViewModel).Holding.Units;
  148. var model = (sender as Button).DataContext as StockSelectionViewModel;
  149. if (model.ChosenUnits < holdingUnits)
  150. model.ChosenUnits++;
  151. }
  152. private void SplitLine(JobRequisitionItem item, double oldItemQty, double newItemQty)
  153. {
  154. List<JobRequisitionItem> items = new List<JobRequisitionItem>();
  155. JobRequisitionItem newItem = new JobRequisitionItem();
  156. newItem.Requisition.ID = item.Requisition.ID;
  157. newItem.Status = JobRequisitionItemStatus.NotChecked;
  158. newItem.Requisition.Job.ID = item.Requisition.Job.ID;
  159. newItem.Requisition.Job.JobNumber = item.Requisition.Job.JobNumber;
  160. newItem.Requisition.Job.Name = item.Requisition.Job.Name;
  161. newItem.Job.ID = item.Job.ID;
  162. newItem.Product.ID = item.Product.ID;
  163. newItem.Product.Name = item.Product.Name;
  164. newItem.Product.Code = item.Product.Code;
  165. newItem.Product.Group.ID = item.Product.Group.ID;
  166. newItem.Product.Group.Description = item.Product.Group.Description;
  167. newItem.Dimensions.CopyFrom(item.Dimensions);
  168. newItem.Style.ID = item.Style.ID;
  169. newItem.Style.Description = item.Style.Description;
  170. newItem.Style.Code = item.Style.Code;
  171. newItem.Notes = item.Notes + Environment.NewLine + "Line split from original line when reserving";
  172. item.Notes = newItem.Notes;
  173. item.Qty = oldItemQty;
  174. newItem.Qty = newItemQty;
  175. items.Add(newItem);
  176. items.Add(item);
  177. new Client<JobRequisitionItem>().Save(items, "Split lines from Job Requi Item Review Dashboard");
  178. MessageBox.Show("Requisition Line split due to " + oldItemQty + " stock selected of " + (oldItemQty + newItemQty) + " required.");
  179. }
  180. }
  181. public class StockSelectionViewModel : INotifyPropertyChanged
  182. {
  183. public event PropertyChangedEventHandler? PropertyChanged;
  184. public string Location { get; set; }
  185. public string Area { get; set; }
  186. public string Style { get; set; }
  187. public double Units { get; set; }
  188. private double chosenUnits;
  189. public double ChosenUnits
  190. {
  191. get => chosenUnits;
  192. set
  193. {
  194. chosenUnits = value;
  195. OnPropertyChanged("ChosenUnits");
  196. }
  197. }
  198. public StockHolding Holding { get; set; }
  199. public StockSelectionViewModel()
  200. {
  201. Location = "";
  202. Area = "";
  203. Style = "";
  204. Units = 0;
  205. ChosenUnits = 0;
  206. }
  207. protected virtual void OnPropertyChanged(string propertyName)
  208. {
  209. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  210. }
  211. }
  212. }