|
@@ -1,42 +1,63 @@
|
|
using Comal.Classes;
|
|
using Comal.Classes;
|
|
using InABox.Clients;
|
|
using InABox.Clients;
|
|
|
|
+using InABox.Configuration;
|
|
using InABox.Core;
|
|
using InABox.Core;
|
|
using InABox.DynamicGrid;
|
|
using InABox.DynamicGrid;
|
|
using InABox.WPF;
|
|
using InABox.WPF;
|
|
-using NPOI.OpenXmlFormats.Dml;
|
|
|
|
-using Syncfusion.Windows.Shared;
|
|
|
|
using System;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Generic;
|
|
|
|
+using System.Drawing;
|
|
using System.Linq;
|
|
using System.Linq;
|
|
-using System.Text;
|
|
|
|
-using System.Threading.Tasks;
|
|
|
|
using System.Windows;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Controls;
|
|
-using System.Windows.Media;
|
|
|
|
|
|
|
|
namespace PRSDesktop
|
|
namespace PRSDesktop
|
|
{
|
|
{
|
|
- public delegate void JobRequiItemSelect(JobRequisitionItem item);
|
|
|
|
|
|
+ public class JobRequisitionReviewUserSettings : IUserConfigurationSettings
|
|
|
|
+ {
|
|
|
|
+ public DynamicGridFilter Filter { get; set; }
|
|
|
|
+
|
|
|
|
+ public JobRequisitionReviewUserSettings()
|
|
|
|
+ {
|
|
|
|
+ Filter = new DynamicGridFilter();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public delegate void JobRequiItemSelect(CoreRow[] rows);
|
|
public delegate void GridRefresh();
|
|
public delegate void GridRefresh();
|
|
public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
|
|
public class JobRequisitionReviewGrid : DynamicDataGrid<JobRequisitionItem>
|
|
{
|
|
{
|
|
public event JobRequiItemSelect OnJobRequiItemSelected;
|
|
public event JobRequiItemSelect OnJobRequiItemSelected;
|
|
public event GridRefresh OnGridRefresh;
|
|
public event GridRefresh OnGridRefresh;
|
|
- List<Guid> filterProductIDs = new List<Guid>();
|
|
|
|
public Guid empID = new Guid();
|
|
public Guid empID = new Guid();
|
|
string empName = "";
|
|
string empName = "";
|
|
bool bIncludeArchived = false;
|
|
bool bIncludeArchived = false;
|
|
bool bViewCancelled = false;
|
|
bool bViewCancelled = false;
|
|
- public Guid JobID = Guid.Empty;
|
|
|
|
|
|
+ JobRequisitionReviewUserSettings FilterSettings = new JobRequisitionReviewUserSettings();
|
|
|
|
+
|
|
Dictionary<Guid, double> JobRequisReservedQty = new Dictionary<Guid, double>();
|
|
Dictionary<Guid, double> JobRequisReservedQty = new Dictionary<Guid, double>();
|
|
public JobRequisitionReviewGrid()
|
|
public JobRequisitionReviewGrid()
|
|
{
|
|
{
|
|
|
|
+ FilterSettings = new UserConfiguration<JobRequisitionReviewUserSettings>().Load();
|
|
|
|
+ if (!string.IsNullOrWhiteSpace(FilterSettings.Filter.Name))
|
|
|
|
+ {
|
|
|
|
+ SelectedFilter = new(FilterSettings.Filter.Name, Serialization.Deserialize<Filter<JobRequisitionItem>>(FilterSettings.Filter.Filter));
|
|
|
|
+ UpdateFilterButton(InABox.Wpf.Resources.filter_set);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
Options.AddRange(
|
|
Options.AddRange(
|
|
- DynamicGridOption.FilterRows,
|
|
|
|
- DynamicGridOption.SelectColumns,
|
|
|
|
- DynamicGridOption.RecordCount,
|
|
|
|
- DynamicGridOption.MultiSelect
|
|
|
|
- );
|
|
|
|
|
|
+ DynamicGridOption.FilterRows,
|
|
|
|
+ DynamicGridOption.SelectColumns,
|
|
|
|
+ DynamicGridOption.RecordCount
|
|
|
|
+ );
|
|
|
|
+ Options.Remove(DynamicGridOption.AddRows);
|
|
|
|
+ Options.Remove(DynamicGridOption.EditRows);
|
|
|
|
+ Options.Remove(DynamicGridOption.ImportData);
|
|
|
|
+ Options.Remove(DynamicGridOption.ExportData);
|
|
|
|
+ Options.Remove(DynamicGridOption.Print);
|
|
|
|
+ Options.Remove(DynamicGridOption.ShowHelp);
|
|
|
|
+
|
|
HiddenColumns.Add(x => x.ID);
|
|
HiddenColumns.Add(x => x.ID);
|
|
HiddenColumns.Add(x => x.Product.ID);
|
|
HiddenColumns.Add(x => x.Product.ID);
|
|
HiddenColumns.Add(x => x.Product.Code);
|
|
HiddenColumns.Add(x => x.Product.Code);
|
|
@@ -51,6 +72,7 @@ namespace PRSDesktop
|
|
HiddenColumns.Add(x => x.Requisition.Job.JobNumber);
|
|
HiddenColumns.Add(x => x.Requisition.Job.JobNumber);
|
|
HiddenColumns.Add(x => x.Requisition.Job.Name);
|
|
HiddenColumns.Add(x => x.Requisition.Job.Name);
|
|
HiddenColumns.Add(x => x.Requisition.Number);
|
|
HiddenColumns.Add(x => x.Requisition.Number);
|
|
|
|
+ HiddenColumns.Add(x => x.PurchaseOrderItem.ID);
|
|
HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.ID);
|
|
HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.ID);
|
|
HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber);
|
|
HiddenColumns.Add(x => x.PurchaseOrderItem.PurchaseOrderLink.PONumber);
|
|
HiddenColumns.Add(x => x.PurchaseOrderItem.DueDate);
|
|
HiddenColumns.Add(x => x.PurchaseOrderItem.DueDate);
|
|
@@ -76,14 +98,13 @@ namespace PRSDesktop
|
|
HiddenColumns.Add(x => x.Dimensions.Unit.Description);
|
|
HiddenColumns.Add(x => x.Dimensions.Unit.Description);
|
|
|
|
|
|
LoadStockMovements();
|
|
LoadStockMovements();
|
|
- ActionColumns.Add(new DynamicTextColumn(CreateStatus));
|
|
|
|
|
|
|
|
if (Security.CanEdit<JobRequisitionItem>())
|
|
if (Security.CanEdit<JobRequisitionItem>())
|
|
- ActionColumns.Add(new DynamicMenuColumn(BuildMenu, EmptyReturnFunction));
|
|
|
|
- if (Security.CanEdit<PurchaseOrder>())
|
|
|
|
- AddButton("Create Purchase Order", null, CreatePurchaseOrder);
|
|
|
|
- if (Security.CanEdit<PurchaseOrder>())
|
|
|
|
- AddButton("Create Treatment PO", null, CreateTreatmentPO);
|
|
|
|
|
|
+ ActionColumns.Add(new DynamicMenuColumn(BuildMenu));
|
|
|
|
+ //if (Security.CanEdit<PurchaseOrder>())
|
|
|
|
+ // AddButton("Create Purchase Order", null, CreatePurchaseOrder);
|
|
|
|
+ //if (Security.CanEdit<PurchaseOrder>())
|
|
|
|
+ // AddButton("Create Treatment PO", null, CreateTreatmentPO);
|
|
|
|
|
|
AddButton("Include Archived", null, ViewArchived);
|
|
AddButton("Include Archived", null, ViewArchived);
|
|
AddButton("Include Cancelled", null, ViewCancelled);
|
|
AddButton("Include Cancelled", null, ViewCancelled);
|
|
@@ -99,15 +120,23 @@ namespace PRSDesktop
|
|
empName = table.Rows.FirstOrDefault().Values[1].ToString();
|
|
empName = table.Rows.FirstOrDefault().Values[1].ToString();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ OnFilterSelected += GridOnFilterSelected;
|
|
|
|
+
|
|
//Migrate();
|
|
//Migrate();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private void GridOnFilterSelected(DynamicGridFilter filter, Bitmap image)
|
|
|
|
+ {
|
|
|
|
+ new UserConfiguration<JobRequisitionReviewUserSettings>().Save(new JobRequisitionReviewUserSettings { Filter = filter });
|
|
|
|
+ OnGridRefresh?.Invoke();
|
|
|
|
+ }
|
|
|
|
+
|
|
private void Migrate()
|
|
private void Migrate()
|
|
{
|
|
{
|
|
CoreTable table = new Client<JobRequisitionItem>().Query(null, new Columns<JobRequisitionItem>(x => x.ID, x => x.PurchaseOrderItem.PurchaseOrderLink.ID));
|
|
CoreTable table = new Client<JobRequisitionItem>().Query(null, new Columns<JobRequisitionItem>(x => x.ID, x => x.PurchaseOrderItem.PurchaseOrderLink.ID));
|
|
Dictionary<Guid, Guid> reqPOids = new Dictionary<Guid, Guid>();
|
|
Dictionary<Guid, Guid> reqPOids = new Dictionary<Guid, Guid>();
|
|
List<JobRequisitionItem> affected = new List<JobRequisitionItem>();
|
|
List<JobRequisitionItem> affected = new List<JobRequisitionItem>();
|
|
- foreach(CoreRow row in table.Rows)
|
|
|
|
|
|
+ foreach (CoreRow row in table.Rows)
|
|
{
|
|
{
|
|
var item = row.ToObject<JobRequisitionItem>();
|
|
var item = row.ToObject<JobRequisitionItem>();
|
|
if (item.PurchaseOrderItem.PurchaseOrderLink.ID != Guid.Empty)
|
|
if (item.PurchaseOrderItem.PurchaseOrderLink.ID != Guid.Empty)
|
|
@@ -115,8 +144,8 @@ namespace PRSDesktop
|
|
reqPOids.Add(row.Get<JobRequisitionItem, Guid>(x => x.ID), item.PurchaseOrderItem.PurchaseOrderLink.ID);
|
|
reqPOids.Add(row.Get<JobRequisitionItem, Guid>(x => x.ID), item.PurchaseOrderItem.PurchaseOrderLink.ID);
|
|
affected.Add(row.ToObject<JobRequisitionItem>());
|
|
affected.Add(row.ToObject<JobRequisitionItem>());
|
|
}
|
|
}
|
|
- }
|
|
|
|
- List<JobRequisitionItem> list = new List<JobRequisitionItem>();
|
|
|
|
|
|
+ }
|
|
|
|
+ List<JobRequisitionItem> list = new List<JobRequisitionItem>();
|
|
CoreTable POs = new Client<PurchaseOrder>().Query(new Filter<PurchaseOrder>(x => x.ID).InList(reqPOids.Values.ToArray()), new Columns<PurchaseOrder>(x => x.ID, x => x.Created));
|
|
CoreTable POs = new Client<PurchaseOrder>().Query(new Filter<PurchaseOrder>(x => x.ID).InList(reqPOids.Values.ToArray()), new Columns<PurchaseOrder>(x => x.ID, x => x.Created));
|
|
foreach (CoreRow row in POs.Rows)
|
|
foreach (CoreRow row in POs.Rows)
|
|
{
|
|
{
|
|
@@ -154,6 +183,37 @@ namespace PRSDesktop
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public void AddStockMovements(Guid requiItemID)
|
|
|
|
+ {
|
|
|
|
+ CoreTable table = new Client<StockMovement>().Query(new Filter<StockMovement>(x => x.JobRequisitionItem.ID).IsEqualTo(requiItemID),
|
|
|
|
+ new Columns<StockMovement>(
|
|
|
|
+ x => x.JobRequisitionItem.ID,
|
|
|
|
+ x => x.Received
|
|
|
|
+ )
|
|
|
|
+ );
|
|
|
|
+ if (table.Rows.Any())
|
|
|
|
+ {
|
|
|
|
+ foreach (CoreRow row in table.Rows)
|
|
|
|
+ {
|
|
|
|
+ var requiID = row.Get<StockMovement, Guid>(x => x.JobRequisitionItem.ID);
|
|
|
|
+ var qty = row.Get<StockMovement, double>(x => x.Received);
|
|
|
|
+ if (!JobRequisReservedQty.ContainsKey(requiID))
|
|
|
|
+ JobRequisReservedQty.Add(requiID, qty);
|
|
|
|
+ else if (JobRequisReservedQty.ContainsKey(requiID) && row == table.Rows.First())
|
|
|
|
+ {
|
|
|
|
+ JobRequisReservedQty.Remove(requiID);
|
|
|
|
+ JobRequisReservedQty.Add(requiID, qty);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ double newQty = JobRequisReservedQty[requiID] + qty;
|
|
|
|
+ JobRequisReservedQty.Remove(requiID);
|
|
|
|
+ JobRequisReservedQty.Add(requiID, newQty);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
private string? CreateStatus(CoreRow? row)
|
|
private string? CreateStatus(CoreRow? row)
|
|
{
|
|
{
|
|
Guid id = row.Get<JobRequisitionItem, Guid>(x => x.ID);
|
|
Guid id = row.Get<JobRequisitionItem, Guid>(x => x.ID);
|
|
@@ -202,7 +262,7 @@ namespace PRSDesktop
|
|
|
|
|
|
private void JobRequisitionReviewGrid_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
|
|
private void JobRequisitionReviewGrid_OnSelectItem(object sender, DynamicGridSelectionEventArgs e)
|
|
{
|
|
{
|
|
- OnJobRequiItemSelected?.Invoke(SelectedRows[0].ToObject<JobRequisitionItem>());
|
|
|
|
|
|
+ OnJobRequiItemSelected?.Invoke(SelectedRows);
|
|
}
|
|
}
|
|
|
|
|
|
private bool ViewCancelled(Button button, CoreRow[] rows)
|
|
private bool ViewCancelled(Button button, CoreRow[] rows)
|
|
@@ -246,6 +306,7 @@ namespace PRSDesktop
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
protected override void GenerateColumns(DynamicGridColumns columns)
|
|
protected override void GenerateColumns(DynamicGridColumns columns)
|
|
{
|
|
{
|
|
columns.Add<JobRequisitionItem, DateTime>(x => x.Created, 80, "Date", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, DateTime>(x => x.Created, 80, "Date", "", Alignment.MiddleLeft);
|
|
@@ -260,7 +321,6 @@ namespace PRSDesktop
|
|
columns.Add<JobRequisitionItem, string>(x => x.PurchaseOrderItem.PONumber, 80, "PO Number", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, string>(x => x.PurchaseOrderItem.PONumber, 80, "PO Number", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, DateTime>(x => x.PurchaseOrderItem.DueDate, 80, "Due", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, DateTime>(x => x.PurchaseOrderItem.DueDate, 80, "Due", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, DateTime>(x => x.PurchaseOrderItem.ReceivedDate, 80, "Received", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, DateTime>(x => x.PurchaseOrderItem.ReceivedDate, 80, "Received", "", Alignment.MiddleLeft);
|
|
- columns.Add<JobRequisitionItem, JobRequisitionItemStatus>(x => x.Status, 80, "Status", "", Alignment.MiddleLeft);
|
|
|
|
columns.Add<JobRequisitionItem, string>(x => x.Notes, 300, "Notes", "", Alignment.MiddleLeft);
|
|
columns.Add<JobRequisitionItem, string>(x => x.Notes, 300, "Notes", "", Alignment.MiddleLeft);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -346,7 +406,7 @@ namespace PRSDesktop
|
|
private void Archive_Clicked(CoreRow row)
|
|
private void Archive_Clicked(CoreRow row)
|
|
{
|
|
{
|
|
JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
|
|
JobRequisitionItem item = row.ToObject<JobRequisitionItem>();
|
|
-
|
|
|
|
|
|
+ item.Archived = DateTime.Now;
|
|
SaveRow(row, JobRequisitionItemStatus.Archived, "Line marked as Archived by " + empName + " on " + DateTime.Now.ToString("dd MMM yy"));
|
|
SaveRow(row, JobRequisitionItemStatus.Archived, "Line marked as Archived by " + empName + " on " + DateTime.Now.ToString("dd MMM yy"));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -485,16 +545,14 @@ namespace PRSDesktop
|
|
return requiItems;
|
|
return requiItems;
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- private JobRequisitionItem UpdateJobReqItemWithPODetails(JobRequisitionItem JobReqItem, PurchaseOrderItem item)
|
|
|
|
|
|
+ private JobRequisitionItem UpdateJobReqItemWithPODetails(JobRequisitionItem JobReqItem, PurchaseOrderItem poItem)
|
|
{
|
|
{
|
|
- JobReqItem.PurchaseOrderItem.ID = item.ID;
|
|
|
|
- JobReqItem.PurchaseOrderItem.DueDate = item.DueDate;
|
|
|
|
|
|
+ JobReqItem.PurchaseOrderItem.ID = poItem.ID;
|
|
|
|
+ JobReqItem.PurchaseOrderItem.DueDate = poItem.DueDate;
|
|
if (JobReqItem.Status != JobRequisitionItemStatus.OnOrder)
|
|
if (JobReqItem.Status != JobRequisitionItemStatus.OnOrder)
|
|
{
|
|
{
|
|
JobReqItem.Notes = JobReqItem.Notes + Environment.NewLine + "Line marked as On Order by " + empName + " on " + DateTime.Now.ToString("dd MMM yy");
|
|
JobReqItem.Notes = JobReqItem.Notes + Environment.NewLine + "Line marked as On Order by " + empName + " on " + DateTime.Now.ToString("dd MMM yy");
|
|
- JobReqItem.Status = JobRequisitionItemStatus.OnOrder;
|
|
|
|
|
|
+ JobReqItem.Ordered = poItem.Created;
|
|
}
|
|
}
|
|
return JobReqItem;
|
|
return JobReqItem;
|
|
}
|
|
}
|
|
@@ -602,51 +660,16 @@ namespace PRSDesktop
|
|
if (!bIncludeArchived)
|
|
if (!bIncludeArchived)
|
|
criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Archived));
|
|
criteria.Add(new Filter<JobRequisitionItem>(x => x.Status).IsNotEqualTo(JobRequisitionItemStatus.Archived));
|
|
|
|
|
|
- if (filterProductIDs.Count > 0)
|
|
|
|
- {
|
|
|
|
- Filter<JobRequisitionItem> filter = new Filter<JobRequisitionItem>(x => x.Product.ID).IsEqualTo(filterProductIDs.FirstOrDefault());
|
|
|
|
- foreach (Guid id in filterProductIDs)
|
|
|
|
- {
|
|
|
|
- if (id != filterProductIDs[0])
|
|
|
|
- filter = filter.Or(x => x.Product.ID).IsEqualTo(id);
|
|
|
|
- }
|
|
|
|
- criteria.Add(filter);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (JobID != Guid.Empty)
|
|
|
|
- criteria.Add(new Filter<JobRequisitionItem>(x => x.Requisition.Job.ID).IsEqualTo(JobID));
|
|
|
|
-
|
|
|
|
-
|
|
|
|
sort = new SortOrder<JobRequisitionItem>(x => x.Requisition.Number, SortDirection.Descending);
|
|
sort = new SortOrder<JobRequisitionItem>(x => x.Requisition.Number, SortDirection.Descending);
|
|
base.Reload(criteria, columns, ref sort, action);
|
|
base.Reload(criteria, columns, ref sort, action);
|
|
}
|
|
}
|
|
|
|
|
|
- public void RefreshOnFilterChanged(Guid id)
|
|
|
|
- {
|
|
|
|
- filterProductIDs.Clear();
|
|
|
|
- if (id != Guid.Empty)
|
|
|
|
- {
|
|
|
|
- CoreTable table = new Client<SupplierProduct>().Query(
|
|
|
|
- new Filter<SupplierProduct>(x => x.SupplierLink.ID).IsEqualTo(id)
|
|
|
|
- .And(x => x.Product).LinkValid(),
|
|
|
|
- new Columns<SupplierProduct>(x => x.Product.ID));
|
|
|
|
- if (table.Rows.Any())
|
|
|
|
- {
|
|
|
|
- foreach (CoreRow row in table.Rows)
|
|
|
|
- {
|
|
|
|
- filterProductIDs.Add(Guid.Parse(row.Values[0].ToString()));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- OnGridRefresh?.Invoke();
|
|
|
|
- }
|
|
|
|
|
|
|
|
private void BuildMenu(DynamicMenuColumn column, CoreRow row)
|
|
private void BuildMenu(DynamicMenuColumn column, CoreRow row)
|
|
{
|
|
{
|
|
- column.AddItem("Mark as already reserved", PRSDesktop.Resources.rack, MarkReserved_Clicked);
|
|
|
|
- column.AddItem("Treatment Required", PRSDesktop.Resources.palette, TreatmentRequired_Clicked);
|
|
|
|
|
|
+ // column.AddItem("Treatment Required", PRSDesktop.Resources.palette, TreatmentRequired_Clicked);
|
|
column.AddItem("Order Required", PRSDesktop.Resources.purchase, OrderRequired_Clicked);
|
|
column.AddItem("Order Required", PRSDesktop.Resources.purchase, OrderRequired_Clicked);
|
|
- column.AddItem("Mark as Not Checked", PRSDesktop.Resources.disabled, Uncheck_Clicked);
|
|
|
|
|
|
+ //column.AddItem("Mark as Not Checked", PRSDesktop.Resources.disabled, Uncheck_Clicked);
|
|
column.AddItem("Split Line", PRSDesktop.Resources.split, SplitLine_Clicked);
|
|
column.AddItem("Split Line", PRSDesktop.Resources.split, SplitLine_Clicked);
|
|
column.AddItem("Archive", PRSDesktop.Resources.archive, Archive_Clicked);
|
|
column.AddItem("Archive", PRSDesktop.Resources.archive, Archive_Clicked);
|
|
}
|
|
}
|