Ejemplo n.º 1
0
        [HttpPatch] //should have an id in url? --> no bc patch req whole obj aka id already in body.
        public async Task <IActionResult> UpdateSecurityPrice([FromBody] SecurityPrice updatedSecurityPrice)
        {
            if (String.IsNullOrEmpty(updatedSecurityPrice.Id.ToString()))
            {
                return(StatusCode(400, "Must include id of security price"));
            }
            try
            {
                var securityPrice = await _securityContext.SecurityPrices.FindAsync(updatedSecurityPrice.Id);

                if (securityPrice == null)
                {
                    return(StatusCode(404));
                }

                if (!String.IsNullOrEmpty(updatedSecurityPrice.Date.ToString())) //prob a check above to ensure no empty
                {
                    securityPrice.Date = updatedSecurityPrice.Date;
                }
                if (!String.IsNullOrEmpty(updatedSecurityPrice.EndDayPrice.ToString()))
                {
                    securityPrice.EndDayPrice = updatedSecurityPrice.EndDayPrice;
                }

                await _securityContext.SaveChangesAsync();

                return(new OkObjectResult($"Succesfully updated security price on {securityPrice.Date} valued at ${securityPrice.EndDayPrice}"));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(StatusCode(500, e));
            }
        }
        public SecurityPrice SaveSecurityPrice(ISession session, SecurityPrice newSecurityPrice)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            if (newSecurityPrice == null)
            {
                throw new ArgumentNullException(nameof(newSecurityPrice));
            }

            Entities.SecurityPrice existingSecurityPrice = securityPriceRepository.GetSecurityPriceBySymbol(session, newSecurityPrice.Security.Symbol, newSecurityPrice.NavDate);

            if (existingSecurityPrice == null)
            {
                securityPriceRepository.SaveOrUpdate(session, newSecurityPrice);

                return(newSecurityPrice);
            }
            else
            {
                existingSecurityPrice.OpenPrice  = newSecurityPrice.OpenPrice;
                existingSecurityPrice.ClosePrice = newSecurityPrice.ClosePrice;

                securityPriceRepository.SaveOrUpdate(session, existingSecurityPrice);

                return(existingSecurityPrice);
            }
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> PostSecurityPrice([FromBody] SecurityPrice newSecurityPrice)
        {
            //better checks for empty body. Need a SecurityID --> from client
            if (String.IsNullOrEmpty(newSecurityPrice.Date.ToString()))
            {
                return(StatusCode(400, "Must provide security price date."));
            }
            if (String.IsNullOrEmpty(newSecurityPrice.EndDayPrice.ToString()))
            {
                return(StatusCode(400, "Must provide security price amount."));
            }
            if (String.IsNullOrEmpty(newSecurityPrice.SecurityId.ToString()))
            {
                return(StatusCode(400, "Must provide security ID."));
            }

            try
            {    // todo could check for that not already existing..
                _securityContext.SecurityPrices.Add(newSecurityPrice);
                await _securityContext.SaveChangesAsync();

                return(new OkObjectResult("Succesfully saved security price"));
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(StatusCode(500, e));
            }
        }
        public SecurityPriceResponse BuildSecurityPriceResponse(SecurityPrice securityPrice)
        {
            var securityPriceResponse = new SecurityPriceResponse()
            {
                ClosePrice = securityPrice.ClosePrice,
                OpenPrice  = securityPrice.OpenPrice,
                Currency   = securityPrice.Security.Currency,
                NavDate    = securityPrice.NavDate,
                Symbol     = securityPrice.Security.Symbol
            };

            return(securityPriceResponse);
        }
        public SecurityPrice GetSecurityPriceBySymbol(ISession session, string symbol, DateTime navDate)
        {
            if (session == null)
            {
                throw new ArgumentNullException(nameof(session));
            }

            if (symbol == null)
            {
                throw new ArgumentNullException(nameof(symbol));
            }

            SecurityPrice securityPrice = securityPriceRepository.GetSecurityPriceBySymbol(session, symbol.ToUpper(), navDate);

            return(securityPrice);
        }
        public void DownloadQuotes(Security security, DateTime purchaseDate, bool full)
        {
            //var prices = Yahoo.GetHistoricalAsync(security.YahooCode, purchaseDate, period: Period.Daily, ascending: true).Result;
            var prices = avClient.GetHistoricalPrices(security.YahooCode, purchaseDate, full).Result;

            foreach (DataPoint price in prices)
            {
                SecurityPrice savedPrice = context.SecurityPrices
                                           .Where(s => s.Date.Date == price.Date)
                                           .Where(s => s.Security == security).SingleOrDefault();

                if (savedPrice == null)
                {
                    SecurityPrice newPrice = new SecurityPrice()
                    {
                        SecurityId   = security.Id,
                        Date         = price.Date,
                        ClosingPrice = price.Close
                    };
                    context.Add <SecurityPrice>(newPrice);
                }
            }
            context.SaveChanges();
        }
        public void UpdatePortfolioTotals(Int64 portfolioId)
        {
            decimal costBase     = 0.0M;
            decimal rawValue     = 0.0M;
            decimal totalIncome  = 0.0M;
            decimal realisedGain = 0.0M;
            decimal soldCostBase = 0.0M;

            Portfolio portfolio = context.Portfolios.Include(p => p.Holdings)
                                  .ThenInclude(h => h.Parcels)
                                  .Include(p => p.Holdings)
                                  .ThenInclude(p => p.Security)
                                  .Include(p => p.Holdings)
                                  .ThenInclude(h => h.Income)
                                  .Single(p => p.Id == portfolioId);

            context.Entry(portfolio).Reload();

            foreach (Holding holding in portfolio.Holdings.Where(h => h.HoldingClosed == false))
            {
                decimal holdingCostBase     = 0.0M;
                int     holdingUnits        = 0;
                decimal holdingIncome       = 0.0M;
                decimal holdingSoldCostBase = 0.0M;
                decimal holdingRealisedGain = 0.0M;
                int     holdingUnitsSold    = 0;

                foreach (Parcel parcel in holding.Parcels)
                {
                    var parcelRemainingUnits = parcel.UnitsPurchased - parcel.UnitsSold;
                    var parcelUnitBrokerage  = parcel.Brokerage / parcel.UnitsPurchased;
                    holdingUnits        += parcelRemainingUnits;
                    holdingCostBase     += (parcelRemainingUnits * parcel.PurchasePrice) + (parcelUnitBrokerage * parcelRemainingUnits);
                    holdingSoldCostBase += (parcel.UnitsSold * parcel.PurchasePrice) + (parcel.UnitsSold * parcelUnitBrokerage);
                    holdingRealisedGain += parcel.ParcelGain;
                    holdingUnitsSold    += parcel.UnitsSold;
                }

                holding.TotalCostBase     = holdingCostBase;
                holding.TotalUnits        = holdingUnits;
                holding.TotalUnitsSold    = holdingUnitsSold;
                holding.RealisedGain      = holdingRealisedGain;
                holding.TotalSoldCostBase = holdingSoldCostBase;

                if (holding.TotalUnits <= 0)
                {
                    holding.HoldingClosed = true;
                }

                costBase     += holdingCostBase;
                soldCostBase += holdingSoldCostBase;

                SecurityPrice latestPrice = securityPriceRepository.GetLatestSecurityPrice(holding.Security);
                holding.SecurityPrice = latestPrice;

                rawValue += holdingUnits * latestPrice.ClosingPrice;

                foreach (HoldingIncome income in holding.Income)
                {
                    holdingIncome += income.Income;
                }
                totalIncome        += holdingIncome;
                holding.TotalIncome = holdingIncome;
                realisedGain       += holding.RealisedGain;

                context.Update <Holding>(holding);
            }

            portfolio.CostBase          = costBase;
            portfolio.CurrentRawValue   = rawValue;
            portfolio.CurrentIncome     = totalIncome;
            portfolio.TotalRealisedGain = realisedGain;
            portfolio.SoldCostBase      = soldCostBase;

            context.Update <Portfolio>(portfolio);
            context.SaveChanges();
        }
Ejemplo n.º 8
0
        public SecurityPrice DecodeRow(IDataReader reader)
        {
            var date             = reader.GetDateTime(0);
            var ticker           = reader.GetString(1);
            var openPrice        = reader.GetDecimal(2);
            var closePrice       = reader.GetDecimal(3);
            var dailyHigh        = reader.GetDecimal(4);
            var dailyLow         = reader.GetDecimal(5);
            var volume           = reader.GetInt64(6);
            var change           = reader.GetDecimal(7);
            var changePercent    = reader.GetDecimal(8);
            var isMonthEnd       = reader.GetBoolean(9);
            var isQuarterEnd     = reader.GetBoolean(10);
            var isYearEnd        = reader.GetBoolean(11);
            var securityTypeCode = reader.GetString(12);
            var securityName     = reader.GetString(13);
            var exchange         = reader.GetNullableString(14);
            var description      = reader.GetNullableString(15);
            var ceo              = reader.GetNullableString(16);
            var sector           = reader.GetString(17);
            var industry         = reader.GetNullableString(18);
            var website          = reader.GetNullableString(19);
            var issueType        = reader.GetNullableString(20);
            var securityTypeName = reader.GetString(21);

            TradeDate tradeDate = new TradeDate()
            {
                Date         = date,
                IsMonthEnd   = isMonthEnd,
                IsQuarterEnd = isQuarterEnd,
                IsYearEnd    = isYearEnd
            };

            SecurityType securityType = new SecurityType()
            {
                Code = securityTypeCode,
                Name = securityTypeName
            };

            Security security = new Security()
            {
                Symbol           = ticker,
                SecurityType     = securityType,
                Name             = securityName,
                Exchange         = exchange,
                Description      = description,
                Ceo              = ceo,
                Sector           = sector,
                Industry         = industry,
                Website          = website,
                SecurityTypeCode = securityTypeCode
            };

            SecurityPrice securityPrice = new SecurityPrice()
            {
                Date          = date,
                TradeDate     = tradeDate,
                Symbol        = ticker,
                Security      = security,
                ClosePrice    = closePrice,
                OpenPrice     = openPrice,
                DailyHigh     = dailyHigh,
                DailyLow      = dailyLow,
                Volume        = volume,
                Change        = change,
                ChangePercent = changePercent
            };

            return(securityPrice);
        }
        private void ProcessSecurityPriceRequest(IModel channel, BasicDeliverEventArgs msg)
        {
            try
            {
                logger.Log(LogLevel.Info, $"Processing SecurityPriceRequest {msg.BasicProperties.MessageId}");

                using (var session = sessionFactory.OpenSession())
                {
                    var requestFromQueue = msg.GetMessage <SecurityPriceRequest>();

                    string   requestFromQueueSymbol    = requestFromQueue.Symbol?.ToUpper();
                    DateTime requestFromQueueNavDate   = requestFromQueue.NavDate;
                    string   requestFromQueueMessageId = requestFromQueue.MessageId;

                    string securityPriceRequestLog = $"[SecurityPriceRequest: NavDate {requestFromQueueNavDate}, Symbol {requestFromQueueSymbol}, MessageId {requestFromQueueMessageId}]";

                    logger.Log(LogLevel.Info, securityPriceRequestLog);

                    Request requestFromDb = requestService.GetOrCreateRequest(session, requestFromQueue, RequestType.SecurityPriceRequest, requestFromQueueNavDate);

                    Entities.Security security = securityService.GetSecurityBySymbol(session, requestFromQueueSymbol);

                    if (security == null)
                    {
                        logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: missing Security with Symbol {requestFromQueueSymbol}");

                        requestService.SetRequestStatus(session, requestFromDb, RequestStatus.Error);
                        channel.SendNack(msg.DeliveryTag);

                        return;
                    }


                    if (requestFromDb.RequestStatus == RequestStatus.Done)
                    {
                        logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: already processed with success, see Request {requestFromDb.RequestId}");

                        logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: retrieving SecurityPrice with same nav date and symbol");

                        SecurityPrice securityPrice = securityPriceService.GetSecurityPriceBySymbol(session, requestFromQueueSymbol, requestFromQueueNavDate.Date);

                        if (securityPrice != null)
                        {
                            logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: sending SecurityPrice Id: {securityPrice.SecurityPriceId}, NavDate: {securityPrice.NavDate}, Symbol: {securityPrice.Security.Symbol}, OpenPrice: {securityPrice.OpenPrice}, ClosePrice: {securityPrice.ClosePrice}");

                            PublishSecurityPrice(channel, securityPrice, requestFromQueue.MessageId);
                            channel.SendAck(msg.DeliveryTag);

                            logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: sent SecurityPrice Id: {securityPrice.SecurityPriceId}, NavDate: {securityPrice.NavDate}, Symbol: {securityPrice.Security.Symbol}, OpenPrice: {securityPrice.OpenPrice}, ClosePrice: {securityPrice.ClosePrice}");

                            return;
                        }

                        requestService.SetRequestStatus(session, requestFromDb, RequestStatus.Error);
                        channel.SendNack(msg.DeliveryTag);

                        return;
                    }

                    logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: retrieving SecurityPrice from IEXCloud for NavDate {requestFromQueueNavDate}");
                    SymbolPrice symbolPrice = iexCloudRequestManager.GetSymbolPrice(requestFromQueueSymbol);
                    logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: SecurityPrice from IEXCloud retrived - Symbol: {symbolPrice.symbol}, OpenPrice: {symbolPrice.open}, ClosePrice: {symbolPrice.close} ");

                    logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: Saving SecurityPrice from IEXCloud");

                    SecurityPrice dbSecurityPrice = SaveSecurityPrice(session, symbolPrice, security, requestFromQueueNavDate);

                    logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: SecurityPrice Id: {dbSecurityPrice.SecurityPriceId} saved");

                    logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: Sending SecurityPrice Id: {dbSecurityPrice.SecurityPriceId}, NavDate: {dbSecurityPrice.NavDate}, Symbol: {dbSecurityPrice.Security.Symbol}, OpenPrice: {dbSecurityPrice.OpenPrice}, ClosePrice: {dbSecurityPrice.ClosePrice} on {Queues.SecurityPriceResponseQueue}");

                    PublishSecurityPrice(channel, dbSecurityPrice, requestFromQueue.MessageId);

                    logger.Log(LogLevel.Info, $"{securityPriceRequestLog}: SecurityPrice Id: {dbSecurityPrice.SecurityPriceId} on {Queues.SecurityPriceResponseQueue} sent");

                    requestService.SetRequestStatus(session, requestFromDb, RequestStatus.Done);

                    channel.SendAck(msg.DeliveryTag);
                }
            }
            catch (JsonException jsonException)
            {
                logger.Log(LogLevel.Error, jsonException, jsonException.Message);
                channel.SendAck(msg.DeliveryTag);
            }
            catch (Exception exception)
            {
                logger.Log(LogLevel.Error, exception, exception.Message);
                channel.SendNack(msg.DeliveryTag);
            }
        }
        private Entities.SecurityPrice SaveSecurityPrice(ISession session, SymbolPrice symbolPrice, Entities.Security security, DateTime navDate)
        {
            SecurityPrice securityPrice = securityPriceBuilder.BuildSecurityPrice(security, symbolPrice.open ?? 0, symbolPrice.close ?? 0, navDate);

            return(securityPriceService.SaveSecurityPrice(session, securityPrice));
        }
Ejemplo n.º 11
0
 public abstract bool Identify(SecurityPrice price);
Ejemplo n.º 12
0
        public IViewModel AddSecurityPrice(IViewModel baseModel)
        {
            var model         = (SecurityPriceModel)baseModel;
            var responseModel = new ResponseModel <GenericModel <string> >
            {
                Status = ResponseStatus.Success,
            };

            try
            {
                //Check and Update Existing Security Price by Date
                var securityPriceByDate = _securitypriceRepository.FirstOrDefault(w => w.SecurityId == model.SecurityId && w.Date == model.Date);
                if (securityPriceByDate != null)
                {
                    model.Id = securityPriceByDate.Id;
                    UpdateSecurityPrice(model);
                }
                else // New Record
                {
                    var securityPrice = new SecurityPrice
                    {
                        SecurityId      = model.SecurityId,
                        Date            = model.Date,
                        CurrencyId      = model.CurrencyId,
                        UnitPrice       = model.UnitPrice,
                        PriceNAV        = model.PriceNAV,
                        PricePUR        = model.PricePUR,
                        InterestRate    = model.InterestRate,
                        ValuationTypeId = model.ValuationTypeId,
                        Valuer          = model.Valuer,
                        Attachment      = model.Attachment,
                    };
                    _securitypriceRepository.Add(securityPrice);
                    uow.Commit();
                    // Maintaining Log
                    CreateEntityLog(new EntitiesEventLogModel {
                        ObjectType = "SecurityPrice", ObjectID = securityPrice.Id, DateTime = DateTime.Now, UserID = SessionObject.GetInstance.UserID, OperationType = "CREATE"
                    });


                    //NAV Security Attachment
                    if (model.FName != null)
                    {
                        var attachment = new Attachment
                        {
                            Name             = model.FName,
                            FileName         = model.FileName,
                            Permission       = 2,
                            Extension        = model.Extension,
                            AttachmentTypeId = _attachamentTypeRepository.Where(a => a.StringKey == "NAVDoc").FirstOrDefault().Id,//model.AttachmentTypeId,
                            IsVerified       = false,
                            IsPhotoShown     = false,
                            Created          = DateTime.UtcNow,
                            CreatedBy        = SessionObject.GetInstance.UserID,
                            IsDeleted        = false
                        };

                        _attachamentRepository.Add(attachment);
                        uow.Commit();
                        CreateEntityLog(new EntitiesEventLogModel {
                            ObjectType = "Attachment", ObjectID = attachment.Id, DateTime = DateTime.Now, UserID = SessionObject.GetInstance.UserID, OperationType = "CREATE"
                        });

                        var navSecurityAttachment = new NAVSecurityAttachment
                        {
                            SecurityPriceId = securityPrice.Id,
                            AttachmentId    = attachment.Id,
                            IsDeleted       = false
                        };

                        _navsecurityattachamentRepository.Add(navSecurityAttachment);
                        uow.Commit();
                        CreateEntityLog(new EntitiesEventLogModel {
                            ObjectType = "NAVSecurityAttachments", ObjectID = navSecurityAttachment.Id, DateTime = DateTime.Now, UserID = SessionObject.GetInstance.UserID, OperationType = "CREATE"
                        });
                    }
                    uow.Dispose();
                    responseModel.Message = string.Format(MDA_Resource.Info_RecordAddedSuccessfully, "Security Price");
                }
            }
            catch (Exception exception)
            {
                responseModel.Status = ResponseStatus.Error;
                responseModel.Error  =
                    new ErrorModel
                {
                    Description  = MessageManager.GetReponseMessage(this, Option.Add, responseModel.Status),
                    ErrorMessage = exception.Message,
                    Exception    = exception
                };
                //Adding log.
                LogUtility.LogException(exception, string.Format(MDA_Resource.Error_UnableToAdd));
            }
            return(responseModel);
        }