Prechádzať zdrojové kódy

Added ConsolidatedPurchaseOrder

Kenric Nugteren 4 mesiacov pred
rodič
commit
2f8e7519a0

+ 15 - 0
prs.classes/Entities/Job/Materials/JobMaterials.cs

@@ -183,26 +183,41 @@ namespace Comal.Classes
         [ComplexFormula(typeof(OnOrderAggregate))]
         public double OnOrder { get; set; }
 
+        /// <summary>
+        /// Calculated by JobSummary Grid.
+        /// </summary>
         [EditorSequence(10)]
         [DoubleEditor]
         [ComplexFormula(typeof(CalculatedField))]
         public double JobShortage { get; set; }
         
+        /// <summary>
+        /// Calculated by JobSummary Grid.
+        /// </summary>
         [EditorSequence(11)]
         [DoubleEditor]
         [ComplexFormula(typeof(CalculatedField))]
         public double FreeOnHand { get; set; }
         
+        /// <summary>
+        /// Calculated by JobSummary Grid.
+        /// </summary>
         [EditorSequence(12)]
         [DoubleEditor]
         [ComplexFormula(typeof(CalculatedField))]
         public double FreeOnOrder { get; set; }
         
+        /// <summary>
+        /// Calculated by JobSummary Grid.
+        /// </summary>
         [EditorSequence(13)]
         [DoubleEditor]
         [ComplexFormula(typeof(CalculatedField))]
         public double FreeStockTotal { get; set; }
         
+        /// <summary>
+        /// Calculated by JobSummary Grid.
+        /// </summary>
         [EditorSequence(14)]
         [DoubleEditor]
         [ComplexFormula(typeof(CalculatedField))]

+ 0 - 1
prs.classes/Entities/Job/Requisitions/JobRequisitionItem.cs

@@ -260,7 +260,6 @@ namespace Comal.Classes
         [DoubleEditor(Editable = Editable.Hidden)]
         public double GeneralOrder { get; set; }
         
-        
         private class TotalOrdersFormula : ComplexFormulaGenerator<JobRequisitionItem, double>
         {
             public override IComplexFormulaNode<JobRequisitionItem, double> GetFormula() =>

+ 74 - 0
prs.classes/Entities/PurchaseOrder/ConsolidatedPurchaseOrderItem.cs

@@ -0,0 +1,74 @@
+using InABox.Core;
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Comal.Classes
+{
+    public interface IConsolidatedPurchaseOrderItem
+    {
+        Guid ID { get; set; }
+
+        PurchaseOrderItemLink OrderItem { get; set; }
+
+        JobRequisitionItemLink JobRequisitionItem { get; set; }
+
+        JobLink Job { get; set; }
+
+        /// <summary>
+        /// Quantity of the item in "exploded" units.
+        /// </summary>
+        double Qty { get; set; }
+    }
+
+    /// <summary>
+    /// Represents a consolidation of <see cref="PurchaseOrderItem"/> and <see cref="PurchaseOrderItemAllocation"/> into a single list.
+    /// </summary>
+    [AutoEntity(typeof(ConsolidatedPurchaseOrderItemGenerator))]
+    public class ConsolidatedPurchaseOrderItem : Entity, IConsolidatedPurchaseOrderItem, IRemotable, IPersistent, ILicense<AccountsPayableLicense>
+    {
+        public PurchaseOrderItemLink OrderItem { get; set; } = null!;
+
+        public JobRequisitionItemLink JobRequisitionItem { get; set; } = null!;
+
+        public JobLink Job { get; set; } = null!;
+
+        public double Qty { get; set; }
+
+        static ConsolidatedPurchaseOrderItem()
+        {
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.PurchaseOrderLink.PONumber, caption: "PONumber");
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Description);
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Product.Code, caption: "Product", width: 100);
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Style.Code, caption: "Style", width: 100);
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.OrderItem.Dimensions.UnitSize, width: 70, caption: "Size");
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.Job.JobNumber, caption: "Job", width: 70);
+            DefaultColumns.Add<ConsolidatedPurchaseOrderItem>(x => x.Qty, width: 50);
+        }
+    }
+
+    public class ConsolidatedPurchaseOrderItemGenerator : AutoEntityUnionGenerator<IConsolidatedPurchaseOrderItem>
+    {
+        public override Column<IConsolidatedPurchaseOrderItem>[] IDColumns => new Column<IConsolidatedPurchaseOrderItem>[]
+        {
+            new Column<IConsolidatedPurchaseOrderItem>(x => x.ID)
+        };
+
+        protected override void Configure()
+        {
+            AddTable<PurchaseOrderItem>()
+                .AliasField(x => x.Job.ID, x => x.Job.ID)
+                .AliasField(x => x.OrderItem.ID, x => x.ID)
+                .AliasField(x => x.Qty, x => x.Unallocated)
+                .AddConstant(x => x.JobRequisitionItem.ID, Guid.Empty);
+
+            AddTable<PurchaseOrderItemAllocation>()
+                .AliasField(x => x.Job.ID, x => x.Job.ID)
+                .AliasField(x => x.OrderItem.ID, x => x.Item.ID)
+                .AliasField(x => x.Qty, x => x.Quantity)
+                .AliasField(x => x.JobRequisitionItem.ID, x => x.JobRequisitionItem.ID);
+        }
+
+        public override bool Distinct => true;
+    }
+}

+ 48 - 55
prs.desktop/Panels/Jobs/Orders/JobOrderGrid.cs

@@ -2,72 +2,65 @@
 using System.Linq;
 using System.Threading;
 using Comal.Classes;
+using InABox.Clients;
 using InABox.Core;
 using InABox.DynamicGrid;
 using InABox.Wpf;
 
-namespace PRSDesktop
+namespace PRSDesktop;
+
+public class JobOrderGrid : DynamicDataGrid<ConsolidatedPurchaseOrderItem>, IMasterDetailControl<Job, ConsolidatedPurchaseOrderItem>, IDataModelSource
 {
-    public class JobOrderGrid : DynamicDataGrid<PurchaseOrderItem>, IMasterDetailControl<Job,PurchaseOrderItem>, IDataModelSource
+    public Job? Master { get; set; }
+
+    public Filter<ConsolidatedPurchaseOrderItem> MasterDetailFilter => Master is not null && Master.ID != Guid.Empty
+        ? new Filter<ConsolidatedPurchaseOrderItem>(x => x.Job.ID).IsEqualTo(Master.ID)
+        : new Filter<ConsolidatedPurchaseOrderItem>().None();
+    
+    public JobOrderGrid()
     {
-        
-        public Job? Master { get; set; }
+        ColumnsTag = "JobOrders";
 
-        public Filter<PurchaseOrderItem> MasterDetailFilter => (Master?.ID ?? Guid.Empty) != Guid.Empty
-            ? new Filter<PurchaseOrderItem>(x => x.Job.ID).IsEqualTo(Master.ID)
-            : new Filter<PurchaseOrderItem>().None();
-        
-        public JobOrderGrid()
-        {
-            ColumnsTag = "JobOrders";
-            HiddenColumns.Add(x => x.PurchaseOrderLink.SupplierLink.ID);
-            HiddenColumns.Add(x => x.PurchaseOrderLink.Category.ID);
-            HiddenColumns.Add(x => x.ID);
-            HiddenColumns.Add(x => x.Product.ID);
-            HiddenColumns.Add(x => x.Product.Code);
-            HiddenColumns.Add(x => x.Product.Name);
-            HiddenColumns.Add(x => x.Description);
-            HiddenColumns.Add(x => x.TaxCode.ID);
-            HiddenColumns.Add(x => x.TaxCode.Code);
-            HiddenColumns.Add(x => x.TaxCode.Description);
-            HiddenColumns.Add(x => x.TaxCode.Rate);
-            HiddenColumns.Add(x => x.TaxRate);
-            HiddenColumns.Add(x => x.ExTax);
-            HiddenColumns.Add(x => x.Tax);
-            HiddenColumns.Add(x => x.IncTax);
-            HiddenColumns.Add(x => x.BillLine.ID);
-            HiddenColumns.Add(x => x.Consignment.ID);
-            HiddenColumns.Add(x => x.Product.DigitalForm.ID);
-            HiddenColumns.Add(x => x.Product.DigitalForm.Description);
-            HiddenColumns.Add(x => x.PurchaseOrderLink.SupplierLink.Code);
-            HiddenColumns.Add(x => x.PurchaseOrderLink.SupplierLink.Name);
-        }
-        protected override void DoReconfigure(DynamicGridOptions options)
-        {
-            base.DoReconfigure(options);
-            options.RecordCount = true;
-            options.SelectColumns = true;
-            options.FilterRows = true;
-            options.MultiSelect = true;
-            options.ExportData = true;
-        }
+        HiddenColumns.Add(x => x.OrderItem.ID);
+    }
 
-        public event DataModelUpdateEvent? OnUpdateDataModel;
+    protected override void DoReconfigure(DynamicGridOptions options)
+    {
+        base.DoReconfigure(options);
+        options.RecordCount = true;
+        options.SelectColumns = true;
+        options.FilterRows = true;
+        options.ExportData = true;
 
-        public string SectionName => "Job Orders";
+        options.EditRows = true;
+    }
 
-        public DataModel DataModel(Selection selection)
-        {
-            var ids = ExtractValues(x => x.ID, selection).ToArray();
-            return new BaseDataModel<PurchaseOrderItem>(new Filter<PurchaseOrderItem>(x => x.ID).InList(ids));
-        }
-        
-        protected override void Reload(
-        	Filters<PurchaseOrderItem> criteria, Columns<PurchaseOrderItem> columns, ref SortOrder<PurchaseOrderItem>? sort,
-        	CancellationToken token, Action<CoreTable?, Exception?> action)
+    protected override void DoEdit()
+    {
+        if (SelectedRows.Length == 0) return;
+
+        var row = SelectedRows[0];
+        if(DynamicGridUtils.EditEntity<PurchaseOrderItem>(row.Get<ConsolidatedPurchaseOrderItem, Guid>(x => x.OrderItem.ID)))
         {
-            criteria.Add(MasterDetailFilter);
-            base.Reload(criteria, columns, ref sort, token, action);
+            Refresh(false, true);
         }
     }
+
+    public event DataModelUpdateEvent? OnUpdateDataModel;
+
+    public string SectionName => "Job Orders";
+
+    public DataModel DataModel(Selection selection)
+    {
+        var ids = ExtractValues(x => x.OrderItem.ID, selection).ToArray();
+        return new BaseDataModel<ConsolidatedPurchaseOrderItem>(new Filter<ConsolidatedPurchaseOrderItem>(x => x.ID).InList(ids));
+    }
+    
+    protected override void Reload(
+    	Filters<ConsolidatedPurchaseOrderItem> criteria, Columns<ConsolidatedPurchaseOrderItem> columns, ref SortOrder<ConsolidatedPurchaseOrderItem>? sort,
+    	CancellationToken token, Action<CoreTable?, Exception?> action)
+    {
+        criteria.Add(MasterDetailFilter);
+        base.Reload(criteria, columns, ref sort, token, action);
+    }
 }

+ 1 - 1
prs.desktop/Panels/Jobs/ProjectsPanel.cs

@@ -156,7 +156,7 @@ public class ProjectsPanel : MasterDetailPanel<Job,ProjectsGrid,ProjectsPanelSet
         DoCreatePanel<JobRequisitionPanel>(Security.CanView<JobRequisition>, "Requisitions");
         DoCreatePanel<JobStockGrid>(Security.CanView<StockHolding>, "Stock Holdings");
         DoCreatePanel<JobPickingListPanel>(Security.CanView<Requisition>, "Picking Lists");
-        DoCreateGrid<JobOrderGrid, PurchaseOrderItem>(Security.CanView<PurchaseOrderItem>, "Orders");
+        DoCreateGrid<JobOrderGrid, ConsolidatedPurchaseOrderItem>(Security.CanView<PurchaseOrderItem>, "Orders");
         DoCreatePanel<JobDesignPanel>(Security.CanView<Setout>, "Designs");
         DoCreateGrid<ManufacturingGrid, ManufacturingPacket>(Security.CanView<ManufacturingPacket>, "Manufacturing");
         DoCreateGrid<ReadyToGoGrid, DeliveryItem>(Security.CanView<DeliveryItem>, "Dispatch");

+ 1 - 1
prs.desktop/Panels/Jobs/ServicePanel.cs

@@ -30,7 +30,7 @@ public class ServicePanel : MasterDetailPanel<Job,ServiceGrid,ServicePanelSettin
     protected override void CreatePages()
     {
         CreatePage<JobDetailPanel<JobDetails>>("Details");
-        CreatePage<JobDetailGrid<JobOrderGrid, PurchaseOrderItem>>(Security.CanView<PurchaseOrderItem>, "Orders");
+        CreatePage<JobDetailGrid<JobOrderGrid, ConsolidatedPurchaseOrderItem>>(Security.CanView<PurchaseOrderItem>, "Orders");
         CreatePage<JobDetailPanel<JobPickingListPanel>>(Security.CanView<Requisition>, "Picking Lists");
         CreatePage<JobDetailGrid<JobAssignmentGrid, Assignment>>(Security.CanView<Assignment>, "Assignments");
         CreatePage<JobDetailGrid<JobFormGrid, JobForm>>(Security.CanView<JobForm>, "Forms");

+ 1 - 1
prs.desktop/Panels/Jobs/ServicePanel_Old.xaml.cs

@@ -48,7 +48,7 @@ public partial class ServicePanel_Old : UserControl, IPanel<Job>
             new JobDetailPanel<JobPickingListPanel>(Requisitions),
             new JobDetailPanel<InvoicePanel>(Invoices),
             new JobDetailGrid<JobFormGrid, JobForm>(Forms),
-            new JobDetailGrid<JobOrderGrid, PurchaseOrderItem>(Orders),
+            new JobDetailGrid<JobOrderGrid, ConsolidatedPurchaseOrderItem>(Orders),
             new JobDetailGrid<JobAssignmentGrid, Assignment>(Assignments),
         };
     }