public void AddMovement(ProductSKUInventoryMovementModel inventoryMovement)
        {
            var summary = _unitOfWork.ProductSKUInventorySummaries.Get().FirstOrDefault(entity => entity.ProductSKUId == inventoryMovement.ProductSKUId && entity.UOMId == inventoryMovement.UOMId && entity.StorageId == inventoryMovement.StorageId);

            if (summary == null)
            {
                switch (inventoryMovement.Type.ToUpper())
                {
                case "IN":
                    inventoryMovement.SetCurrentBalance(inventoryMovement.Quantity);
                    break;

                case "OUT":
                    inventoryMovement.SetCurrentBalance(inventoryMovement.Quantity * -1);
                    break;

                case "ADJ":
                    inventoryMovement.SetCurrentBalance(inventoryMovement.Quantity);
                    break;

                default:
                    throw new Exception("Invalid Type");
                }
                _unitOfWork.ProductSKUInventoryMovements.Insert(inventoryMovement);

                summary = new ProductSKUInventorySummaryModel(inventoryMovement.ProductSKUId, inventoryMovement.StorageId, inventoryMovement.StorageCode, inventoryMovement.StorageName, inventoryMovement.UOMId);
                summary.SetBalance(inventoryMovement.CurrentBalance);
                _unitOfWork.ProductSKUInventorySummaries.Insert(summary);
            }
            else
            {
                inventoryMovement.SetPreviousBalance(summary.Balance);
                switch (inventoryMovement.Type.ToUpper())
                {
                case "IN":
                    inventoryMovement.SetCurrentBalance(inventoryMovement.Quantity);
                    break;

                case "OUT":
                    inventoryMovement.SetCurrentBalance(inventoryMovement.Quantity * -1);
                    break;

                case "ADJ":
                    inventoryMovement.SetCurrentBalance(inventoryMovement.Quantity);
                    break;

                default:
                    throw new Exception("Invalid Type");
                }
                _unitOfWork.ProductSKUInventoryMovements.Insert(inventoryMovement);

                summary.SetBalance(inventoryMovement.CurrentBalance);
                _unitOfWork.ProductSKUInventorySummaries.Update(summary);
            }

            _unitOfWork.Commit();
        }
        public void Should_Success_instantiateProductSKUInventorySummaryModel()
        {
            var model = new ProductSKUInventorySummaryModel(0, 0, "storageCode", "storageName", 1);

            model.SetBalance(4);
            model.AddBalance(1);
            model.AdjustBalance(1);
            model.ReduceBalance(1);
            Assert.NotNull(model);
        }
        public int AddDocument(FormDto form)
        {
            var documentNo = CodeGenerator.GenerateCode();

            do
            {
                documentNo = CodeGenerator.GenerateCode();
            }while (_unitOfWork.ProductSKUInventoryDocuments.Get(entity => entity.DocumentNo == documentNo).Count() > 0);

            var model = new ProductSKUInventoryDocumentModel(
                documentNo,
                form.Date.GetValueOrDefault(),
                form.ReferenceNo,
                form.ReferenceType,
                form.Storage._id.GetValueOrDefault(),
                form.Storage.name,
                form.Storage.code,
                form.Type,
                form.Remark);

            _unitOfWork.ProductSKUInventoryDocuments.Insert(model);
            _unitOfWork.Commit();

            if (model.Id > 0)
            {
                foreach (var item in form.Items)
                {
                    var movementItem = new ProductSKUInventoryMovementModel(model.Id, item.ProductSKUId.GetValueOrDefault(), item.UOMId.GetValueOrDefault(), model.StorageId, model.StorageCode, model.StorageName, item.Quantity.GetValueOrDefault(), model.Type, item.Remark);

                    var summary = _unitOfWork.ProductSKUInventorySummaries.Get(element => element.ProductSKUId == item.ProductSKUId.GetValueOrDefault() && element.StorageId == model.StorageId && item.UOMId.GetValueOrDefault() == element.StorageId).FirstOrDefault();

                    if (summary == null)
                    {
                        switch (movementItem.Type.ToUpper())
                        {
                        case "IN":
                            movementItem.SetCurrentBalance(movementItem.Quantity);
                            break;

                        case "OUT":
                            movementItem.SetCurrentBalance(movementItem.Quantity * -1);
                            break;

                        case "ADJ":
                            movementItem.SetCurrentBalance(movementItem.Quantity);
                            break;

                        default:
                            throw new Exception("Invalid Type");
                        }

                        summary = new ProductSKUInventorySummaryModel(item.ProductSKUId.GetValueOrDefault(), model.StorageId, model.StorageCode, model.StorageName, item.UOMId.GetValueOrDefault());
                        summary.SetBalance(movementItem.CurrentBalance);
                        _unitOfWork.ProductSKUInventorySummaries.Insert(summary);
                    }
                    else
                    {
                        movementItem.SetPreviousBalance(summary.Balance);
                        switch (movementItem.Type.ToUpper())
                        {
                        case "IN":
                            movementItem.SetCurrentBalance(movementItem.Quantity);
                            break;

                        case "OUT":
                            movementItem.SetCurrentBalance(movementItem.Quantity * -1);
                            break;

                        case "ADJ":
                            movementItem.SetCurrentBalance(movementItem.Quantity);
                            break;

                        default:
                            throw new Exception("Invalid Type");
                        }

                        summary.SetBalance(movementItem.CurrentBalance);
                        _unitOfWork.ProductSKUInventorySummaries.Update(summary);
                    }

                    _unitOfWork.ProductSKUInventoryMovements.Insert(movementItem);
                    _unitOfWork.Commit();
                }
            }

            return(model.Id);
        }