Esempio n. 1
0
        public void When_I_Call_SavePackingSlip_With_MembershipActivation_Flag_ActivateMembership_Should_Get_Called()
        {
            // Arrange
            string customerMail      = "*****@*****.**";
            var    validatorResponse = new ResponseMessage {
                IsSuccess = true
            };
            var creationResponse = new ResponseMessage {
                IsSuccess = true, Detail = "PS-004"
            };
            var packingSlip = new PackingSlipHeader
            {
                CustomerEmail      = customerMail,
                HasPhysicalProduct = true,
                ActivateMembership = true
            };

            // Act
            _mockFreeItemCheckerService.Setup(x => x.CheckForFreeItems(packingSlip)).ReturnsAsync(packingSlip);
            _mockPackingSlipValidator.Setup(x => x.IsPackingSlipRequestValid(packingSlip)).Returns(validatorResponse);
            _mockPackingSlipRepository.Setup(x => x.SavePackingSlipAsync(packingSlip)).ReturnsAsync(creationResponse);
            var result = _packingSlipSaveService.SavePackingSlip(packingSlip);

            // Assert
            _mockCustomerMembershipRepository.Verify(x => x.ActivateMembershipAsync(customerMail), Times.Once);
        }
Esempio n. 2
0
        public void When_I_Call_IsPackingSlipRequestValid_With_Empty_CustomerEmail_I_Should_Get_False()
        {
            // Arrange
            string customerEmail = string.Empty;
            var    packingSlip   = new PackingSlipHeader
            {
                PackingSlipItems = new List <PackingSlipItem>
                {
                    new PackingSlipItem
                    {
                        Name     = "Test Item",
                        Quantity = 2
                    }
                },
                AgentName         = It.IsAny <string>(),
                CustomerEmail     = customerEmail,
                CustomerName      = "Test Customer",
                PackingSlipNumber = "PS/001"
            };

            // Act
            var valid = _packingSlipValidator.IsPackingSlipRequestValid(packingSlip);

            // Assert
            Assert.AreEqual(valid.Detail, PackingSlipConstants.CustomerEmailCannotBeBlankMessage);
        }
Esempio n. 3
0
        public void When_I_Call_IsPackingSlipRequestValid_With_Empty_Agent_With_PhysicalProduct_I_Should_Get_False()
        {
            // Arrange
            string customerEmail      = "*****@*****.**";
            var    membershipResponse = new ResponseMessage {
                IsSuccess = false
            };
            var packingSlip = new PackingSlipHeader
            {
                PackingSlipItems = new List <PackingSlipItem>
                {
                    new PackingSlipItem
                    {
                        Name     = "Test Item",
                        Quantity = 2
                    }
                },
                AgentName          = string.Empty,
                HasPhysicalProduct = true,
                CustomerEmail      = customerEmail,
                CustomerName       = "Test Customer",
                PackingSlipNumber  = "PS/001"
            };

            // Act
            _mockCustomerMembershipRepository.Setup(x => x.IsMembershipValidForCreate(customerEmail)).Returns(membershipResponse);
            var valid = _packingSlipValidator.IsPackingSlipRequestValid(packingSlip);

            // Assert
            Assert.AreEqual(valid.Detail, PackingSlipConstants.AgentCannotBeBlankMessage);
        }
Esempio n. 4
0
        public void When_I_Call_IsPackingSlipRequestValid_With_Valid_PackingSlip_I_Should_Get_True()
        {
            // Arrange
            string customerEmail = "*****@*****.**";
            var    createMembershipCheckResponse = new ResponseMessage {
                IsSuccess = false
            };
            var membership = new CustomerMembership {
                Email = customerEmail, IsActivated = false, IsUpgraded = false
            };
            var packingSlip = new PackingSlipHeader
            {
                PackingSlipItems = new List <PackingSlipItem>
                {
                    new PackingSlipItem
                    {
                        Name     = "Test Item",
                        Quantity = 2
                    }
                },
                AgentName         = It.IsAny <string>(),
                CustomerEmail     = customerEmail,
                CustomerName      = "Test Customer",
                PackingSlipNumber = "PS/001"
            };

            // Act
            _mockCustomerMembershipRepository.Setup(x => x.IsMembershipValidForCreate(customerEmail)).Returns(createMembershipCheckResponse);
            var valid = _packingSlipValidator.IsPackingSlipRequestValid(packingSlip);

            // Assert
            Assert.IsTrue(valid.IsSuccess);
        }
        private PackingSlipHeader CheckAndAddFreeItems(PackingSlipHeader packingSlipHeader, FreeProductHeaderModel headerModel)
        {
            bool isApplicable = true;

            foreach (var parent in headerModel.ParentProducts)
            {
                var productExists = (from tmpLine in packingSlipHeader.PackingSlipItems where tmpLine.Name == parent.Name && tmpLine.Quantity >= parent.Quantity select tmpLine).FirstOrDefault();
                if (productExists == null)
                {
                    isApplicable = false;
                    break;
                }
            }

            if (isApplicable)
            {
                foreach (var child in headerModel.ChildProducts)
                {
                    packingSlipHeader.PackingSlipItems.Add(new PackingSlipItem
                    {
                        IsFreeItem = true,
                        Name       = child.Name,
                        ProductId  = child.ProductId,
                        Quantity   = child.Quantity
                    });
                }
            }

            return(packingSlipHeader);
        }
        public ResponseMessage IsPackingSlipRequestValid(PackingSlipHeader packingSlip)
        {
            ResponseMessage response = new ResponseMessage {
                IsSuccess = true
            };

            if (string.IsNullOrEmpty(packingSlip.CustomerEmail))
            {
                response.IsSuccess = false;
                response.Detail    = PackingSlipConstants.CustomerEmailCannotBeBlankMessage;
                return(response);
            }

            response = _customerMembershipRepository.IsMembershipValidForCreate(packingSlip.CustomerEmail);
            if (response.IsSuccess)
            {
                response = _customerMembershipRepository.SaveMembershipAsync(new CustomerMembership
                {
                    Email       = packingSlip.CustomerEmail,
                    IsActivated = false,
                    IsUpgraded  = false
                }).Result;
            }
            else
            {
                response.IsSuccess = true;
            }

            if ((packingSlip.HasPhysicalProduct.HasValue && packingSlip.HasPhysicalProduct.Value) ||
                (packingSlip.HasBook.HasValue && packingSlip.HasBook.Value))
            {
                if (string.IsNullOrEmpty(packingSlip.AgentName))
                {
                    response.IsSuccess = false;
                    response.Detail    = PackingSlipConstants.AgentCannotBeBlankMessage;
                    return(response);
                }
            }

            if (packingSlip.ActivateMembership.HasValue && packingSlip.ActivateMembership.Value)
            {
                response = _customerMembershipRepository.IsMembershipValidForActivate(packingSlip.CustomerEmail);
                if (!response.IsSuccess)
                {
                    return(response);
                }
            }

            if (packingSlip.UpgradeMembership.HasValue && packingSlip.UpgradeMembership.Value)
            {
                response = _customerMembershipRepository.IsMembershipValidForUpgrade(packingSlip.CustomerEmail);
                if (!response.IsSuccess)
                {
                    return(response);
                }
            }

            return(response);
        }
Esempio n. 7
0
        public async Task <IActionResult> SavePackingSlip([FromBody] PackingSlipHeader packingSlip)
        {
            var response = await _packingSlipSaveService.SavePackingSlip(packingSlip);

            if (response.IsSuccess)
            {
                packingSlip.PackingSlipNumber = response.Detail;
                _packingSlipPrintService.PrintPackingSlip(packingSlip);
            }

            return(Ok(response));
        }
        public async Task <PackingSlipHeader> CheckForFreeItems(PackingSlipHeader packingSlipHeader)
        {
            var freeProducts = await _freeProductRepository.GetFreeProductList();

            if (freeProducts.Any())
            {
                freeProducts.ForEach(s =>
                {
                    packingSlipHeader = CheckAndAddFreeItems(packingSlipHeader, s);
                });
            }

            return(packingSlipHeader);
        }
        private bool PrintSlip(PackingSlipHeader packingSlipHeader)
        {
            bool success = false;

            using (MemoryStream stream = new MemoryStream())
            {
                Document  document = new Document(PageSize.A4, 2, 2, 2, 2);
                PdfWriter writer   = PdfWriter.GetInstance(document, stream);

                document.Open();
                Font bodyFont = new Font(Font.HELVETICA, 10f, Font.NORMAL);

                float[] columnWidth = new float[] { 120f, 50f, 50f };

                PdfPTable table = new PdfPTable(3);
                table.SetWidths(columnWidth);

                PdfPCell header = new PdfPCell(new Phrase($"Packing Slip No: {packingSlipHeader.PackingSlipNumber} - Dated:{DateTime.Now}", FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                header.Colspan = 3;
                table.AddCell(header);

                PdfPCell productNameHeader = new PdfPCell(new Phrase($"Prduct Name", FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                table.AddCell(productNameHeader);
                productNameHeader = new PdfPCell(new Phrase($"Quantity", FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                table.AddCell(productNameHeader);
                productNameHeader = new PdfPCell(new Phrase($"Comments", FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                table.AddCell(productNameHeader);
                table.CompleteRow();

                foreach (var item in packingSlipHeader.PackingSlipItems)
                {
                    productNameHeader = new PdfPCell(new Phrase(item.Name, FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                    table.AddCell(productNameHeader);
                    productNameHeader = new PdfPCell(new Phrase(item.Quantity.ToString("N0"), FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                    table.AddCell(productNameHeader);
                    productNameHeader = new PdfPCell(new Phrase(string.Empty, FontFactory.GetFont(FontFactory.HELVETICA, 10)));
                    table.AddCell(productNameHeader);
                    table.CompleteRow();
                }

                document.Add(table);

                string fileName = Path.Combine(_fileConfig.DownloadPath, $"PackingSlip-{packingSlipHeader.PackingSlipNumber}.pdf");
                File.WriteAllBytes(fileName, stream.ToArray());
            }

            success = true;
            return(success);
        }
        public ResponseMessage PrintPackingSlip(PackingSlipHeader packingSlipHeader)
        {
            ResponseMessage response = new ResponseMessage {
                IsSuccess = false
            };
            bool success = false;

            if ((packingSlipHeader.HasPhysicalProduct.HasValue && packingSlipHeader.HasPhysicalProduct.Value) ||
                (packingSlipHeader.HasBook.HasValue && packingSlipHeader.HasBook.Value))
            {
                success = PrintSlip(packingSlipHeader);
            }
            response.IsSuccess = success;
            return(response);
        }
        public async Task <ResponseMessage> SavePackingSlipAsync(PackingSlipHeader packingSlip)
        {
            ResponseMessage message = new ResponseMessage {
                IsSuccess = false
            };
            int maxNumber = 0;

            try
            {
                using (IDbContextTransaction transaction = _context.Database.BeginTransaction())
                {
                    if (_context.PackingSlipHeaders.Any())
                    {
                        maxNumber = _context.PackingSlipHeaders.Max(s => s.Id);
                    }

                    packingSlip.PackingSlipNumber = $"PS-{maxNumber}";
                    _context.PackingSlipHeaders.Add(packingSlip);
                    await _context.SaveChangesAsync();

                    int packingId = packingSlip.Id;
                    foreach (var item in packingSlip.PackingSlipItems.ToList())
                    {
                        var product = _context.Products.FirstOrDefault(x => x.Name == item.Name);
                        _context.PackingSlipItems.Add(new PackingSlipItem
                        {
                            Amount        = (item.IsFreeItem.HasValue && item.IsFreeItem.Value) ? 0 : item.Quantity * product.Rate,
                            Name          = item.Name,
                            PackingSlipId = packingId,
                            Quantity      = item.Quantity,
                            ProductId     = product.Id,
                        });
                    }
                    await _context.SaveChangesAsync();

                    await transaction.CommitAsync();

                    message.IsSuccess = true;
                    message.Detail    = packingSlip.PackingSlipNumber;
                }
            }
            catch (Exception ex)
            {
            }

            return(message);
        }
        public async Task <ResponseMessage> SavePackingSlip(PackingSlipHeader packingSlip)
        {
            ResponseMessage message = new ResponseMessage {
                IsSuccess = true
            };

            packingSlip = await _freeItemCheckerService.CheckForFreeItems(packingSlip);

            message = _packingSlipValidator.IsPackingSlipRequestValid(packingSlip);

            if (!message.IsSuccess)
            {
                return(message);
            }

            message = await _packingSlipRepository.SavePackingSlipAsync(packingSlip);

            if ((packingSlip.HasPhysicalProduct.HasValue && packingSlip.HasPhysicalProduct.Value) ||
                (packingSlip.HasBook.HasValue && packingSlip.HasBook.Value))
            {
                await _agentCommissionRepository.AddAgentCommission(packingSlip, 100);
            }

            if (packingSlip.ActivateMembership.HasValue && packingSlip.ActivateMembership.Value)
            {
                await _customerMembershipRepository.ActivateMembershipAsync(packingSlip.CustomerEmail);

                await _emailService.SendMail(_fileConfig.UserCredential, packingSlip.CustomerEmail,
                                             PackingSlipConstants.MembershipActivationSubject, PackingSlipConstants.MembershipActivationBody,
                                             _fileConfig.UserCredential, _fileConfig.Password, _fileConfig.Host, _fileConfig.Port);
            }

            if (packingSlip.UpgradeMembership.HasValue && packingSlip.UpgradeMembership.Value)
            {
                await _customerMembershipRepository.UpgradeMembershipAsync(packingSlip.CustomerEmail);

                await _emailService.SendMail(_fileConfig.UserCredential, packingSlip.CustomerEmail,
                                             PackingSlipConstants.MembershipUpgradeSubject, PackingSlipConstants.MembershipUpgradeBody,
                                             _fileConfig.UserCredential, _fileConfig.Password, _fileConfig.Host, _fileConfig.Port);
            }

            return(message);
        }
Esempio n. 13
0
        public void When_I_Call_SavePackingSlip_With_Invalid_Option_I_Should_Get_Failure_Response()
        {
            // Arrange
            var validatorResponse = new ResponseMessage {
                IsSuccess = false
            };
            var packingSlip = new PackingSlipHeader
            {
                CustomerEmail = string.Empty
            };

            // Act
            _mockFreeItemCheckerService.Setup(x => x.CheckForFreeItems(packingSlip)).ReturnsAsync(packingSlip);
            _mockPackingSlipValidator.Setup(x => x.IsPackingSlipRequestValid(packingSlip)).Returns(validatorResponse);
            var result = _packingSlipSaveService.SavePackingSlip(packingSlip);

            // Assert
            Assert.IsFalse(result.Result.IsSuccess);
        }
        public async Task <ResponseMessage> AddAgentCommission(PackingSlipHeader packingSlipHeader, decimal amount)
        {
            ResponseMessage message = new ResponseMessage {
                IsSuccess = false
            };

            var commission = new AgentCommission
            {
                AgentName     = packingSlipHeader.AgentName,
                Amount        = amount,
                PackingSlipId = packingSlipHeader.Id
            };

            _context.AgentCommissions.Add(commission);
            await _context.SaveChangesAsync();

            message.IsSuccess = true;

            return(message);
        }
Esempio n. 15
0
        private static string PrintPackingSlip(PackingSlipHeader packingSlip)
        {
            string response    = string.Empty;
            string requestBody = JsonConvert.SerializeObject(packingSlip);

            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://localhost:44383");
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var apiResponse = client.PostAsync("https://localhost:44383/api/packing/SaveSlip", new StringContent(requestBody, Encoding.UTF8, "application/json")).Result;

                if (apiResponse != null && apiResponse.Content != null && apiResponse.IsSuccessStatusCode)
                {
                    var message = JsonConvert.DeserializeObject <ResponseMessage>(apiResponse.Content.ReadAsStringAsync().Result);
                    response = message.Detail;
                }
                else
                {
                    response = "Packing slip could not be generated";
                }
            }

            return(response);
        }
Esempio n. 16
0
        public void When_I_Call_SavePackingSlip_With_PhysicalProducts_AgentCommission_Should_Get_Called()
        {
            // Arrange
            var validatorResponse = new ResponseMessage {
                IsSuccess = true
            };
            var creationResponse = new ResponseMessage {
                IsSuccess = true, Detail = "PS-004"
            };
            var packingSlip = new PackingSlipHeader
            {
                CustomerEmail      = string.Empty,
                HasPhysicalProduct = true
            };

            // Act
            _mockFreeItemCheckerService.Setup(x => x.CheckForFreeItems(packingSlip)).ReturnsAsync(packingSlip);
            _mockPackingSlipValidator.Setup(x => x.IsPackingSlipRequestValid(packingSlip)).Returns(validatorResponse);
            _mockPackingSlipRepository.Setup(x => x.SavePackingSlipAsync(packingSlip)).ReturnsAsync(creationResponse);
            var result = _packingSlipSaveService.SavePackingSlip(packingSlip);

            // Assert
            _mockAgentCommissionRepository.Verify(x => x.AddAgentCommission(packingSlip, 100), Times.Once);
        }
Esempio n. 17
0
        static void Main(string[] args)
        {
            System.Console.WriteLine("Customer Email:");
            string customerMail = System.Console.ReadLine();

            System.Console.WriteLine("Customer Name:");
            string customerName = System.Console.ReadLine();

            System.Console.WriteLine("Agent Name:");
            string agentName = System.Console.ReadLine();

            System.Console.WriteLine("Activate Membership?(Y/N):");
            string membershipActivate = System.Console.ReadLine();

            System.Console.WriteLine("Upgrade Membership?(Y/N):");
            string membershipUpgrade = System.Console.ReadLine();

            System.Console.WriteLine("Has Physical products?(Y/N):");
            string physicalProduct = System.Console.ReadLine();

            System.Console.WriteLine("Has book?(Y/N):");
            string book = System.Console.ReadLine();

            System.Console.WriteLine("Enter item(s):");
            System.Console.WriteLine("Name:");
            List <string> itemList = new List <string>();
            string        itemName = System.Console.ReadLine();

            System.Console.WriteLine("Qty:");
            string qty = System.Console.ReadLine();

            if (!string.IsNullOrEmpty(itemName) && !string.IsNullOrEmpty(qty))
            {
                itemList.Add($"{itemName}``{qty}");
            }
            else
            {
                System.Console.WriteLine("Cannot continue with 0 items.");
                System.Console.ReadLine();
            }

            PackingSlipHeader packingSlip = new PackingSlipHeader
            {
                CustomerEmail      = customerMail,
                CustomerName       = customerName,
                AgentName          = agentName,
                ActivateMembership = membershipActivate.ToUpper() == "Y"?true:false,
                UpgradeMembership  = membershipUpgrade.ToUpper() == "Y"?true:false,
                HasPhysicalProduct = physicalProduct.ToUpper() == "Y"?true:false,
                HasBook            = book.ToUpper() == "Y"?true:false,
            };

            itemList.ForEach(s =>
            {
                string[] itemDetail = s.Split("``");
                packingSlip.PackingSlipItems.Add(new PackingSlipItem
                {
                    Name     = itemDetail[0],
                    Quantity = Convert.ToInt32(itemDetail[1])
                });
            });

            string output = PrintPackingSlip(packingSlip);

            System.Console.WriteLine(output);
            System.Console.ReadLine();
        }