| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 | 
							- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Linq.Expressions;
 
- using Comal.Classes;
 
- using H.Pipes.Extensions;
 
- using InABox.Core;
 
- using PRSClasses;
 
- using Syncfusion.Windows.Tools.Controls;
 
- namespace Comal.Stores
 
- {
 
-     internal class RequisitionStore : BaseStore<Requisition>
 
-     {
 
-         private readonly bool _debug = true;
 
-         private void Log(string format, params object[] values)
 
-         {
 
-             if (_debug)
 
-                 Logger.Send(LogType.Information, UserID, string.Format("- RequisitionStore:" + format, values));
 
-         }
 
-         private bool NeedsUpdating<T>(Requisition entity, Expression<Func<Requisition, T>> property)
 
-         {
 
-             // If this is a new Requisition, we don't need to do anything
 
-             if (entity.HasOriginalValue(x => x.ID))
 
-             {
 
-                 var originalid = entity.GetOriginalValue(x => x.ID);
 
-                 if (originalid == Guid.Empty)
 
-                 {
 
-                     Log("NeedsUpdating() return false - original id is empty");
 
-                     return false;
 
-                 }
 
-             }
 
-             // if the Property has not changed, we don't need to do anything
 
-             if (!entity.HasOriginalValue(property))
 
-             {
 
-                 Log("NeedsUpdating() return false - {0} has not changed", property.ToString());
 
-                 return false;
 
-             }
 
-             return true;
 
-         }
 
-         private bool LoadRequisitionItems(Requisition entity, ref IEnumerable<RequisitionItem> requisitionitems)
 
-         {
 
-             if (requisitionitems == null)
 
-                 requisitionitems = Provider.Query(
 
-                     new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(entity.ID)
 
-                 ).Rows.Select(x => x.ToObject<RequisitionItem>());
 
-             return requisitionitems.Any();
 
-         }
 
-         private bool LoadDeliveryItems(Requisition entity, ref IEnumerable<DeliveryItem> deliveryitems)
 
-         {
 
-             if (deliveryitems == null)
 
-                 deliveryitems = Provider.Query(
 
-                     new Filter<DeliveryItem>(x => x.RequisitionLink.ID).IsEqualTo(entity.ID),
 
-                     new Columns<DeliveryItem>(x => x.ID, x => x.DeliveredDate)
 
-                 ).Rows.Select(x => x.ToObject<DeliveryItem>());
 
-             return deliveryitems.Any();
 
-         }
 
-         #region TakenBy
 
-         private void UpdateTakenBy(Requisition entity, ref IEnumerable<RequisitionItem> items, ref IEnumerable<DeliveryItem> deliveryitems)
 
-         {
 
-             Log("UpdateTakenBy() - starting");
 
-             if (!NeedsUpdating(entity, x => x.TakenBy))
 
-                 return;
 
-             if (!LoadDeliveryItems(entity, ref deliveryitems))
 
-             {
 
-                 Log("UpdateTakenBy() - no delivery items to update");
 
-                 return;
 
-             }
 
-             foreach (var deliveryitem in deliveryitems)
 
-                 if (entity.TakenBy.IsValid() && deliveryitem.DeliveredDate.IsEmpty())
 
-                 {
 
-                     Log("UpdateTakenBy() - Setting DeliveryDate");
 
-                     deliveryitem.DeliveredDate = DateTime.Now;
 
-                 }
 
-                 else if (!entity.TakenBy.IsValid() && !deliveryitem.DeliveredDate.IsEmpty())
 
-                 {
 
-                     Log("UpdateTakenBy() - Clearing DeliveryDate");
 
-                     deliveryitem.DeliveredDate = DateTime.MinValue;
 
-                 }
 
-             var updates = deliveryitems.Where(x => x.IsChanged());
 
-             if (updates.Any())
 
-                 FindSubStore<DeliveryItem>().Save(updates,
 
-                     entity.TakenBy.IsValid() ? "Requisition taken by " + entity.TakenBy.Code : "Requisition [TakenBy] has been cleared");
 
-             Log("UpdateTakenBy() - done");
 
-         }
 
-         #endregion
 
-         protected override void BeforeSave(Requisition entity)
 
-         {
 
-             base.BeforeSave(entity);
 
-             if (entity.TakenBy.IsValid() || entity.Delivery.Completed != DateTime.MinValue || entity.Delivery.Delivered != DateTime.MinValue)
 
-             {
 
-                 if (entity.Archived.IsEmpty())
 
-                     entity.Archived = DateTime.Now;
 
-             }
 
-             else
 
-             {
 
-                 if (!entity.Archived.IsEmpty())
 
-                     entity.Archived = DateTime.MinValue;
 
-             }
 
-         }
 
-         protected override void AfterSave(Requisition entity)
 
-         {
 
-             base.AfterSave(entity);
 
-             IEnumerable<RequisitionItem> requisitionitems = null;
 
-             IEnumerable<DeliveryItem> deliveryitems = null;
 
-             
 
-             UpdateDeliveryItems(entity, ref requisitionitems, ref deliveryitems);
 
-             UpdateTakenBy(entity, ref requisitionitems, ref deliveryitems);
 
-             UpdateStockBatches(entity, ref requisitionitems);
 
-             UpdateTrackingKanban<RequisitionKanban, Requisition, RequisitionLink>(entity, e =>
 
-             {
 
-                 if (!entity.Archived.Equals(DateTime.MinValue) || entity.TakenBy.IsValid())
 
-                     return KanbanCategory.Complete;
 
-                 if (entity.Delivery.IsValid())
 
-                 {
 
-                     if (entity.Delivery.Completed != DateTime.MinValue)
 
-                     {
 
-                         return KanbanCategory.Complete;
 
-                     }
 
-                 }
 
-                 if (!entity.Filled.Equals(DateTime.MinValue))
 
-                     return KanbanCategory.Waiting;
 
-                 if (Provider.Query(
 
-                         new Filter<RequisitionItem>(x => x.RequisitionLink.ID).IsEqualTo(entity.ID),
 
-                         new Columns<RequisitionItem>(x => x.ID)
 
-                     ).Rows.Any()
 
-                    )
 
-                     return KanbanCategory.InProgress;
 
-                 return KanbanCategory.Open;
 
-             });
 
-         }
 
-         
 
-         protected override void BeforeDelete(Requisition entity)
 
-         {
 
-             UnlinkTrackingKanban<RequisitionKanban, Requisition, RequisitionLink>(entity);
 
-         }
 
-         
 
-         #region Delivery Items
 
-         private void CreateDeliveryItems(Requisition entity, ref IEnumerable<RequisitionItem> requisitionitems,
 
-             ref IEnumerable<DeliveryItem> deliveryitems)
 
-         {
 
-             if (!LoadRequisitionItems(entity, ref requisitionitems))
 
-             {
 
-                 Log("CreateDeliveryItems() - no requisition items to update");
 
-                 return;
 
-             }
 
-             var updates = new List<DeliveryItem>();
 
-             foreach (var item in requisitionitems)
 
-                 updates.Add(item.CreateDeliveryItem(entity));
 
-             if (updates.Any())
 
-                 FindSubStore<DeliveryItem>().Save(updates, "Requisition [Filled] flag has been set");
 
-             deliveryitems = updates;
 
-         }
 
-         private void ClearDeliveryItems(Requisition entity, ref IEnumerable<DeliveryItem> deliveryitems)
 
-         {
 
-             if (!LoadDeliveryItems(entity, ref deliveryitems))
 
-             {
 
-                 Log("ClearDeliveryItems() - no delivery items to update");
 
-                 return;
 
-             }
 
-             if (deliveryitems.Any())
 
-                 FindSubStore<DeliveryItem>().Delete(deliveryitems, "Requisition [Filled] flag has been cleared");
 
-             deliveryitems = new List<DeliveryItem>();
 
-         }
 
-         private void UpdateDeliveryItems(Requisition entity, ref IEnumerable<RequisitionItem> requisitionitems,
 
-             ref IEnumerable<DeliveryItem> deliveryitems)
 
-         {
 
-             Log("UpdateDeliveryItems() - starting");
 
-             if (!NeedsUpdating(entity, x => x.Filled))
 
-             {
 
-                 Log("UpdateDeliveryItems() - NeedsUpdate() return false");
 
-                 return;
 
-             }
 
-             var oldfilled = entity.GetOriginalValue(x => x.Filled);
 
-             var newfilled = entity.Filled;
 
-             // Gone from Blank to Filled -> Create a Batch
 
-             if (oldfilled.IsEmpty() && !newfilled.IsEmpty())
 
-             {
 
-                 Log("UpdateDeliveryItems() - Filled has been set");
 
-                 ClearDeliveryItems(entity, ref deliveryitems);
 
-                 CreateDeliveryItems(entity, ref requisitionitems, ref deliveryitems);
 
-             }
 
-             // Gone from Filled to Blank -> Clear Out the Batch
 
-             else if (newfilled.IsEmpty() && !oldfilled.IsEmpty())
 
-             {
 
-                 Log("UpdateDeliveryItems() - Filled has been cleared");
 
-                 ClearDeliveryItems(entity, ref deliveryitems);
 
-             }
 
-             // Do nothing - filled flag has been updated, not set or cleared
 
-             Log("UpdateDeliveryItems() - done");
 
-         }
 
-         #endregion
 
-         #region StockMovements
 
-         private void CreateStockMovement(List<StockMovement> updates, Guid employeeid, DateTime date, Guid batchid, Guid productid, Guid locationid,
 
-             Guid styleid, Guid jobid, double qty, IDimensions dimensions, Guid txnid, bool system, string note)
 
-         {
 
-             var movement = new StockMovement();
 
-             movement.Batch.ID = batchid;
 
-             movement.Product.ID = productid;
 
-             movement.Location.ID = locationid;
 
-             movement.Style.ID = styleid;
 
-             movement.Job.ID = jobid;
 
-             movement.Issued = qty < 0.0F ? Math.Abs(qty) : 0.0F;
 
-             movement.Received = qty > 0.0F ? qty : 0.0F;
 
-             movement.Qty = qty;
 
-             movement.Units = qty;
 
-             movement.Dimensions.CopyFrom(dimensions);
 
-             movement.System = system;
 
-             movement.Transaction = txnid;
 
-             movement.Notes = note;
 
-             movement.Date = date;
 
-             movement.Employee.ID = employeeid;
 
-             updates.Add(movement);
 
-         }
 
-         private void CreateStockBatch(Requisition entity, ref IEnumerable<RequisitionItem> items)
 
-         {
 
-             LoadRequisitionItems(entity, ref items);
 
-             if (!items.Any())
 
-             {
 
-                 Log("CreateStockBatch() - no items to update!");
 
-                 return;
 
-             }
 
-             var batch = new StockMovementBatch
 
-             {
 
-                 Type = StockMovementBatchType.Issue,
 
-                 TimeStamp = entity.Filled,
 
-                 Notes = string.Format("Requisition #{0}", entity.Number)
 
-             };
 
-             batch.Employee.ID = entity.Employee.ID;
 
-             batch.Requisition.ID = entity.ID;
 
-             FindSubStore<StockMovementBatch>().Save(batch, "");
 
-             var updates = new List<StockMovement>();
 
-             foreach (var item in items)
 
-             {
 
-                 
 
-                 var locationid = item.Location.ID;
 
-                 var productid = item.Product.ID;
 
-                 var styleid = item.Style.ID;
 
-                 var unitsize = item.Dimensions.UnitSize;
 
-                 var jobid = entity.JobLink.ID;
 
-                 var holdings = Provider.Query<StockHolding>(
 
-                     new Filter<StockHolding>(x => x.Location.ID).IsEqualTo(locationid)
 
-                         .And(x => x.Product.ID).IsEqualTo(productid)
 
-                         .And(x => x.Style.ID).IsEqualTo(styleid)
 
-                         .And(x => x.Dimensions.UnitSize).IsEqualTo(unitsize)
 
-                 );
 
-                 var holdingrow = holdings.Rows.FirstOrDefault(r => r.Get<StockHolding, Guid>(c => c.Job.ID).Equals(jobid));
 
-                 if (holdingrow == null)
 
-                     holdingrow = holdings.Rows.FirstOrDefault(r => r.Get<StockHolding, Guid>(c => c.Job.ID).Equals(Guid.Empty));
 
-                 if (holdingrow == null)
 
-                     holdingrow = holdings.Rows.FirstOrDefault();
 
-                 Guid holdingjobid = holdingrow != null
 
-                     ? holdingrow.Get<StockHolding, Guid>(c => c.Job.ID)
 
-                     : Guid.Empty;
 
-                 var qty = item.Quantity;
 
-                 var dimensions = item.Product.Dimensions;
 
-                 var txnid = Guid.Empty;
 
-                 if (jobid != holdingjobid)
 
-                 {
 
-                     txnid = Guid.NewGuid();
 
-                     CreateStockMovement(updates, entity.Employee.ID, DateTime.Now, batch.ID, productid, locationid, styleid, holdingjobid,
 
-                         0.0F - qty, dimensions, txnid, true, string.Format("Requisition #{0} Internal Transfer", entity.Number));
 
-                     CreateStockMovement(updates, entity.Employee.ID, DateTime.Now, batch.ID, productid, locationid, styleid, jobid, qty, dimensions, txnid, true,
 
-                         string.Format("Requisition #{0} Internal Transfer", entity.Number));
 
-                 }
 
-                 CreateStockMovement(updates, entity.Employee.ID, DateTime.Now, batch.ID, productid, locationid, styleid, jobid, 0.0F - qty, dimensions, txnid,
 
-                     false,
 
-                     string.Format("Requisition #{0}", entity.Number));
 
-             }
 
-             FindSubStore<StockMovement>().Save(updates, "");
 
-         }
 
-         private void ClearStockBatch(Requisition entity)
 
-         {
 
-             Log("ClearStockBatch()");
 
-             var batches = Provider.Query(
 
-                 new Filter<StockMovementBatch>(x => x.Requisition.ID).IsEqualTo(entity.ID),
 
-                 new Columns<StockMovementBatch>(x => x.ID)
 
-             ).Rows.Select(x => x.ToObject<StockMovementBatch>());
 
-             if (batches.Any())
 
-                 FindSubStore<StockMovementBatch>().Delete(batches, "");
 
-         }
 
-         private void UpdateStockBatches(Requisition entity, ref IEnumerable<RequisitionItem> items)
 
-         {
 
-             Log("UpdateStockBatch() - starting");
 
-             if (!NeedsUpdating(entity, x => x.StockUpdated))
 
-                 return;
 
-             var oldupdate = entity.GetOriginalValue(x => x.StockUpdated);
 
-             var newupdate = entity.StockUpdated;
 
-             // Gone from Blank to Updated -> Create a Batch
 
-             if (oldupdate.IsEmpty() && !newupdate.IsEmpty())
 
-             {
 
-                 Log("UpdateStockBatch() - creating batch");
 
-                 ClearStockBatch(entity);
 
-                 CreateStockBatch(entity, ref items);
 
-             }
 
-             // Gone from Updated to Blank -> Clear Out the Batch
 
-             else if (newupdate.IsEmpty() && !oldupdate.IsEmpty())
 
-             {
 
-                 Log("UpdateStockBatch() - clearing batch");
 
-                 ClearStockBatch(entity);
 
-             }
 
-             // Do nothing - Updated flag has been updated, not set or cleared
 
-             Log("UpdateStockBatch() - done");
 
-         }
 
-         #endregion
 
-     }
 
- }
 
 
  |