Esempio n. 1
0
        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));
        }
Esempio n. 2
0
 public ActionResult DeleteAllTradeActivity()
 {
     WaterTransferRegistrationParcel.DeleteAll(_dbContext);
     WaterTransferRegistration.DeleteAll(_dbContext);
     WaterTransfer.DeleteAll(_dbContext);
     Offer.DeleteAll(_dbContext);
     Trade.DeleteAll(_dbContext);
     Posting.DeleteAll(_dbContext);
     return(Ok());
 }
Esempio n. 3
0
        public ActionResult <List <WaterTransferDto> > ListWaterTransfersByUserID([FromRoute] int accountID)
        {
            var waterTransferDtos = WaterTransfer.ListByAccountID(_dbContext, accountID);

            if (waterTransferDtos == null)
            {
                return(NotFound());
            }

            return(Ok(waterTransferDtos));
        }
Esempio n. 4
0
        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));
        }
Esempio n. 5
0
        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));
        }
Esempio n. 6
0
        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));
        }
Esempio n. 7
0
        public ActionResult <WaterTransferDto> GetByWaterTransferID([FromRoute] int waterTransferID)
        {
            var waterTransferDto = WaterTransfer.GetByWaterTransferID(_dbContext, waterTransferID);

            return(RequireNotNullThrowNotFound(waterTransferDto, "Water Transfer", waterTransferID));
        }