TransferModuleViewModel.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4. using Comal.Classes;
  5. using InABox.Core;
  6. using InABox.Mobile;
  7. using Xamarin.CommunityToolkit.ObjectModel;
  8. using Xamarin.Forms;
  9. namespace PRS.Mobile
  10. {
  11. public class TransferModuleViewModel : BindableObject
  12. {
  13. public ObservableRangeCollection<StockTransactionImage> Images { get; private set; }
  14. public String Notes { get; set; }
  15. public StockTransactions Transactions { get; private set; }
  16. private StockLocationShell _source;
  17. public StockLocationShell Source
  18. {
  19. get => _source;
  20. set
  21. {
  22. if (Equals(value, _source)) return;
  23. _source = value;
  24. SourceHoldings?.Refresh(true);
  25. CheckTransactions(StockTransactionView.Source);
  26. OnPropertyChanged();
  27. }
  28. }
  29. public StockHoldingModel SourceHoldings { get; private set; }
  30. private StockLocationShell _target;
  31. public StockLocationShell Target
  32. {
  33. get => _target;
  34. set
  35. {
  36. if (Equals(value, _target)) return;
  37. _target = value;
  38. TargetHoldings?.Refresh(true);
  39. CheckTransactions(StockTransactionView.Target);
  40. OnPropertyChanged();
  41. }
  42. }
  43. public StockHoldingModel TargetHoldings { get; private set; }
  44. public TransferModuleViewModel()
  45. {
  46. Images = new();
  47. Notes = "";
  48. Transactions = new StockTransactions();
  49. Transactions.CollectionChanged += (sender, args) =>
  50. {
  51. CheckTransactions(StockTransactionView.Source);
  52. CheckTransactions(StockTransactionView.Target);
  53. };
  54. _source = new StockLocationShell();
  55. _target = new StockLocationShell();
  56. SourceHoldings = new StockHoldingModel(App.Data,
  57. () => new Filter<StockHolding>(x => x.Location.ID).IsEqualTo(Source.ID));
  58. SourceHoldings.Transactions = Transactions;
  59. TargetHoldings = new StockHoldingModel(App.Data,
  60. () => new Filter<StockHolding>(x => x.Location.ID).IsEqualTo(Target.ID));
  61. TargetHoldings.Transactions = Transactions;
  62. }
  63. private void CheckTransactions(StockTransactionView view)
  64. {
  65. var location = view == StockTransactionView.Source ? Source : Target;
  66. var holdings = view == StockTransactionView.Source ? SourceHoldings : TargetHoldings;
  67. foreach (var transaction in Transactions)
  68. {
  69. if (location.ID == transaction.Source?.LocationID || location.ID == transaction.Target?.LocationID)
  70. {
  71. var transholding = view == StockTransactionView.Source ? transaction.Source : transaction.Target;
  72. if (!holdings.Any(
  73. x => x.ProductID == transaction.ProductID
  74. && String.Equals(x.DimensionsUnitSize, transaction.DimensionsUnitSize)
  75. && (x.LocationID == (transaction.Source?.LocationID ?? Guid.Empty) ||
  76. x.LocationID == (transaction.Target?.LocationID ?? Guid.Empty))
  77. && (x.StyleID == (transaction.Source?.StyleID ?? Guid.Empty) ||
  78. x.StyleID == (transaction.Target?.StyleID ?? Guid.Empty))
  79. && (x.JobID == (transaction.Source?.JobID ?? Guid.Empty) ||
  80. x.JobID == (transaction.Target?.JobID ?? Guid.Empty))
  81. ))
  82. {
  83. var holding = holdings.CreateItem();
  84. holding.ProductID = transaction.ProductID;
  85. holding.ProductCode = transaction.ProductCode;
  86. holding.ProductName = transaction.ProductName;
  87. Guid imageid = transaction?.ImageID ?? Guid.Empty;
  88. if (imageid != Guid.Empty && transaction?.Image !=null)
  89. holdings.Images[imageid] = transaction?.Image;
  90. holding.ImageID = imageid;
  91. holding.DimensionsUnitID = transaction?.DimensionsUnitID ?? Guid.Empty;
  92. holding.DimensionsQuantity = transaction?.DimensionsQuantity ?? 0.0;
  93. holding.DimensionsLength = transaction?.DimensionsLength ?? 0.0;
  94. holding.DimensionsWidth = transaction?.DimensionsWidth ?? 0.0;
  95. holding.DimensionsHeight = transaction?.DimensionsHeight ?? 0.0;
  96. holding.DimensionsWeight = transaction?.DimensionsWeight ?? 0.0;
  97. holding.DimensionsUnitSize = transaction?.DimensionsUnitSize ?? string.Empty;
  98. holding.DimensionsValue = transaction?.DimensionsValue ?? 0.0;
  99. holding.LocationID = transholding?.LocationID ?? Guid.Empty;
  100. holding.LocationCode = transholding?.LocationCode ?? string.Empty;
  101. holding.LocationDescription = transholding?.LocationDescription ?? string.Empty;
  102. holding.StyleID = transholding?.StyleID ?? Guid.Empty;
  103. holding.StyleCode = transholding?.StyleCode ?? string.Empty;
  104. holding.StyleDescription = transholding?.StyleDescription ?? string.Empty;
  105. holding.JobID = transholding?.JobID ?? Guid.Empty;
  106. holding.JobNumber = transholding?.JobNumber ?? string.Empty;
  107. holding.JobName = transholding?.JobName ?? string.Empty;
  108. holdings.CommitItem(holding);
  109. }
  110. }
  111. }
  112. }
  113. public Task Save(IProgress<String> progress)
  114. {
  115. return Task.Run(() =>
  116. {
  117. progress.Report("Creating Stock Movement Batch");
  118. var batchModel = new StockMovementBatchModel(App.Data,
  119. () => new Filter<StockMovementBatch>().None());
  120. batchModel.Refresh(false);
  121. var batch = batchModel.AddItem();
  122. batch.Type = StockMovementBatchType.Transfer;
  123. batch.EmployeeID = App.Data.Me.ID;
  124. batch.Notes = Notes;
  125. batch.Timestamp = DateTime.Now;
  126. batch.Save("Created on Mobile Device");
  127. progress.Report($"Saving Transactions");
  128. var movementModel = new StockMovementModel(App.Data,
  129. () => new Filter<StockMovement>().None());
  130. movementModel.Refresh(false);
  131. Transactions.ProcessTransactions(movementModel, batch.ID);
  132. progress.Report($"Creating {movementModel.Count()} Movements");
  133. movementModel.Save("Created on Mobile Device");
  134. var batchimageModel = new StockMovementBatchDocumentModel(App.Data,
  135. () => new Filter<StockMovementBatchDocument>().None());
  136. batchimageModel.Refresh(false);
  137. progress.Report($"Saving {Images.Count} Images");
  138. var documentModel = new DocumentModel(App.Data,
  139. () => new Filter<Document>().None());
  140. documentModel.Refresh(false);
  141. int i = 1;
  142. foreach (var image in Images)
  143. {
  144. progress.Report($"Saving {i}/{Images.Count} Images");
  145. var document = documentModel.AddItem();
  146. document.Data = image.Document.Data;
  147. document.FileName = image.Document.FileName;
  148. document.CRC = CoreUtils.CalculateCRC(image.Document.Data);
  149. document.TimeStamp = DateTime.Now;
  150. document.Save("Created on MobileDevice");
  151. var batchImage = batchimageModel.AddItem();
  152. {
  153. batchImage.BatchID = batch.ID;
  154. batchImage.DocumentID = document.ID;
  155. batchImage.Thumbnail = image.Thumbnail;
  156. }
  157. }
  158. progress.Report($"Updating Thumbnails");
  159. batchimageModel.Save("Created on Mobile Device");
  160. });
  161. }
  162. }
  163. }