|
@@ -25,6 +25,19 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
|
|
|
}
|
|
|
|
|
|
private void UpdateStockMovements(PurchaseOrderItem entity)
|
|
|
+ {
|
|
|
+ var movements = Provider.Query<StockMovement>(
|
|
|
+ new Filter<StockMovement>(x => x.OrderItem.ID).IsEqualTo(entity.ID))
|
|
|
+ .ToArray<StockMovement>();
|
|
|
+ foreach(var mvt in movements)
|
|
|
+ {
|
|
|
+ mvt.Date = entity.ReceivedDate;
|
|
|
+ mvt.Cost = entity.Cost;
|
|
|
+ }
|
|
|
+ FindSubStore<StockMovement>().Save(movements, "Updated by purchase order modification");
|
|
|
+ }
|
|
|
+
|
|
|
+ private void CreateStockMovements(PurchaseOrderItem entity)
|
|
|
{
|
|
|
if (!entity.Product.IsValid())
|
|
|
{
|
|
@@ -44,51 +57,13 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
|
|
|
var jobRequisitionItemTask = Task<Guid>.Run(() =>
|
|
|
{
|
|
|
return Provider.Query(
|
|
|
- new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ID).IsEqualTo(entity.ID),
|
|
|
- new Columns<JobRequisitionItemPurchaseOrderItem>(x => x.JobRequisitionItem.ID))
|
|
|
- .ToObjects<JobRequisitionItemPurchaseOrderItem>().FirstOrDefault()?.JobRequisitionItem.ID ?? Guid.Empty;
|
|
|
- });
|
|
|
-
|
|
|
- var movementtask = new Task<List<StockMovement>>(() =>
|
|
|
- {
|
|
|
- var result = Provider.Query(
|
|
|
- new Filter<StockMovement>(x => x.OrderItem.ID).IsEqualTo(entity.ID),
|
|
|
- new Columns<StockMovement>(
|
|
|
- x => x.ID,
|
|
|
- x => x.Date,
|
|
|
- x => x.Product.ID,
|
|
|
- x => x.Received,
|
|
|
- x => x.Employee.ID,
|
|
|
- x => x.OrderItem.ID,
|
|
|
- x => x.Job.ID,
|
|
|
- x => x.Location.ID,
|
|
|
- x => x.Dimensions.Unit.ID,
|
|
|
- x => x.Dimensions.Unit.Formula,
|
|
|
- x => x.Dimensions.Unit.Format,
|
|
|
- x => x.Dimensions.Quantity,
|
|
|
- x => x.Dimensions.Length,
|
|
|
- x => x.Dimensions.Width,
|
|
|
- x => x.Dimensions.Height,
|
|
|
- x => x.Dimensions.Weight,
|
|
|
- x => x.Notes,
|
|
|
- x => x.Cost,
|
|
|
- x => x.Dimensions.Unit.HasHeight,
|
|
|
- x => x.Dimensions.Unit.HasLength,
|
|
|
- x => x.Dimensions.Unit.HasWidth,
|
|
|
- x => x.Dimensions.Unit.HasWeight,
|
|
|
- x => x.Dimensions.Unit.HasQuantity,
|
|
|
- x => x.Dimensions.Unit.Formula,
|
|
|
- x => x.Dimensions.Unit.Format,
|
|
|
- x => x.Dimensions.Unit.Code,
|
|
|
- x => x.Dimensions.Unit.Description,
|
|
|
- x => x.Batch.ID
|
|
|
- )
|
|
|
- ).Rows.Select(x => x.ToObject<StockMovement>()).ToList();
|
|
|
- if (!result.Any())
|
|
|
- result.Add(new StockMovement());
|
|
|
- return result;
|
|
|
+ new Filter<JobRequisitionItem>(x => x.ID).InQuery(
|
|
|
+ new Filter<JobRequisitionItemPurchaseOrderItem>(x => x.PurchaseOrderItem.ID).IsEqualTo(entity.ID),
|
|
|
+ x => x.JobRequisitionItem.ID),
|
|
|
+ new Columns<JobRequisitionItem>(x => x.ID)
|
|
|
+ .Add(x => x.Status))
|
|
|
+ .ToObjects<JobRequisitionItem>().FirstOrDefault();
|
|
|
});
|
|
|
- movementtask.Start();
|
|
|
|
|
|
var instancetask = new Task<CoreRow?>(() =>
|
|
|
{
|
|
@@ -167,13 +142,12 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
|
|
|
});
|
|
|
locationtask.Start();
|
|
|
|
|
|
- Task.WaitAll(movementtask, producttask, locationtask, instancetask, jobRequisitionItemTask);
|
|
|
+ Task.WaitAll(producttask, locationtask, instancetask, jobRequisitionItemTask);
|
|
|
|
|
|
- var movements = movementtask.Result;
|
|
|
var instancerow = instancetask.Result;
|
|
|
var productrow = producttask.Result;
|
|
|
var defaultlocations = locationtask.Result;
|
|
|
- var jobRequisitionItemID = jobRequisitionItemTask.Result;
|
|
|
+ var jri = jobRequisitionItemTask.Result;
|
|
|
|
|
|
if (productrow is null)
|
|
|
{
|
|
@@ -284,57 +258,69 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- StockMovementBatch? batch = null;
|
|
|
- foreach (var movement in movements)
|
|
|
+ var batch = new StockMovementBatch
|
|
|
{
|
|
|
- if(movement.Batch.ID == Guid.Empty)
|
|
|
- {
|
|
|
- batch ??= new StockMovementBatch
|
|
|
- {
|
|
|
- Type = StockMovementBatchType.Receipt,
|
|
|
- TimeStamp = DateTime.Now,
|
|
|
- Notes = $"Received on PO"
|
|
|
- };
|
|
|
- }
|
|
|
+ Type = StockMovementBatchType.Receipt,
|
|
|
+ TimeStamp = DateTime.Now,
|
|
|
+ Notes = $"Received on PO"
|
|
|
+ };
|
|
|
+ var movements = new List<StockMovement>();
|
|
|
|
|
|
- movement.Date = entity.ReceivedDate;
|
|
|
- movement.Product.ID = entity.Product.ID;
|
|
|
- movement.Received = entity.Qty;
|
|
|
- movement.Employee.ID = Guid.Empty;
|
|
|
- movement.OrderItem.ID = entity.ID;
|
|
|
- movement.Job.ID = entity.Job.ID;
|
|
|
- movement.Location.ID = locationid;
|
|
|
- movement.Style.ID = entity.Style.ID;
|
|
|
- movement.Notes = string.Format("Received on PO {0}", entity.PurchaseOrderLink.PONumber);
|
|
|
- movement.Cost = entity.Cost;
|
|
|
- movement.Type = StockMovementType.Receive;
|
|
|
- movement.Dimensions.Unit.ID = entity.Dimensions.Unit.ID;
|
|
|
- movement.Dimensions.Height = entity.Dimensions.Height;
|
|
|
- movement.Dimensions.Length = entity.Dimensions.Length;
|
|
|
- movement.Dimensions.Width = entity.Dimensions.Width;
|
|
|
- movement.Dimensions.Weight = entity.Dimensions.Weight;
|
|
|
- movement.Dimensions.Quantity = entity.Dimensions.Quantity;
|
|
|
- movement.Dimensions.UnitSize = entity.Dimensions.UnitSize;
|
|
|
- movement.Dimensions.Value = entity.Dimensions.Value;
|
|
|
- movement.Dimensions.UnitSize = entity.Dimensions.UnitSize;
|
|
|
- movement.JobRequisitionItem.ID = jobRequisitionItemID;
|
|
|
- }
|
|
|
+ var movement = new StockMovement();
|
|
|
+ movement.Product.ID = entity.Product.ID;
|
|
|
+ movement.Job.ID = entity.Job.ID;
|
|
|
+ movement.Location.ID = locationid;
|
|
|
+ movement.Style.ID = entity.Style.ID;
|
|
|
+ movement.Dimensions.CopyFrom(entity.Dimensions);
|
|
|
|
|
|
- if(batch is not null)
|
|
|
+ movement.Date = entity.ReceivedDate;
|
|
|
+ movement.Received = entity.Qty;
|
|
|
+ movement.Employee.ID = Guid.Empty;
|
|
|
+ movement.OrderItem.ID = entity.ID;
|
|
|
+ movement.Notes = string.Format("Received on PO {0}", entity.PurchaseOrderLink.PONumber);
|
|
|
+ movement.Cost = entity.Cost;
|
|
|
+ movement.Type = StockMovementType.Receive;
|
|
|
+ movements.Add(movement);
|
|
|
+
|
|
|
+ if(jri is not null)
|
|
|
{
|
|
|
- FindSubStore<StockMovementBatch>().Save(batch, "Received on PO");
|
|
|
- foreach(var movement in movements)
|
|
|
+ movement.JobRequisitionItem.ID = jri.ID;
|
|
|
+ if (!jri.Cancelled.IsEmpty())
|
|
|
{
|
|
|
- if(movement.Batch.ID == Guid.Empty)
|
|
|
- {
|
|
|
- movement.Batch.ID = batch.ID;
|
|
|
- }
|
|
|
+ // We need to create an immediate transfer in and out of the job requisition item.
|
|
|
+
|
|
|
+ var tOut = movement.CreateMovement();
|
|
|
+ tOut.JobRequisitionItem.ID = jri.ID;
|
|
|
+ tOut.Date = entity.ReceivedDate;
|
|
|
+ tOut.Issued = entity.Qty;
|
|
|
+ tOut.OrderItem.ID = entity.ID;
|
|
|
+ tOut.Notes = "Internal transfer from cancelled requisition";
|
|
|
+ tOut.System = true;
|
|
|
+ tOut.Cost = entity.Cost;
|
|
|
+ tOut.Type = StockMovementType.TransferOut;
|
|
|
+
|
|
|
+ var tIn = movement.CreateMovement();
|
|
|
+ tIn.Transaction = tOut.Transaction;
|
|
|
+ tIn.Date = entity.ReceivedDate;
|
|
|
+ tIn.Received = entity.Qty;
|
|
|
+ tIn.OrderItem.ID = entity.ID;
|
|
|
+ tOut.Notes = "Internal transfer from cancelled requisition";
|
|
|
+ tOut.System = true;
|
|
|
+ tIn.Cost = entity.Cost;
|
|
|
+ tIn.Type = StockMovementType.TransferIn;
|
|
|
+
|
|
|
+ movements.Add(tOut);
|
|
|
+ movements.Add(tIn);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var updates = movements.Where(x => x.IsChanged()).ToList();
|
|
|
- if (updates.Any())
|
|
|
- FindSubStore<StockMovement>().Save(updates, "Updated by Purchase Order Modification");
|
|
|
+ FindSubStore<StockMovementBatch>().Save(batch, "Received on PO");
|
|
|
+ foreach(var mvt in movements)
|
|
|
+ {
|
|
|
+ mvt.Batch.ID = batch.ID;
|
|
|
+ }
|
|
|
+
|
|
|
+ FindSubStore<StockMovement>().Save(movements, "Updated by Purchase Order Modification");
|
|
|
}
|
|
|
|
|
|
|
|
@@ -354,7 +340,7 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
|
|
|
{
|
|
|
base.AfterSave(entity);
|
|
|
|
|
|
- if (entity.HasOriginalValue<PurchaseOrderItem,DateTime>(x=>x.ReceivedDate))
|
|
|
+ if (entity.HasOriginalValue(x=>x.ReceivedDate))
|
|
|
{
|
|
|
if (entity.ReceivedDate.IsEmpty())
|
|
|
{
|
|
@@ -363,14 +349,32 @@ internal class PurchaseOrderItemStore : BaseStore<PurchaseOrderItem>
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- var item = Provider.Query(
|
|
|
- new Filter<PurchaseOrderItem>(x => x.ID).IsEqualTo(entity.ID),
|
|
|
- RequiredColumns())
|
|
|
- .ToObjects<PurchaseOrderItem>().FirstOrDefault();
|
|
|
- if (item != null)
|
|
|
+ var original = entity.GetOriginalValue(x => x.ReceivedDate);
|
|
|
+ if(original == DateTime.MinValue)
|
|
|
+ {
|
|
|
+ var item = Provider.Query(
|
|
|
+ new Filter<PurchaseOrderItem>(x => x.ID).IsEqualTo(entity.ID),
|
|
|
+ RequiredColumns())
|
|
|
+ .ToObjects<PurchaseOrderItem>().FirstOrDefault();
|
|
|
+ if(item is not null)
|
|
|
+ {
|
|
|
+ CreateStockMovements(item);
|
|
|
+ UpdateJobRequiItems(item, JobRequisitionItemAction.Updated);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
{
|
|
|
- UpdateStockMovements(item);
|
|
|
- UpdateJobRequiItems(item, JobRequisitionItemAction.Updated);
|
|
|
+ var item = Provider.Query(
|
|
|
+ new Filter<PurchaseOrderItem>(x => x.ID).IsEqualTo(entity.ID),
|
|
|
+ new Columns<PurchaseOrderItem>(x => x.ID)
|
|
|
+ .Add(x => x.ReceivedDate)
|
|
|
+ .Add(x => x.Cost))
|
|
|
+ .ToObjects<PurchaseOrderItem>().FirstOrDefault();
|
|
|
+ if(item is not null)
|
|
|
+ {
|
|
|
+ UpdateStockMovements(item);
|
|
|
+ UpdateJobRequiItems(item, JobRequisitionItemAction.Updated);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|