ConsolidatedPurchaseOrderItem.cs 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using InABox.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace Comal.Classes
  6. {
  7. public interface IConsolidatedPurchaseOrderItem
  8. {
  9. Guid ID { get; set; }
  10. PurchaseOrderItemLink OrderItem { get; set; }
  11. JobRequisitionItemLink JobRequisitionItem { get; set; }
  12. JobLink Job { get; set; }
  13. /// <summary>
  14. /// Quantity of the item in "exploded" units.
  15. /// </summary>
  16. double Qty { get; set; }
  17. }
  18. /// <summary>
  19. /// Represents a consolidation of <see cref="PurchaseOrderItem"/> and <see cref="PurchaseOrderItemAllocation"/> into a single list.
  20. /// </summary>
  21. [AutoEntity(typeof(ConsolidatedPurchaseOrderItemGenerator))]
  22. public class ConsolidatedPurchaseOrderItem : Entity, IConsolidatedPurchaseOrderItem, IRemotable, IPersistent, ILicense<AccountsPayableLicense>
  23. {
  24. public PurchaseOrderItemLink OrderItem { get; set; } = null!;
  25. public JobRequisitionItemLink JobRequisitionItem { get; set; } = null!;
  26. public JobLink Job { get; set; } = null!;
  27. public double Qty { get; set; }
  28. static ConsolidatedPurchaseOrderItem()
  29. {
  30. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.PurchaseOrderLink.PONumber, caption: "PONumber");
  31. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Description);
  32. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Product.Code, caption: "Product", width: 100);
  33. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Style.Code, caption: "Style", width: 100);
  34. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Dimensions.UnitSize, width: 70, caption: "Size");
  35. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.Job.JobNumber, caption: "Job", width: 70);
  36. DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.Qty, width: 50);
  37. }
  38. }
  39. public class ConsolidatedPurchaseOrderItemGenerator : AutoEntityUnionGenerator<IConsolidatedPurchaseOrderItem>
  40. {
  41. public override Column<IConsolidatedPurchaseOrderItem>[] IDColumns => new Column<IConsolidatedPurchaseOrderItem>[]
  42. {
  43. new Column<IConsolidatedPurchaseOrderItem>(x => x.ID)
  44. };
  45. protected override void Configure()
  46. {
  47. AddTable<PurchaseOrderItem>()
  48. .AliasField(x => x.Job.ID, x => x.Job.ID)
  49. .AliasField(x => x.OrderItem.ID, x => x.ID)
  50. .AliasField(x => x.Qty, x => x.Unallocated)
  51. .AddConstant(x => x.JobRequisitionItem.ID, Guid.Empty);
  52. AddTable<PurchaseOrderItemAllocation>()
  53. .AliasField(x => x.Job.ID, x => x.Job.ID)
  54. .AliasField(x => x.OrderItem.ID, x => x.Item.ID)
  55. .AliasField(x => x.Qty,
  56. ComplexFormulaGenerator.If<PurchaseOrderItemAllocation, string, double>(
  57. ComplexFormulaGenerator.Property<PurchaseOrderItemAllocation, string>(x => x.Item.Dimensions.Unit.Conversion),
  58. Condition.Equals,
  59. ComplexFormulaGenerator.Constant<PurchaseOrderItemAllocation, string>(""),
  60. "")
  61. .Then(ComplexFormulaGenerator.Property<PurchaseOrderItemAllocation, double>(x => x.Quantity))
  62. .Else(ComplexFormulaGenerator.Formula(FormulaOperator.Divide,
  63. ComplexFormulaGenerator.Property<PurchaseOrderItemAllocation, double>(x => x.Quantity),
  64. ComplexFormulaGenerator.Property<PurchaseOrderItemAllocation, double>(x => x.Item.Dimensions.Value))))
  65. .AliasField(x => x.JobRequisitionItem.ID, x => x.JobRequisitionItem.ID);
  66. }
  67. public override bool Distinct => true;
  68. }
  69. }