123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- using Comal.Classes;
- using System;
- 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);
- Guid purchaseOrderID = Guid.Empty;
- //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
- CoreTable purchaseOrderItemTable = Provider.Query<PurchaseOrderItem>(
- new Filter<PurchaseOrderItem>(x => x.Consignment.ID).IsEqualTo(entity.ID),
- new Columns<PurchaseOrderItem>(x => x.ID, x => x.PurchaseOrderLink.ID)
- );
- if (!purchaseOrderItemTable.Rows.Any())
- return;
- List<Guid> consignmentDocIDs = new List<Guid>();
- if (purchaseOrderItemTable.Rows.FirstOrDefault().Values[1] == null)
- purchaseOrderID = Guid.Empty;
- else
- purchaseOrderID = Guid.Parse(purchaseOrderItemTable.Rows.FirstOrDefault().Values[1].ToString());
- CoreTable table = Provider.Query<ConsignmentDocument>
- (
- new Filter<ConsignmentDocument>(x => x.EntityLink.ID).IsEqualTo(entity.ID),
- new Columns<ConsignmentDocument>(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
- Filter<StockMovement> filter =
- new Filter<StockMovement>(x => x.OrderItem.ID).IsEqualTo(Guid.Parse(purchaseOrderItemTable.Rows.FirstOrDefault().Values[0].ToString()));
- foreach (CoreRow row in purchaseOrderItemTable.Rows)
- {
- if (row != purchaseOrderItemTable.Rows.FirstOrDefault())
- {
- List<object> list = row.Values;
- filter = filter.Or(x => x.OrderItem.ID).IsEqualTo(Guid.Parse(list[0].ToString()));
- }
- }
- CoreTable stockMovementTable = Provider.Query<StockMovement>(
- filter,
- new Columns<StockMovement>(
- 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
- if (Guid.Parse(stockMovementTable.Rows.FirstOrDefault().Values[2].ToString()) != Guid.Empty)
- return;
- //create new stockmovementbatch to attach new stockmovements to (movements created by server)
- StockMovementBatch batch = new StockMovementBatch();
- batch.Type = StockMovementBatchType.Receipt;
- Provider.Save(batch);
- //add found stockmovements to batch, add stockmovements to save
- List<StockMovement> movements = new List<StockMovement>();
- foreach (CoreRow row in stockMovementTable.Rows)
- {
- List<object> list1 = row.Values;
- StockMovement movement = new StockMovement
- {
- ID = Guid.Parse(list1[0].ToString()),
- Notes = list1[1].ToString()
- };
- movement.Batch.ID = batch.ID;
- movement.Employee.ID = entity.Employee.ID;
- movement.Notes = movement.Notes + " / Consignment " + entity.Number;
- movements.Add(movement);
- }
- Provider.Save(movements);
- List<StockMovementBatchDocument> stockMovementBatchDocuments = new List<StockMovementBatchDocument>();
- foreach (Guid 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)
- {
- List<Guid> consignmentDocIDs = new List<Guid>();
- List<PurchaseOrderDocument> purchaseOrderDocuments = new List<PurchaseOrderDocument>();
- foreach (CoreRow row in table.Rows)
- {
- List<object> list = row.Values;
- Guid docID = Guid.Parse(list[0].ToString());
- consignmentDocIDs.Add(docID);
- PurchaseOrderDocument PODocument = new PurchaseOrderDocument();
- PODocument.DocumentLink.ID = docID;
- PODocument.EntityLink.ID = purchaseOrderID;
- CoreTable existingPODocs = Provider.Query<PurchaseOrderDocument>(
- new Filter<PurchaseOrderDocument>(x => x.DocumentLink.ID).IsEqualTo(docID), //check that PO document doesn't already exist
- new Columns<PurchaseOrderDocument>(x => x.ID));
- if (existingPODocs.Rows.Count == 0)
- purchaseOrderDocuments.Add(PODocument);
- }
- if (purchaseOrderDocuments.Any())
- Provider.Save<PurchaseOrderDocument>(purchaseOrderDocuments);
- return consignmentDocIDs;
- }
- }
- }
|