[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); } }
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(); }
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)); }
public abstract bool Identify(SecurityPrice price);
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); }