Пример #1
0
        public void ShouldFillOperationColumns()
        {
            // Arrange
            SalesService salesService = new SalesService(
                this.operationTableRepository,
                this.balanceTableRepository,
                this.blockedMoneyTableRepository,
                this.sharesNumberTableRepository,
                this.blockedSharesNumberTableRepository,
                this.shareTableRepository);
            var testBlockedMoney = new BlockedMoneyEntity()
            {
                Id            = 2,
                CreatedAt     = DateTime.Now,
                ClientBalance = new BalanceEntity()
                {
                    Id = 2
                },
                Operation = new OperationEntity()
                {
                    Id = 1
                },
                Customer = new ClientEntity()
                {
                    Id = 2
                },
                Total = 1000.00M
            };
            var testBlockedSharesNumber = new BlockedSharesNumberEntity()
            {
                Id                 = 2,
                CreatedAt          = DateTime.Now,
                ClientSharesNumber = new SharesNumberEntity()
                {
                    Id = 4
                },
                Operation = new OperationEntity()
                {
                    Id = 1
                },
                Seller = new ClientEntity()
                {
                    Id = 1
                },
                Share = new ShareEntity()
                {
                    Id = 3
                },
                ShareTypeName = "sharename",
                Cost          = 500,
                Number        = 3,
            };

            // Act
            salesService.FillOperationColumns(testBlockedMoney, testBlockedSharesNumber);

            // Assert
            operationTableRepository.Received(1).FillAllColumns(testBlockedMoney, testBlockedSharesNumber, Arg.Any <DateTime>());
            operationTableRepository.Received(1).SaveChanges();
        }
        public void FillCustomerColumns(BlockedMoneyEntity blockedMoney)
        {
            var operation = this.dBContext.Operations.First(o => o.Id == blockedMoney.Operation.Id); // it will fall here if we can't find

            operation.DebitDate = blockedMoney.CreatedAt;
            operation.Customer  = blockedMoney.Customer;
            operation.Total     = blockedMoney.Total;
        }
Пример #3
0
        public void FillAllColumns(BlockedMoneyEntity blockedMoney, BlockedSharesNumberEntity blockedSharesNumber, DateTime chargeDate)
        {
            var operation = this.dBContext.Operations.First(o => o.Id == blockedMoney.Operation.Id); // it will fall here if we can't find

            operation.DebitDate     = blockedMoney.CreatedAt;
            operation.Customer      = blockedMoney.Customer;
            operation.Total         = blockedMoney.Total;
            operation.Seller        = blockedSharesNumber.Seller;
            operation.Share         = blockedSharesNumber.Share;
            operation.ShareTypeName = blockedSharesNumber.ShareTypeName;
            operation.Cost          = blockedSharesNumber.Cost;
            operation.Number        = blockedSharesNumber.Number;
            operation.ChargeDate    = chargeDate;
        }
Пример #4
0
        /* 'Blocked money' methods
         */
        public BlockedMoneyEntity CreateBlockedMoney(BlockedMoneyRegistrationInfo args)
        {
            var entityToAdd = new BlockedMoneyEntity()
            {
                CreatedAt     = DateTime.Now,
                ClientBalance = args.ClientBalance,
                Operation     = args.Operation,
                Customer      = args.ClientBalance.Client,
                Total         = args.Total
            };

            this.blockedMoneyTableRepository.Add(entityToAdd);

            this.blockedMoneyTableRepository.SaveChanges();

            return(entityToAdd);
        }
Пример #5
0
        public void FillOperationColumns(BlockedMoneyEntity blockedMoney, BlockedSharesNumberEntity blockedSharesNumber)
        {
            /* Operation entity:
             * DateTime DebitDate { get; set; } // it's date from Customer blocked money
             * ClientEntity Customer { get; set; }
             * DateTime ChargeDate { get; set; } // it's date of finish
             * ClientEntity Seller { get; set; }
             * ShareEntity Share { get; set; }
             * string ShareTypeName { get; set; } // see ShareTypeEntity.Name (The name will be fixed here at the time of purchase)
             * decimal Cost { get; set; } // see ShareTypeEntity.Cost (The cost will be fixed here at the time of purchase)
             * int Number { get; set; } // Number of shares for deal
             * decimal Total { get; set; } // Total = Cost * Number
             */

            this.operationTableRepository.FillAllColumns(blockedMoney, blockedSharesNumber, DateTime.Now);

            this.operationTableRepository.SaveChanges();
        }
Пример #6
0
        public void ShouldRemoveBlockedMoneyItem()
        {
            // Arrange
            SalesService salesService = new SalesService(
                this.operationTableRepository,
                this.balanceTableRepository,
                this.blockedMoneyTableRepository,
                this.sharesNumberTableRepository,
                this.blockedSharesNumberTableRepository);
            BlockedMoneyEntity blockedMoney = new BlockedMoneyEntity()
            {
                Id = 4
            };

            // Act
            salesService.RemoveBlockedMoney(blockedMoney);

            // Assert
            blockedMoneyTableRepository.Received(1).Remove(blockedMoney.Id);
            blockedMoneyTableRepository.Received(1).SaveChanges();
        }
 public void Add(BlockedMoneyEntity entity)
 {
     this.dBContext.BlockedMoneys.Add(entity);
 }
Пример #8
0
        /* Sale
         * 0.  Get info about purchase from program (Customer, Number of Shares, Total (money))
         * 1.  Create empty operation
         * 2.1 Get Customer balance info
         * 2.2 - Customer balance amount
         * 3.  Create blocked money
         * 4.1 Get Seller shares number info
         * 4.2 - Seller shares number
         * 5.  Create blocked shares number // after that action purchase can't cancel
         * 6.1 Get Seller balance info
         * 6.2 + Seller balance amount
         * 7.1 Get Customer shares number info
         * 7.2 + Customer shares number
         * 8.  Fill operation columns
         * 9.  Remove blocked money
         * 10. Remove blocked shares number
         */
        public void Deal(int customerId, int sellerId, int shareId, int requiredSharesNumber)
        {
            OperationEntity    operation            = null;
            SharesNumberEntity customerSharesNumber = null;
            SharesNumberEntity sellerSharesNumber   = null;
            ClientEntity       customer             = null;
            //ClientEntity seller = null;
            BalanceEntity      customerBalance = null;
            BalanceEntity      sellerBalance   = null;
            ShareEntity        share           = null;
            BlockedMoneyEntity blockedMoney    = null;
            bool blockedMoneyFlag = false;
            BlockedSharesNumberEntity blockedSharesNumber = null;
            bool    blockedSharesNumberFlag = false;
            decimal customerBalanceAmount   = 0M;
            decimal total = 0M;
            int     sellerSharesNumberNumber = 0;

            operation = CreateOperation();
            try
            {
                sellerSharesNumber = SearchSharesNumberForBuy(shareId, requiredSharesNumber); // search required shares on stock exchange
                //seller = sellerSharesNumber.Client;
                //share = sellerSharesNumber.Share;
                share           = GetShare(shareId);
                customerBalance = SearchBalanceByClientId(customerId);
                customer        = customerBalance.Client;
                //sellerBalance = SearchBalanceByClientId(seller.Id);
                sellerBalance = SearchBalanceByClientId(sellerId);

                // get total
                CheckShareAndShareTypeStatuses(share);
                total = share.Type.Cost * requiredSharesNumber;

                // Blocked money
                customerBalanceAmount = customerBalance.Amount;
                if (customerBalanceAmount < total)
                {
                    throw new ArgumentException("Customer don't have enough money.");
                }
                blockedMoneyFlag = ChangeBalance(customerBalance, customerBalanceAmount - total);
                blockedMoney     = CreateBlockedMoney(new BlockedMoneyRegistrationInfo()
                {
                    Operation     = operation,
                    ClientBalance = customerBalance,
                    Total         = total
                });

                // Blocked shares Number
                sellerSharesNumberNumber = sellerSharesNumber.Number;
                blockedSharesNumberFlag  = ChangeSharesNumber(sellerSharesNumber, sellerSharesNumberNumber - requiredSharesNumber);
                blockedSharesNumber      = CreateBlockedSharesNumber(new BlockedSharesNumberRegistrationInfo()
                {
                    ClientSharesNumber = sellerSharesNumber,
                    Operation          = operation,
                    //Share = sellerSharesNumber.Share,
                    //ShareTypeName = sellerSharesNumber.Share.Type.Name,
                    //Cost = sellerSharesNumber.Share.Type.Cost,
                    Number = requiredSharesNumber
                });
            }
            catch
            {
                RemoveOperation(operation);

                if (blockedMoneyFlag)
                {
                    ChangeBalance(customerBalance, customerBalanceAmount + total);
                    if (blockedMoney != null)
                    {
                        RemoveBlockedMoney(blockedMoney);
                    }
                }

                if (blockedSharesNumberFlag)
                {
                    ChangeSharesNumber(sellerSharesNumber, sellerSharesNumberNumber + requiredSharesNumber);
                    if (blockedSharesNumber != null)
                    {
                        RemoveBlockedSharesNumber(blockedSharesNumber);
                    }
                }

                // throw new ArgumentException($"Deal was broken cause: {e.Message}");
                throw;
            }

            if (sellerSharesNumber.Number == 0)
            {
                RemoveSharesNumber(sellerSharesNumber);
            }

            ChangeBalance(sellerBalance, sellerBalance.Amount + total);

            customerSharesNumber = SearchOrCreateSharesNumberForAddition(customer, share);
            ChangeSharesNumber(customerSharesNumber, customerSharesNumber.Number + requiredSharesNumber);

            FillOperationColumns(blockedMoney, blockedSharesNumber);

            RemoveBlockedMoney(blockedMoney);
            RemoveBlockedSharesNumber(blockedSharesNumber);
        }
Пример #9
0
        public void RemoveBlockedMoney(BlockedMoneyEntity blockedMoney)
        {
            this.blockedMoneyTableRepository.Remove(blockedMoney.Id);

            this.blockedMoneyTableRepository.SaveChanges();
        }