public void Should_Success_Instantiate()
        {
            var date = DateTimeOffset.Now;
            ProductSKUInventoryDocumentModel document = new ProductSKUInventoryDocumentModel("DocumentNo", date, "ReferenceNo", "ReferenceType", 1, "StorageName", "StorageCode", "Type", "Remark");

            var items = new List <ProductSKUInventoryMovementModel>()
            {
                new ProductSKUInventoryMovementModel()
            };
            var products = new List <ProductSKUModel>()
            {
                new ProductSKUModel()
            };

            var uoms = new List <UnitOfMeasurementModel>()
            {
                new UnitOfMeasurementModel()
            };
            var categories = new List <CategoryModel>()
            {
                new CategoryModel()
            };
            DocumentDto dto = new DocumentDto(document, items, products, uoms, categories);

            Assert.Equal("DocumentNo", dto.DocumentNo);
            Assert.Equal("ReferenceNo", dto.ReferenceNo);
            Assert.Equal("ReferenceType", dto.ReferenceType);
            Assert.Equal("DocumentNo", dto.DocumentNo);
            Assert.Equal("Type", dto.Type);
            Assert.Equal("Remark", dto.Remark);
            Assert.True(DateTimeOffset.MinValue < dto.Date);
            Assert.NotNull(dto.Storage);
            Assert.NotNull(dto.Items);
        }
        public void Should_Success_AddDocument()
        {
            //Arrange
            var dbContext           = new PackingInventoryDbContext(CreateNewContextOptions(MethodBase.GetCurrentMethod().ReflectedType.FullName + MethodBase.GetCurrentMethod().Name));
            var serviceProviderMock = new Mock <IServiceProvider>();

            serviceProviderMock
            .Setup(serviceProvider => serviceProvider
                   .GetService(typeof(IIdentityProvider)))
            .Returns(new IdentityProvider()
            {
                TimezoneOffset = 1, Token = "token", Username = "******"
            });


            var productSKUInventoryDocument = new ProductSKUInventoryDocumentModel("documentNo", DateTimeOffset.Now, "ReferenceNo", "ReferenceType", 1, "storagename", "storagecode", "type", "remark");

            dbContext.ProductSKUInventoryDocuments.Add(productSKUInventoryDocument);

            dbContext.SaveChanges();

            var unitOfWork = new UnitOfWork(dbContext, serviceProviderMock.Object);


            var azureServiceBusSenderMock = new Mock <IAzureServiceBusSender <ProductSKUInventoryMovementModel> >();
            var service = GetService(GetServiceProvider(unitOfWork, azureServiceBusSenderMock.Object).Object);

            var data = new FormDto()
            {
                Date          = DateTimeOffset.Now,
                ReferenceNo   = "ReferenceNo",
                ReferenceType = "ReferenceType",
                Remark        = "Remark",
                Storage       = new Application.DTOs.StorageDto()
                {
                    _id  = 1,
                    code = "storagecode",
                    name = "storagename",
                },
                Items = new List <FormItemDto>()
                {
                    new FormItemDto()
                    {
                        ProductSKUId = 1,
                        Quantity     = 1,
                        Remark       = "Remark",
                        UOMId        = 1
                    }
                },
                Type = "IN",
            };


            //Act
            var result = service.AddDocument(data);

            //Assertion
            Assert.True(-1 < result);
        }
 public DocumentDto(ProductSKUInventoryDocumentModel document, List <ProductSKUInventoryMovementModel> items, List <ProductSKUModel> products, List <UnitOfMeasurementModel> uoms, List <CategoryModel> categories)
 {
     DocumentNo    = document.DocumentNo;
     Date          = document.Date;
     ReferenceNo   = document.ReferenceNo;
     ReferenceType = document.ReferenceType;
     Type          = document.Type;
     Storage       = new Storage()
     {
         Code = document.StorageCode,
         Id   = document.StorageId,
         Name = document.StorageName
     };
     Remark = document.Remark;
     Items  = items.Select(item =>
     {
         var product  = products.FirstOrDefault(element => element.Id == item.ProductSKUId);
         var uom      = uoms.FirstOrDefault(element => element.Id == item.UOMId);
         var category = categories.FirstOrDefault(element => element.Id == product.CategoryId);
         return(new DocumentItemDto(item, product, uom, category));
     }).ToList();
 }
        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);
        }