Ejemplo n.º 1
0
        public SellOrderResponseDto Execute(SellOrdersRequestDto request)
        {
            var validateRequest = ValidateRequestStructure.Execute(request);

            if (validateRequest.Any())
            {
                return(SellOrderResponseDto.Build(validateRequest, null));
            }

            var validateBusinessRules = validateSellOrderBusinessRules.Execute(request);

            if (validateBusinessRules.ErrorList != null && validateBusinessRules.ErrorList.Any())
            {
                messageErrorList.AddRange(validateBusinessRules.ErrorList);
            }

            request.OrderList = validateBusinessRules.Result;

            var sellOrderProcess = processSellOrder.Execute(request);

            if (sellOrderProcess.ErrorList != null && sellOrderProcess.ErrorList.Any())
            {
                messageErrorList.AddRange(sellOrderProcess.ErrorList);
            }

            return(SellOrderResponseDto.Build(messageErrorList, sellOrderProcess.Result));
        }
Ejemplo n.º 2
0
        internal OperationResult <CurrentBalanceDto> Execute(SellOrdersRequestDto request)
        {
            currentBalance = CurrentBalanceDto.ConvertFromInitialBalance(request.InitialBalance);
            if (!request.OrderList.Any())
            {
                return(new OperationResult <CurrentBalanceDto>(currentBalance));
            }
            messageErrorList = new List <ErrorDto>();
            var orderList = request.OrderList.OrderBy(x => x.TimeStamp).ToList();

            orderList.ForEach(x =>
            {
                switch (x.Operation)
                {
                case "SELL":
                    SellOperation(x);
                    break;

                case "BUY":
                    BuyOperation(x);
                    break;
                }
            });
            return(new OperationResult <CurrentBalanceDto>(currentBalance, messageErrorList, true));
        }
Ejemplo n.º 3
0
        private OperationResult <SellOrdersRequestDto> MapAndValidateFileStructure(IEnumerable <string> fileLines)
        {
            if (fileLines == null || fileLines.Count() < 2)
            {
                return(new OperationResult <SellOrdersRequestDto>(ErrorDto.BuildUser("Structure file {0}, is incorrect")));
            }

            var fileProcess = fileLines.ToArray();

            var initialBalance = new InitialBalanceDto();
            var orderList      = new List <OrderDto>();

            for (int i = 0; i < fileProcess.Length; i++)
            {
                if (i == 0)
                {
                    var processInitiBalalance = deserialize.Execute <InitialBalanceJsonDto>(fileProcess[i]);
                    if (processInitiBalalance.Failure)
                    {
                        return(new OperationResult <SellOrdersRequestDto>(processInitiBalalance.ErrorList));
                    }
                    initialBalance = processInitiBalalance.Result.InitialBalance;
                }
                else
                {
                    var processOrder = deserialize.Execute <OrderDto>(fileProcess[i]);
                    if (processOrder.Failure)
                    {
                        return(new OperationResult <SellOrdersRequestDto>(processOrder.ErrorList));
                    }
                    if (processOrder.Result != null)
                    {
                        orderList.Add(processOrder.Result);
                    }
                }
            }



            var response = new SellOrdersRequestDto()
            {
                InitialBalance = initialBalance,
                OrderList      = orderList
            };

            return(new OperationResult <SellOrdersRequestDto>(response));
        }
Ejemplo n.º 4
0
        internal static IEnumerable <ErrorDto> Execute(SellOrdersRequestDto request)
        {
            var messageErrorList = new List <ErrorDto>();

            if (request == null)
            {
                messageErrorList.Add(ErrorDto.BuildUser("Request can't be null."));
                return(messageErrorList);
            }
            ;
            if (request.InitialBalance == null)
            {
                messageErrorList.Add(ErrorDto.BuildUser("InitialBalance can't be null."));
            }
            if (request.OrderList == null || !request.OrderList.Any())
            {
                messageErrorList.Add(ErrorDto.BuildUser("Your need at least one order for the process."));
            }
            return(messageErrorList);
        }
Ejemplo n.º 5
0
        internal OperationResult <IEnumerable <OrderDto> > Execute(SellOrdersRequestDto request)
        {
            var goodOrder        = new List <OrderDto>();
            var messageErrorList = new List <ErrorDto>();

            goodOrder.AddRange(request.OrderList.Where(
                                   x => {
                var correct = true;
                if (!validOperation.Any(y => y == x.Operation) || (x.TotalShares <= 0))
                {
                    correct = false;
                    messageErrorList.Add(ErrorDto.BuildUser(
                                             string.Format("Issuer {0} with operation {1} is invalid.", x.IssuerName, x.Operation),
                                             INVALID_OPERATION_CODE));
                    return(correct);
                }
                if (!(x.TimeStamp.TimeOfDay >= InitialHourDay && x.TimeStamp.TimeOfDay <= FinalHourDay))
                {
                    correct = false;
                    messageErrorList.Add(ErrorDto.BuildUser(
                                             string.Format("Issuer {0} with time {1} is invalid (closed market).", x.IssuerName, x.TimeStamp),
                                             CLOSED_MARKET_CODE));
                    return(correct);
                }
                return(correct);
            }).Select(x => x).ToList());

            var goodOrderGroup = goodOrder.GroupBy(x => x.IssuerName);

            goodOrder = new List <OrderDto>();

            foreach (var item in goodOrderGroup)
            {
                if (item.Any(x => x.Operation == SELL_OPERATION) && !request.InitialBalance.IssuerList.Any(x => x.IssuerName == item.Key))
                {
                    messageErrorList.Add(ErrorDto.BuildUser(
                                             string.Format("Issuer {0} can't be operation {1} because doesn't exist in initial balance.", item.Key, SELL_OPERATION),
                                             INSUFFICIENT_STOCKS_CODE));
                    continue;
                }

                if (item.Count() == 1)
                {
                    goodOrder.AddRange(item.Select(x => x));
                    continue;
                }
                var indexOrder = item.Select((x, y) => new { order = x, indx = y });
                goodOrder.AddRange(indexOrder.Where(x =>
                {
                    var correct = true;
                    if (indexOrder.Any(z => z.indx != x.indx && z.order.Operation == x.order.Operation && z.order.StayFiveMinutes(x.order.TimeStamp)))
                    {
                        correct = false;
                        messageErrorList.Add(ErrorDto.BuildUser(
                                                 string.Format("Issuer {0} with timestamp {1} is duplicated with another records.", x.order.IssuerName, x.order.TimeStamp),
                                                 DUPLICATED_OPERATION_CODE));
                    }


                    return(correct);
                }).Select(x => x.order).ToList());
            }
            return(new OperationResult <IEnumerable <OrderDto> >(goodOrder, messageErrorList, true));
        }