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;
- }
- }
- }
|