public async Task <ActionResult <MortgageProposal> > PostMortgageProposal(MortgageRequirementDto requirementDto)
        {
            var requirement = _mapper.Map <MortgageRequirement>(requirementDto);
            var proposal    = await _mortgageService.CreateProposal(requirement);

            var proposalDto = _mapper.Map <MortgageProposalDto>(proposal);

            return(CreatedAtAction("PostMortgageProposal", new { id = proposal.Id }, proposalDto));
        }
        /// <summary>
        /// List the suitable products for this requirement
        /// </summary>
        /// <param name="requirement"></param>
        /// <param name="intermediaryDetailsDto"></param>
        /// <returns></returns>
        public virtual List<ProductSummaryDto> ListSuitableProduct(MortgageRequirementDto requirement)
        {
            var domainRequirement = _IntermediaryAdaptor.AdaptRequirement(requirement);

            var suitableProducts = domainRequirement.ListSuitableProducts();

            var suitableDtoProducts = _IntermediaryAdaptor.AdaptProductSummary(suitableProducts);

            return suitableDtoProducts;
        }
        public void ListSuitableProducts()
        {
            var bindings = new DefaultBindings();
              var service = IntermediaryFactory.GetModellingService(bindings);

              var requirements = new MortgageRequirementDto();
              requirements.LoanAmount = 250000;
              requirements.PurchasePrice = 400000;
              requirements.TermInMonths = 256;

              var suitableProducts = service.ListSuitableProduct(requirements);

              Assert.IsNotNull(suitableProducts, "Products should have been returned");
              Assert.IsTrue(suitableProducts.Count > 0, "AT least one product should have been returned.");

              return;
        }
        /// <summary>
        /// return a requirement based on a rate switch
        /// </summary>
        /// <param name="domainRequirement"></param>
        /// <returns></returns>
        RequirementDto IMortgageAdaptor.AdaptRequirement(RateSwitchRequirement domainRequirement)
        {
            var mortgageRequirement = domainRequirement;

              var dtoRequirement = new MortgageRequirementDto(mortgageRequirement.AccountToSwitch, mortgageRequirement.Id, mortgageRequirement.CreatedDate);

              return dtoRequirement;
        }
        /// <summary>
        /// return a requirement based on BTL
        /// </summary>
        /// <param name="domainRequirement"></param>
        /// <returns></returns>
        RequirementDto IMortgageAdaptor.AdaptRequirement(BuyToLetRequirement domainRequirement)
        {
            var mortgageRequirement = domainRequirement;

              var dtoRequirement = new MortgageRequirementDto(mortgageRequirement.MonthlyRental,mortgageRequirement.Id, mortgageRequirement.CreatedDate);

              return dtoRequirement;
        }
        /// <summary>
        /// Return a requirement based on HP
        /// </summary>
        /// <param name="domainRequirement"></param>
        /// <returns></returns>
        RequirementDto IMortgageAdaptor.AdaptRequirement(HousePurchaseRequirement domainRequirement)
        {
            var mortgageRequirement = domainRequirement;

              var dtoRequirement = new MortgageRequirementDto(mortgageRequirement.Id, mortgageRequirement.LoanAmount, mortgageRequirement.TermInMonths,
                                                      mortgageRequirement.PurchasePrice, mortgageRequirement.Recommended,
                                                      mortgageRequirement.CreatedDate);

              return dtoRequirement;
        }
 public MortgageSolutionDto(List<ProductDto> products, MortgageRequirementDto requirement)
     : base(products, requirement)
 {
     return;
 }