| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- using System;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using InABox.Core;
- using System.Diagnostics.CodeAnalysis;
- using System.Linq;
- using System.Linq.Expressions;
- using Comal.Classes;
- using InABox.Mobile;
- using Xamarin.Forms.Xaml;
- namespace PRS.Mobile
- {
-
- public class StockHoldingModel : CoreRepository<StockHoldingModel, StockHoldingShell, StockHolding>
- {
- public StockHoldingModel(IModelHost host, Func<Filter<StockHolding>> filter): base(host, filter)
- {
- }
-
- protected override void Initialize()
- {
- base.Initialize();
- UnitSizes = new StockHoldingGroup[] { };
- }
-
-
- protected override void BeforeLoad(MultiQuery query)
- {
- base.BeforeLoad(query);
- query.Add(
- new Filter<StockMovement>(x=>x.Location.ID).InQuery(Filter(),x=>x.Location.ID),
- new Columns<StockMovement>(ColumnTypeFlags.None).Add(x=>x.ID)
- .Add(x => x.Job.ID)
- .Add(x => x.Location.ID)
- .Add(x => x.Product.ID)
- .Add(x => x.Style.ID)
- .Add(x => x.Dimensions.Unit.ID)
- .Add(x => x.Dimensions.Quantity)
- .Add(x => x.Dimensions.Length)
- .Add(x => x.Dimensions.Width)
- .Add(x => x.Dimensions.Height)
- .Add(x => x.Dimensions.Weight)
- .Add(x => x.Dimensions.UnitSize)
- .Add(x => x.JobRequisitionItem.ID)
- .Add(x => x.JobRequisitionItem.Job.ID)
- .Add(x => x.JobRequisitionItem.Requisition.Number)
- .Add(x => x.JobRequisitionItem.Requisition.Description)
- .Add(x => x.Units),
- new SortOrder<StockMovement>(x=>x.JobRequisitionItem.Requisition.Number)
- );
- }
- public StockHoldingGroup[] UnitSizes { get; private set; }
- protected override void AfterLoad(MultiQuery query)
- {
- base.AfterLoad(query);
-
- UnitSizes = this
- .Select(x => new StockHoldingGroup(x.DimensionsUnitSize))
- .Distinct(new StockHoldingGroupEqualityComparer())
- .OrderBy(x=>x.UnitSize)
- .ToArray();
- _movements = query.Get<StockMovement>();
-
- }
- private CoreTable _movements = null;
- public StockTransactionAllocation[] GetAllocations(StockHoldingShell shell)
- {
- List<StockTransactionAllocation> result = null;
- if (_movements != null)
- {
- var movements = _movements.Rows
- .Where(r =>
- r.Get<StockMovement, Guid>(c => c.Product.ID) == shell.ProductID
- && r.Get<StockMovement, Guid>(c => c.Job.ID) == shell.JobID
- && r.Get<StockMovement, Guid>(c => c.Style.ID) == shell.StyleID
- && r.Get<StockMovement, Guid>(c => c.Dimensions.Unit.ID) == shell.DimensionsUnitID
- && String.Equals(r.Get<StockMovement, String>(c => c.Dimensions.UnitSize),
- shell.DimensionsUnitSize)
- );
- var groups = movements
- .GroupBy(r => new Tuple<Guid, Guid, int, string>(
- r.Get<StockMovement, Guid>(c => c.JobRequisitionItem.Job.ID),
- r.Get<StockMovement, Guid>(c => c.JobRequisitionItem.ID),
- r.Get<StockMovement, int>(c => c.JobRequisitionItem.Requisition.Number),
- r.Get<StockMovement, string>(c => c.JobRequisitionItem.Requisition.Description)
- ));
- result = groups
- .Select(g => new StockTransactionAllocation()
- {
- JobID = g.Key.Item1,
- ID = g.Key.Item2,
- Description = g.Key.Item2 != Guid.Empty
- ? $"{g.Key.Item3}: {g.Key.Item4}"
- : "Un-requisitioned items",
- Quantity = g.Aggregate(0.0, (t, r) => t += r.Get<StockMovement, double>(c => c.Units)),
- Maximum = g.Aggregate(0.0, (t, r) => t += r.Get<StockMovement, double>(c => c.Units))
- }
- ).ToList();
- }
- else
- result = new List<StockTransactionAllocation>();
- if (!result.Any(x=>x.ID == Guid.Empty))
- {
- var balance = result.Aggregate(shell.Units, (t, a) => t -= a.Quantity);
- result.Insert(0, new StockTransactionAllocation()
- {
- JobID = Guid.Empty,
- ID = Guid.Empty,
- Description = "Un-requisitioned Items",
- Quantity = balance,
- Maximum = balance
- });
- }
- return result.ToArray();
- }
- protected override Expression<Func<StockHolding, object>> ImageColumn => x => x.Product.Image.ID;
-
- private StockTransactions? _transactions = null;
- protected override void ItemsChanged(IEnumerable<StockHoldingShell> items)
- {
- UpdateShells(items);
- }
-
- private void TransactionsChanged(object sender, NotifyCollectionChangedEventArgs e)
- {
- UpdateShells(AllItems);
- }
- public void UpdateShells(IEnumerable<StockHoldingShell> items)
- {
- foreach (var shell in items)
- shell.Transactions.ReplaceRange(_transactions != null ? _transactions.Get(shell) : new StockTransaction[] { });
- OnPropertyChanged(nameof(Items));
- }
- public StockTransactions? Transactions
- {
- get => _transactions;
- set
- {
- if (_transactions != null)
- _transactions.CollectionChanged -= TransactionsChanged;
- _transactions = value;
- if (_transactions != null)
- _transactions.CollectionChanged += TransactionsChanged;
- UpdateShells(AllItems);
- }
- }
- }
- }
|