| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 | using System;using Comal.Classes;using System.Collections.Generic;using InABox.Core;using System.Linq;namespace Comal.Stores{    public class ConsignmentStore : BaseStore<Consignment>    {        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<Consignment, DateTime>("ActualWarehouseArrival") != DateTime.MinValue)                return;            //find previously saved PO Items attached to this consignment            var purchaseOrderItemTable = Provider.Query<PurchaseOrderItem>(                new Filter<PurchaseOrderItem>(x => x.Consignment.ID).IsEqualTo(entity.ID),                Columns.None<PurchaseOrderItem>().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<Guid>();            var purchaseOrderID = firstPOItem.Get<PurchaseOrderItem, Guid>(x => x.PurchaseOrderLink.ID);            var table = Provider.Query<ConsignmentDocument>            (                new Filter<ConsignmentDocument>(x => x.EntityLink.ID).IsEqualTo(entity.ID),                Columns.None<ConsignmentDocument>().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<StockMovement>(x => x.OrderItem.ID).InList(purchaseOrderItemTable.Rows.Select(x => x.Get<PurchaseOrderItem, Guid>(x => x.ID)).ToArray());                        var stockMovementTable = Provider.Query<StockMovement>(                filter,                Columns.None<StockMovement>().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<StockMovement, Guid>(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<StockMovement>();                foreach (var movement in stockMovementTable.ToObjects<StockMovement>())                {                    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<StockMovementBatchDocument>();                foreach (var id in consignmentDocIDs)                {                    var smd = new StockMovementBatchDocument();                    smd.EntityLink.ID = batch.ID;                    smd.DocumentLink.ID = id;                    stockMovementBatchDocuments.Add(smd);                }                Provider.Save<StockMovementBatchDocument>(stockMovementBatchDocuments);            }        }        private List<Guid> SavePurchaseOrderDocuments(CoreTable table, Guid purchaseOrderID)        {            var consignmentDocIDs = new List<Guid>();            var purchaseOrderDocuments = new List<PurchaseOrderDocument>();            foreach (var row in table.Rows)            {                var docID = row.Get<ConsignmentDocument, Guid>(x => x.DocumentLink.ID);                consignmentDocIDs.Add(docID);                var PODocument = new PurchaseOrderDocument();                PODocument.DocumentLink.ID = docID;                PODocument.EntityLink.ID = purchaseOrderID;                var existingPODocs = Provider.Query<PurchaseOrderDocument>(                    new Filter<PurchaseOrderDocument>(x => x.DocumentLink.ID).IsEqualTo(docID), //check that PO document doesn't already exist                    Columns.None<PurchaseOrderDocument>().Add(x => x.ID));                if (existingPODocs.Rows.Count == 0)                    purchaseOrderDocuments.Add(PODocument);                           }            if (purchaseOrderDocuments.Any())                Provider.Save<PurchaseOrderDocument>(purchaseOrderDocuments);            return consignmentDocIDs;        }           }}
 |