using Comal.Classes;
using InABox.Clients;
using InABox.Core;
using InABox.DynamicGrid;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Windows.Controls;
namespace PRSDesktop;
///
/// Interaction logic for JobRequisitionPurchasing.xaml
///
public partial class ReservationManagementPurchasing : UserControl
{
public delegate void PurchaseOrderSaved();
public event PurchaseOrderSaved? OnPurchaseOrderSaved;
private PurchaseOrder Order { get; set; } = new PurchaseOrder();
private List JobRequiItems = new List();
private class JobRequiItemLinking
{
public JobRequisitionItem JobRequiItem { get; set; }
public JobRequisitionItemPurchaseOrderItem? JobRequisitionItemPurchaseOrderItem { get; set; }
public PurchaseOrderItem? PurchaseOrderItem { get; set; }
public JobRequiItemLinking(JobRequisitionItem jobRequiItem, PurchaseOrderItem purchaseOrderItem)
{
JobRequiItem = jobRequiItem;
PurchaseOrderItem = purchaseOrderItem;
JobRequisitionItemPurchaseOrderItem = null;
}
public JobRequiItemLinking(JobRequisitionItem jobRequiItem, JobRequisitionItemPurchaseOrderItem jobRequisitionItemPurchaseOrderItem)
{
JobRequiItem = jobRequiItem;
PurchaseOrderItem = null;
JobRequisitionItemPurchaseOrderItem = jobRequisitionItemPurchaseOrderItem;
}
}
bool bLoaded = false;
public bool EditorChanged { get; private set; }
public ReservationManagementPurchasing()
{
InitializeComponent();
CreatePOEditor();
}
private void ReloadJobRequiItems(Guid orderID)
{
JobRequiItems.Clear();
if(orderID != Guid.Empty)
{
var poItems = Client.Query(
new Filter(x => x.PurchaseOrderItem.PurchaseOrderLink.ID)
.IsEqualTo(orderID),
new Columns(x => x.ID).Add(x => x.JobRequisitionItem.ID))
.ToObjects();
foreach (var jriPoi in poItems)
{
var jri = new JobRequisitionItem
{
ID = jriPoi.JobRequisitionItem.ID
};
JobRequiItems.Add(new JobRequiItemLinking(jri, jriPoi));
}
}
}
public void LoadFromRequiLine(Guid orderID)
{
if (bLoaded)
return;
ReloadJobRequiItems(orderID);
if (orderID != Guid.Empty)
{
if (orderID != Order.ID)
{
LoadPO(orderID);
}
}
else
ClearEditor();
}
private void LoadPO(Guid orderID)
{
var po = Client.Query(
new Filter(x => x.ID).IsEqualTo(orderID),
new Columns(
x => x.ID,
x => x.SupplierLink.ID,
x => x.SupplierLink.Code,
x => x.SupplierLink.Name,
x => x.Description,
x => x.Category.ID,
x => x.Category.Code,
x => x.Category.Description,
x => x.RaisedBy.ID,
x => x.RaisedBy.Code,
x => x.RaisedBy.Name,
x => x.DueDate,
x => x.IssuedBy.ID,
x => x.IssuedBy.Code,
x => x.IssuedBy.Name,
x => x.IssuedDate,
x => x.ClosedDate,
x => x.PONumber))
.ToObjects().FirstOrDefault();
if (po is not null)
{
Order = po;
CreatePOEditor(new BaseObject[] { po });
}
}
private void CreatePOEditor(BaseObject[]? items = null)
{
DetailBorder.Child = null;
Editor = new EmbeddedDynamicEditorForm();
Editor.SetLayoutType();
Editor.SetValue(Grid.RowProperty, 1);
Editor.SetValue(Grid.ColumnProperty, 0);
Editor.SetValue(Grid.ColumnSpanProperty, 4);
Editor.HighlightButtons = true;
Editor.HideButtons = true;
EditorChanged = false;
Editor.OnAfterEditorValueChanged += (sender, args) =>
{
EditorChanged = true;
Editor.HideButtons = false;
return null;
};
Editor.OnOK += () =>
{
var cancel = new System.ComponentModel.CancelEventArgs();
Editor.SaveItem(cancel);
Editor.HideButtons = true;
SaveJRIPOIs();
OnPurchaseOrderSaved?.Invoke();
EditorChanged = false;
bLoaded = false;
};
Editor.OnCancel += () =>
{
Editor.HideButtons = true;
bLoaded = false;
var orderID = Order.ID;
Order = new PurchaseOrder();
JobRequiItems.Clear();
LoadFromRequiLine(orderID);
EditorChanged = false;
};
Editor.OnChanged += (sender, args) =>
{
EditorChanged = true;
Editor.HideButtons = false;
};
DetailBorder.Child = Editor;
var grid = DynamicGridUtils.CreateDynamicGrid(typeof(DynamicDataGrid<>), typeof(PurchaseOrder));
grid.InitialiseEditorForm(Editor, items ?? new object[] { new PurchaseOrder() });
var loadPO = new Button
{
Content = "Load PO",
Height = 30,
Margin = new System.Windows.Thickness(2, 0, 0, 0),
Padding = new System.Windows.Thickness(15, 0, 15, 0)
};
loadPO.Click += LoadPO_Click;
Editor.AddButton(loadPO);
}
private void LoadPO_Click(object sender, System.Windows.RoutedEventArgs e)
{
var popup = new PopupList(typeof(PurchaseOrder), Guid.Empty, Array.Empty());
if(popup.ShowDialog() == true)
{
bLoaded = true;
LoadPO(popup.ID);
}
}
private void SaveJRIPOIs()
{
var jriPois = new List();
var jris = new List();
foreach(var item in JobRequiItems)
{
if(item.PurchaseOrderItem is not null)
{
var jriPoi = new JobRequisitionItemPurchaseOrderItem();
jriPoi.JobRequisitionItem.ID = item.JobRequiItem.ID;
jriPoi.PurchaseOrderItem.ID = item.PurchaseOrderItem.ID;
jriPois.Add(jriPoi);
item.JobRequisitionItemPurchaseOrderItem = jriPoi;
jris.Add(item.JobRequiItem);
}
}
Client.Save(
jriPois,
"Updated from Job Requi Review Create Purchase Order");
Client.Save(
jris,
"Marked as on order");
}
private void ClearEditor()
{
Order = new PurchaseOrder();
CreatePOEditor();
}
public void DropItems(IEnumerable rows)
{
var page = Editor.Pages.OfType().First();
if(CreatePOItemsFromRequiItems(rows.ToObjects(), page.Items))
{
page.Refresh(false, true);
page.DoChanged();
}
}
private bool CreatePOItemsFromRequiItems(IEnumerable selected, List items)
{
var changed = false;
foreach (var jobRequisitionItem in selected)
{
// We only want not checked or order required.
if(jobRequisitionItem.Status != JobRequisitionItemStatus.NotChecked &&
jobRequisitionItem.Status != JobRequisitionItemStatus.OrderRequired)
{
continue;
}
// Filter out ones we've already got.
if(JobRequiItems.Any(x => x.JobRequiItem.ID == jobRequisitionItem.ID))
{
continue;
}
var poItem = new PurchaseOrderItem
{
Description = jobRequisitionItem.Product.Name,
Qty = jobRequisitionItem.Qty
};
poItem.Product.ID = jobRequisitionItem.Product.ID;
poItem.Product.Synchronise(jobRequisitionItem.Product);
poItem.Dimensions.CopyFrom(jobRequisitionItem.Dimensions);
poItem.Style.ID = jobRequisitionItem.Style.ID;
poItem.Style.Synchronise(jobRequisitionItem.Style);
poItem.Job.ID = jobRequisitionItem.Requisition.Job.ID;
poItem.Job.Synchronise(jobRequisitionItem.Requisition.Job);
items.Add(poItem);
JobRequiItems.Add(new JobRequiItemLinking(jobRequisitionItem, poItem));
changed = true;
}
return changed;
}
}