using System; using System.Linq; using System.Threading.Tasks; using Comal.Classes; using InABox.Core; using InABox.Mobile; using Xamarin.CommunityToolkit.ObjectModel; using Xamarin.Forms; namespace PRS.Mobile { public class TransferModuleViewModel : BindableObject { public ObservableRangeCollection Images { get; private set; } public String Notes { get; set; } public StockTransactions Transactions { get; private set; } private StockLocationShell _source; public StockLocationShell Source { get => _source; set { if (Equals(value, _source)) return; _source = value; SourceHoldings?.Refresh(true); CheckTransactions(StockTransactionView.Source); OnPropertyChanged(); } } public StockHoldingModel SourceHoldings { get; private set; } private StockLocationShell _target; public StockLocationShell Target { get => _target; set { if (Equals(value, _target)) return; _target = value; TargetHoldings?.Refresh(true); CheckTransactions(StockTransactionView.Target); OnPropertyChanged(); } } public StockHoldingModel TargetHoldings { get; private set; } public TransferModuleViewModel() { Images = new(); Notes = ""; Transactions = new StockTransactions(); Transactions.CollectionChanged += (sender, args) => { CheckTransactions(StockTransactionView.Source); CheckTransactions(StockTransactionView.Target); }; _source = new StockLocationShell(); _target = new StockLocationShell(); SourceHoldings = new StockHoldingModel(App.Data, () => new Filter(x => x.Location.ID).IsEqualTo(Source.ID)); SourceHoldings.Transactions = Transactions; TargetHoldings = new StockHoldingModel(App.Data, () => new Filter(x => x.Location.ID).IsEqualTo(Target.ID)); TargetHoldings.Transactions = Transactions; } private void CheckTransactions(StockTransactionView view) { var location = view == StockTransactionView.Source ? Source : Target; var holdings = view == StockTransactionView.Source ? SourceHoldings : TargetHoldings; foreach (var transaction in Transactions) { if (location.ID == transaction.Source?.LocationID || location.ID == transaction.Target?.LocationID) { var transholding = view == StockTransactionView.Source ? transaction.Source : transaction.Target; if (!holdings.Any( x => x.ProductID == transaction.ProductID && String.Equals(x.DimensionsUnitSize, transaction.DimensionsUnitSize) && (x.LocationID == (transaction.Source?.LocationID ?? Guid.Empty) || x.LocationID == (transaction.Target?.LocationID ?? Guid.Empty)) && (x.StyleID == (transaction.Source?.StyleID ?? Guid.Empty) || x.StyleID == (transaction.Target?.StyleID ?? Guid.Empty)) && (x.JobID == (transaction.Source?.JobID ?? Guid.Empty) || x.JobID == (transaction.Target?.JobID ?? Guid.Empty)) )) { var holding = holdings.CreateItem(); holding.ProductID = transaction.ProductID; holding.ProductCode = transaction.ProductCode; holding.ProductName = transaction.ProductName; Guid imageid = transaction?.ImageID ?? Guid.Empty; if (imageid != Guid.Empty && transaction?.Image !=null) holdings.Images[imageid] = transaction?.Image; holding.ImageID = imageid; holding.DimensionsUnitID = transaction?.DimensionsUnitID ?? Guid.Empty; holding.DimensionsQuantity = transaction?.DimensionsQuantity ?? 0.0; holding.DimensionsLength = transaction?.DimensionsLength ?? 0.0; holding.DimensionsWidth = transaction?.DimensionsWidth ?? 0.0; holding.DimensionsHeight = transaction?.DimensionsHeight ?? 0.0; holding.DimensionsWeight = transaction?.DimensionsWeight ?? 0.0; holding.DimensionsUnitSize = transaction?.DimensionsUnitSize ?? string.Empty; holding.DimensionsValue = transaction?.DimensionsValue ?? 0.0; holding.LocationID = transholding?.LocationID ?? Guid.Empty; holding.LocationCode = transholding?.LocationCode ?? string.Empty; holding.LocationDescription = transholding?.LocationDescription ?? string.Empty; holding.StyleID = transholding?.StyleID ?? Guid.Empty; holding.StyleCode = transholding?.StyleCode ?? string.Empty; holding.StyleDescription = transholding?.StyleDescription ?? string.Empty; holding.JobID = transholding?.JobID ?? Guid.Empty; holding.JobNumber = transholding?.JobNumber ?? string.Empty; holding.JobName = transholding?.JobName ?? string.Empty; holdings.CommitItem(holding); } } } } public Task Save(IProgress progress) { return Task.Run(() => { progress.Report("Creating Stock Movement Batch"); var batchModel = new StockMovementBatchModel(App.Data, () => new Filter().None()); batchModel.Refresh(false); var batch = batchModel.AddItem(); batch.Type = StockMovementBatchType.Transfer; batch.EmployeeID = App.Data.Me.ID; batch.Notes = Notes; batch.Timestamp = DateTime.Now; batch.Save("Created on Mobile Device"); progress.Report($"Saving Transactions"); var movementModel = new StockMovementModel(App.Data, () => new Filter().None()); movementModel.Refresh(false); Transactions.ProcessTransactions(movementModel, batch.ID); progress.Report($"Creating {movementModel.Count()} Movements"); movementModel.Save("Created on Mobile Device"); var batchimageModel = new StockMovementBatchDocumentModel(App.Data, () => new Filter().None()); batchimageModel.Refresh(false); progress.Report($"Saving {Images.Count} Images"); var documentModel = new DocumentModel(App.Data, () => new Filter().None()); documentModel.Refresh(false); int i = 1; foreach (var image in Images) { progress.Report($"Saving {i}/{Images.Count} Images"); var document = documentModel.AddItem(); document.Data = image.Document.Data; document.FileName = image.Document.FileName; document.CRC = CoreUtils.CalculateCRC(image.Document.Data); document.TimeStamp = DateTime.Now; document.Save("Created on MobileDevice"); var batchImage = batchimageModel.AddItem(); { batchImage.BatchID = batch.ID; batchImage.DocumentID = document.ID; batchImage.Thumbnail = image.Thumbnail; } } progress.Report($"Updating Thumbnails"); batchimageModel.Save("Created on Mobile Device"); }); } } }