public ActionResult <List <WaterTransferDto> > SelectParcels([FromRoute] int waterTransferID, [FromBody] WaterTransferRegistrationDto waterTransferRegistrationDto) { if (!_rioConfiguration.ALLOW_TRADING) { return(BadRequest()); } var waterTransferDto = WaterTransfer.GetByWaterTransferID(_dbContext, waterTransferID); if (ThrowNotFound(waterTransferDto, "Water Transfer", waterTransferID, out var actionResult)) { return(actionResult); } var validationMessages = WaterTransferRegistrationParcel.ValidateParcels(waterTransferRegistrationDto.WaterTransferRegistrationParcels, waterTransferDto); validationMessages.ForEach(vm => { ModelState.AddModelError(vm.Type, vm.Message); }); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } var waterTransferRegistrationParcelDtos = WaterTransferRegistrationParcel.SaveParcels(_dbContext, waterTransferID, waterTransferRegistrationDto); return(Ok(waterTransferRegistrationParcelDtos)); }
public ActionResult DeleteAllTradeActivity() { WaterTransferRegistrationParcel.DeleteAll(_dbContext); WaterTransferRegistration.DeleteAll(_dbContext); WaterTransfer.DeleteAll(_dbContext); Offer.DeleteAll(_dbContext); Trade.DeleteAll(_dbContext); Posting.DeleteAll(_dbContext); return(Ok()); }
public ActionResult <List <WaterTransferDto> > ListWaterTransfersByUserID([FromRoute] int accountID) { var waterTransferDtos = WaterTransfer.ListByAccountID(_dbContext, accountID); if (waterTransferDtos == null) { return(NotFound()); } return(Ok(waterTransferDtos)); }
public ActionResult <MarketMetricsDto> Get() { var marketMetricsDto = new MarketMetricsDto(); var mostRecentOfferToBuy = Offer.GetMostRecentOfferOfType(_dbContext, PostingTypeEnum.OfferToBuy); var mostRecentOfferToSell = Offer.GetMostRecentOfferOfType(_dbContext, PostingTypeEnum.OfferToSell); var mostRecentPostingToBuy = Posting.GetMostRecentOfferOfType(_dbContext, PostingTypeEnum.OfferToBuy); var mostRecentPostingToSell = Posting.GetMostRecentOfferOfType(_dbContext, PostingTypeEnum.OfferToSell); SetMostRecentOfferOfType(mostRecentOfferToBuy, mostRecentPostingToBuy, marketMetricsDto, x => x.MostRecentOfferToBuyQuantity, x => x.MostRecentOfferToBuyPrice); SetMostRecentOfferOfType(mostRecentOfferToSell, mostRecentPostingToSell, marketMetricsDto, x => x.MostRecentOfferToSellQuantity, x => x.MostRecentOfferToSellPrice); var postings = Posting.List(_dbContext).ToList(); marketMetricsDto.TotalBuyVolume = postings.Where(x => x.PostingType.PostingTypeID == (int)PostingTypeEnum.OfferToBuy).Sum(x => x.Quantity); marketMetricsDto.TotalSellVolume = postings.Where(x => x.PostingType.PostingTypeID == (int)PostingTypeEnum.OfferToSell).Sum(x => x.Quantity); var waterTransfer = WaterTransfer.GetMostRecentRegistered(_dbContext); marketMetricsDto.MostRecentWaterTransfer = waterTransfer; return(Ok(marketMetricsDto)); }
public ActionResult <WaterTransferDto> ConfirmTransfer([FromRoute] int waterTransferID, [FromBody] WaterTransferRegistrationDto waterTransferRegistrationDto) { if (!_rioConfiguration.ALLOW_TRADING) { return(BadRequest()); } var waterTransferDto = WaterTransfer.GetByWaterTransferID(_dbContext, waterTransferID); if (ThrowNotFound(waterTransferDto, "Water Transfer", waterTransferID, out var actionResult)) { return(actionResult); } var currentUser = UserContext.GetUserFromHttpContext(_dbContext, HttpContext); var validationMessages = WaterTransfer.ValidateConfirmTransfer(waterTransferRegistrationDto, waterTransferDto, currentUser); validationMessages.ForEach(vm => { ModelState.AddModelError(vm.Type, vm.Message); }); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } waterTransferDto = WaterTransfer.ChangeWaterRegistrationStatus(_dbContext, waterTransferID, waterTransferRegistrationDto, WaterTransferRegistrationStatusEnum.Registered); if (waterTransferDto.BuyerRegistration.IsRegistered && waterTransferDto.SellerRegistration.IsRegistered) { var smtpClient = HttpContext.RequestServices.GetRequiredService <SitkaSmtpClientService>(); var mailMessages = GenerateConfirmTransferEmail(_rioConfiguration.WEB_URL, waterTransferDto, smtpClient); foreach (var mailMessage in mailMessages) { SendEmailMessage(smtpClient, mailMessage); } } return(Ok(waterTransferDto)); }
public IActionResult New([FromRoute] int postingID, [FromBody] OfferUpsertDto offerUpsertDto) { if (!_rioConfiguration.ALLOW_TRADING) { return(BadRequest()); } var posting = Posting.GetByPostingID(_dbContext, postingID); if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if ((posting.PostingType.PostingTypeID == (int)PostingTypeEnum.OfferToSell) && (offerUpsertDto.OfferStatusID == (int)OfferStatusEnum.Pending || offerUpsertDto.OfferStatusID == (int)OfferStatusEnum.Accepted) && posting.AvailableQuantity < offerUpsertDto.Quantity) { ModelState.AddModelError("Quantity", "Exceeds remaining balance in posting"); return(BadRequest(ModelState)); } if (offerUpsertDto.OfferStatusID != (int)OfferStatusEnum.Rescinded && Posting.HasOpenOfferByAccountID(_dbContext, posting, offerUpsertDto.CreateAccountID)) { ModelState.AddModelError("Posting", "You currently have an open offer on this posting. Please wait until the other party responds to the current offer."); return(BadRequest(ModelState)); } var offer = Offer.CreateNew(_dbContext, postingID, offerUpsertDto); var smtpClient = HttpContext.RequestServices.GetRequiredService <SitkaSmtpClientService>(); var currentTrade = Trade.GetByTradeID(_dbContext, offer.Trade.TradeID); var rioUrl = _rioConfiguration.WEB_URL; // update trades status if needed switch (offerUpsertDto.OfferStatusID) { case (int)OfferStatusEnum.Accepted: var tradeDto = Trade.Update(_dbContext, offer.Trade.TradeID, TradeStatusEnum.Accepted); // write a water transfer record var waterTransfer = WaterTransfer.CreateNew(_dbContext, offer, tradeDto, posting); offer.WaterTransferID = waterTransfer.WaterTransferID; var mailMessages = GenerateAcceptedOfferEmail(rioUrl, offer, currentTrade, posting, waterTransfer, smtpClient); foreach (var mailMessage in mailMessages) { SendEmailMessage(smtpClient, mailMessage); } break; case (int)OfferStatusEnum.Rejected: UpdateTradeStatusSendEmail(offer, smtpClient, GenerateRejectedOfferEmail(rioUrl, offer, currentTrade, posting, smtpClient), TradeStatusEnum.Rejected); break; case (int)OfferStatusEnum.Rescinded: UpdateTradeStatusSendEmail(offer, smtpClient, GenerateRescindedOfferEmail(rioUrl, offer, currentTrade, posting, smtpClient), TradeStatusEnum.Rescinded); break; default: SendEmailMessage(smtpClient, GeneratePendingOfferEmail(rioUrl, currentTrade, offer, posting, smtpClient)); break; } // get current balance of posting var acreFeetOfAcceptedTrades = Posting.CalculateAcreFeetOfAcceptedTrades(_dbContext, postingID); var postingStatusToUpdateTo = (int)PostingStatusEnum.Open; if (posting.Quantity == acreFeetOfAcceptedTrades) { postingStatusToUpdateTo = (int)PostingStatusEnum.Closed; // expire all other outstanding offers var postingCreateAccountID = posting.CreateAccount.AccountID; var activeTradesForPosting = Trade.GetPendingTradesForPostingID(_dbContext, postingID).ToList(); foreach (var activeTrade in activeTradesForPosting) { var offerStatus = activeTrade.OfferCreateAccount.AccountID == postingCreateAccountID ? OfferStatusEnum.Rescinded : OfferStatusEnum.Rejected; var offerUpsertDtoForRescindReject = new OfferUpsertDto { TradeID = activeTrade.TradeID, Price = activeTrade.Price, CreateAccountID = postingCreateAccountID, Quantity = activeTrade.Quantity, OfferStatusID = (int)offerStatus, OfferNotes = $"Offer {offerStatus} because original posting is now closed" }; var resultingOffer = Offer.CreateNew(_dbContext, postingID, offerUpsertDtoForRescindReject); switch (offerStatus) { case OfferStatusEnum.Rejected: UpdateTradeStatusSendEmail(resultingOffer, smtpClient, GenerateRejectedOfferEmail(rioUrl, resultingOffer, Trade.GetByTradeID(_dbContext, activeTrade.TradeID), posting, smtpClient), TradeStatusEnum.Rejected); break; case OfferStatusEnum.Rescinded: UpdateTradeStatusSendEmail(resultingOffer, smtpClient, GenerateRescindedOfferEmail(rioUrl, resultingOffer, Trade.GetByTradeID(_dbContext, activeTrade.TradeID), posting, smtpClient), TradeStatusEnum.Rescinded); break; } } } Posting.UpdateStatus(_dbContext, postingID, new PostingUpdateStatusDto { PostingStatusID = postingStatusToUpdateTo }, posting.Quantity - acreFeetOfAcceptedTrades); return(Ok(offer)); }
public ActionResult <WaterTransferDto> GetByWaterTransferID([FromRoute] int waterTransferID) { var waterTransferDto = WaterTransfer.GetByWaterTransferID(_dbContext, waterTransferID); return(RequireNotNullThrowNotFound(waterTransferDto, "Water Transfer", waterTransferID)); }