| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using InABox.Core;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Text;
- using InABox.Clients;
- namespace Comal.Classes
- {
- public class ProductInstanceFreeStockAggregate : CoreAggregate<ProductInstance, StockMovement, double>
- {
- public override Expression<Func<StockMovement, double>> Aggregate => x => x.Units;
- public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.Job).NotLinkValid();
- public override Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<ProductInstance, object?>>>
- Links =>
- new Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<ProductInstance, object?>>>()
- {
- { StockMovement => StockMovement.Product.ID, Instance => Instance.Product.ID },
- { StockMovement => StockMovement.Style.ID, Instance => Instance.Style.ID },
- }.AddRange(Dimensions.GetLinks<StockMovement, ProductInstance>(x => x.Dimensions, x => x.Dimensions));
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
- }
-
- public class ProductInstanceFreeStockValueAggregate : CoreAggregate<ProductInstance, StockMovement, double>
- {
- public override Expression<Func<StockMovement, double>> Aggregate => x => x.Value;
- public override Filter<StockMovement> Filter => new Filter<StockMovement>(x => x.Job).NotLinkValid();
- public override Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<ProductInstance, object?>>>
- Links =>
- new Dictionary<Expression<Func<StockMovement, object?>>, Expression<Func<ProductInstance, object?>>>()
- {
- { StockMovement => StockMovement.Product.ID, Instance => Instance.Product.ID },
- { StockMovement => StockMovement.Style.ID, Instance => Instance.Style.ID },
- }.AddRange(Dimensions.GetLinks<StockMovement, ProductInstance>(x => x.Dimensions, x => x.Dimensions));
- public override AggregateCalculation Calculation => AggregateCalculation.Sum;
- }
- public class ProductInstanceAverageCostFormula : IFormula<ProductInstance, double>
- {
- public Expression<Func<ProductInstance, double>> Value => x => x.FreeStockValue;
- public Expression<Func<ProductInstance, double>>[] Modifiers => new Expression<Func<ProductInstance, double>>[] { x => x.FreeStock };
- public FormulaOperator Operator => FormulaOperator.Divide;
- public FormulaType Type => FormulaType.Virtual;
- }
-
- public class ProductInstance : StockEntity, IRemotable, IPersistent, IProductInstance,
- ISequenceable, ILicense<ProductManagementLicense>
- {
- [NullEditor] public long Sequence { get; set; }
- [EditorSequence(1)]
- public override ProductLink Product { get; set; }
- [EditorSequence(2)]
- public ProductStyleLink Style { get; set; }
- [EditorSequence(3)]
- [RequiredColumn]
- [DimensionsEditor(typeof(StockDimensions))]
- public override StockDimensions Dimensions { get; set; }
- [IntegerEditor]
- [EditorSequence(4)]
- [LoggableProperty]
- public int MinimumStockLevel { get; set; }
- [EditorSequence(5)]
- [Aggregate(typeof(ProductInstanceFreeStockAggregate))]
- [DoubleEditor(Editable = Editable.Hidden)]
- public double FreeStock { get; set; }
-
- [EditorSequence(5)]
- [Aggregate(typeof(ProductInstanceFreeStockValueAggregate))]
- [DoubleEditor(Editable = Editable.Hidden)]
- public double FreeStockValue { get; set; }
-
- [CurrencyEditor(Visible = Visible.Optional)]
- [EditorSequence(5)]
- [LoggableProperty]
- public double NettCost { get; set; }
-
- [Formula(typeof(ProductInstanceAverageCostFormula))]
- [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Disabled)]
- [EditorSequence(6)]
- public double AverageCost { get; set; }
- [CurrencyEditor(Visible = Visible.Optional, Editable = Editable.Disabled)]
- [EditorSequence(7)]
- [LoggableProperty]
- public double LastCost { get; set; }
- [NullEditor]
- [Obsolete("", true)]
- public double Parameter { get; set; }
- public double RecalculateAverageCost()
- {
- var movements = Client.Query(
- new Filter<StockMovement>(x=>x.Product.ID).IsEqualTo(Product.ID)
- .And(x => x.Style.ID).IsEqualTo(Style.ID)
- .And(x => x.Dimensions).DimensionEquals(Dimensions)
- .And(x => x.Job.ID).IsEqualTo(Guid.Empty),
- Columns.None<StockMovement>().Add(x=>x.Units).Add(x=>x.Cost)
- ).Rows.ToObjects<StockMovement>().ToArray();
- return movements.Average(x => x.Units * x.Cost);
- }
- }
- }
|