using System; using Comal.Classes; using System.Collections.Generic; using InABox.Core; using System.Linq; namespace Comal.Stores { public class ConsignmentStore : BaseStore { protected override void BeforeSave(Consignment entity) { base.BeforeSave(entity); } protected override void AfterSave(Consignment entity) { base.AfterSave(entity); //consignment has to be newly completed (usually done via receivals module) - checks further down as well to ensure no repeated saving of documents / batches if (entity.ActualWarehouseArrival == DateTime.MinValue) return; if (entity.HasOriginalValue(x => x.ActualWarehouseArrival) && entity.GetOriginalValue("ActualWarehouseArrival") != DateTime.MinValue) return; //find previously saved PO Items attached to this consignment var purchaseOrderItemTable = Provider.Query( new Filter(x => x.Consignment.ID).IsEqualTo(entity.ID), Columns.None().Add(x => x.ID, x => x.PurchaseOrderLink.ID) ); var firstPOItem = purchaseOrderItemTable.Rows.FirstOrDefault(); if (firstPOItem is null) // i.e., there are no PO Items, return return; var consignmentDocIDs = new List(); var purchaseOrderID = firstPOItem.Get(x => x.PurchaseOrderLink.ID); var table = Provider.Query ( new Filter(x => x.EntityLink.ID).IsEqualTo(entity.ID), Columns.None().Add(x => x.DocumentLink.ID) ); if (table.Rows.Any()) { consignmentDocIDs = SavePurchaseOrderDocuments(table, purchaseOrderID); } //build filter for querying stock movements attached to PO Items on this consignment var filter = new Filter(x => x.OrderItem.ID).InList(purchaseOrderItemTable.Rows.Select(x => x.Get(x => x.ID)).ToArray()); var stockMovementTable = Provider.Query( filter, Columns.None().Add( x => x.ID, x => x.Notes, x => x.Batch.ID )); if (stockMovementTable.Rows.Any()) { //check if movements already have a batch.id - means photos would have already been saved var batchID = stockMovementTable.Rows.First().Get(x => x.Batch.ID); if (batchID != Guid.Empty) return; //create new stockmovementbatch to attach new stockmovements to (movements created by server) var batch = new StockMovementBatch(); batch.Type = StockMovementBatchType.Receipt; Provider.Save(batch); //add found stockmovements to batch, add stockmovements to save var movements = new List(); foreach (var movement in stockMovementTable.ToObjects()) { movement.Batch.ID = batch.ID; movement.Employee.ID = entity.Employee.ID; movement.Notes = movement.Notes + " / Consignment " + entity.Number; movements.Add(movement); } Provider.Save(movements); var stockMovementBatchDocuments = new List(); foreach (var id in consignmentDocIDs) { var smd = new StockMovementBatchDocument(); smd.EntityLink.ID = batch.ID; smd.DocumentLink.ID = id; stockMovementBatchDocuments.Add(smd); } Provider.Save(stockMovementBatchDocuments); } } private List SavePurchaseOrderDocuments(CoreTable table, Guid purchaseOrderID) { var consignmentDocIDs = new List(); var purchaseOrderDocuments = new List(); foreach (var row in table.Rows) { var docID = row.Get(x => x.DocumentLink.ID); consignmentDocIDs.Add(docID); var PODocument = new PurchaseOrderDocument(); PODocument.DocumentLink.ID = docID; PODocument.EntityLink.ID = purchaseOrderID; var existingPODocs = Provider.Query( new Filter(x => x.DocumentLink.ID).IsEqualTo(docID), //check that PO document doesn't already exist Columns.None().Add(x => x.ID)); if (existingPODocs.Rows.Count == 0) purchaseOrderDocuments.Add(PODocument); } if (purchaseOrderDocuments.Any()) Provider.Save(purchaseOrderDocuments); return consignmentDocIDs; } } }