using BuddyFinance.Admin.Areas.Admin.Models; using BuddyFinance.Admin.Controllers; using BuddyFinance.Admin.Models; using BuddyFinance.Common; using BuddyFinance.Common.Encryption; using BuddyFinance.Common.Extensions; using BuddyFinance.Common.Integration; using BuddyFinance.Integration.Models; using BuddyFinance.Integration.Models.Enums; using BuddyFinance.Integration.Models.Files; using BuddyFinance.Integration.Models.LoanOffers; using BuddyFinance.Integration.Models.LoanRequests; using BuddyFinance.Integration.Models.Loans; using BuddyFinance.Integration.Models.Lookups; using BuddyFinance.Integration.Models.ManageCash; using BuddyFinance.Integration.Models.Profiles; using BuddyFinance.Integration.Models.Transactions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace BuddyFinance.Admin.Areas.Admin.Controllers { [Area("Admin")] public class ProfilesController : BaseController { private string apiRoot; public ProfilesController(IConfiguration configuration, BuddyFinanceDbContext dbContext, IHttpContextAccessor httpContextAccessor) : base(configuration, dbContext) { apiRoot = Configuration.GetValue("apiRootUrl", ""); masterUrl = $"{Configuration.GetValue("apiRootUrl", "")}profiles/"; _httpContextAccessor = httpContextAccessor; } private string masterUrl; private IHttpContextAccessor _httpContextAccessor; public IActionResult Index(int? id) //profiletypeId { var profiles = new List(); WebApiResponse apiResponse; TempData["ProfileType"] = "all"; if (id == null || id == 0) apiResponse = WebApiHelper.Get(masterUrl, "", _token); else apiResponse = WebApiHelper.Get(masterUrl, "profiletypeid=" + id, _token); if (apiResponse.ErrorCode == 0) { if (apiResponse.Result.ErrorCode == 0) { profiles = apiResponse.Result.Result; _httpContextAccessor.HttpContext.Session.Set("ApprovedLenders", profiles.Where(m => m.Lender != null && m.StatusId == (int)ProfileStatusEnum.Approved).ToList()); TempData["ProfileType"] = apiResponse.Result.ProfileType; } else { TempData["Message"] = $"could not load profiles.{apiResponse.Result.ErrorMessage}"; } } else { ViewData["Message"] = $"could not load profiles.{apiResponse.ErrorMessage}"; } return View(profiles); } public IActionResult Details(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var profile = new Integration.Models.Profiles.Profile(); var id_ = id.ToDecryptedInt(); var apiResponse = WebApiHelper.Get(masterUrl, id_.ToString(), _token); if (apiResponse.ErrorCode == 0) { var result = apiResponse.Result; if (result.ErrorCode == 0) { profile = result.Result; if (result.Result.Documents.Any(m => m.DocumentTypeId == (int)DocumentTypeEnum.BankStatementOrLetter)) { var bankStatement = result.Result.Documents.FirstOrDefault(m => m.DocumentTypeId == (int)DocumentTypeEnum.BankStatementOrLetter); var index = result.Result.Documents.IndexOf(bankStatement); if (bankStatement != null) { if (result.Result.Lender != null) { bankStatement.DocumentType.Description = "1-Month Bank Statement / Letter from Bank"; } else { bankStatement.DocumentType.Description = "3-Months Bank Statement"; } result.Result.Documents[index] = bankStatement; } } } else { ViewData["Message"] = $"could not load profile data.{apiResponse.ErrorMessage}"; } } else { ViewData["Message"] = $"could not load profile data.{apiResponse.ErrorMessage}"; } //Save Profile Data in session for faster access while in the details page _httpContextAccessor.HttpContext.Session.Set("DetailProfile", profile); return View(profile); } public IActionResult Create() { var model = new ProfileEditViewModel(); PopulateLists(model); return View("Edit", model); } public IActionResult Edit(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var profile = new Integration.Models.Profiles.Profile(); var id_ = id.ToDecryptedInt(); var apiResponse = WebApiHelper.Get(masterUrl, id_.ToString(), _token); if (apiResponse.ErrorCode == 0) { var result = apiResponse.Result; if (result.ErrorCode == 0) { profile = result.Result; if (result.Result.Documents.Any(m => m.DocumentTypeId == (int)DocumentTypeEnum.BankStatementOrLetter)) { var bankStatement = result.Result.Documents.FirstOrDefault(m => m.DocumentTypeId == (int)DocumentTypeEnum.BankStatementOrLetter); var index = result.Result.Documents.IndexOf(bankStatement); if (bankStatement != null) { if (result.Result.Lender != null) { bankStatement.DocumentType.Description = "1-Month Bank Statement / Letter from Bank"; } else { bankStatement.DocumentType.Description = "3-Months Bank Statement"; } result.Result.Documents[index] = bankStatement; } } } else { ViewData["Message"] = $"could not load profile data.{apiResponse.ErrorMessage}"; } } else { ViewData["Message"] = $"could not load profile data.{apiResponse.ErrorMessage}"; } var model = new ProfileEditViewModel(profile); PopulateLists(model); return View(model); } public IActionResult ReviewAccount(string id, int type) { var model = new ReviewProfileAccountModel() { ProfileTypeId = type, ProfileId = id, }; return PartialView("_ReviewAccount", model); } [HttpPost] public IActionResult ReviewAccount(ReviewProfileAccountModel model) { if (ModelState.IsValid) { var response = WebApiHelper.Post>(masterUrl, $"ReviewAccount", new ReviewProfileModel { Approve = model.Action == "Approve", Comments = model.Comments, ProfileId = model.ProfileId, ProfileTypeId = model.ProfileTypeId, UserId = SessionManager.Current.CurrentUser._UserId }, SessionManager.Current?.CurrentUser.AccessToken); return Json(response.Result); } else { return BadRequest(ModelState); } } public IActionResult SuspendAccount(string id, int type, int status) { var model = new SuspendProfileAccountViewModel() { ProfileTypeId = type, ProfileId = id, }; if (status == (int)ProfileStatusEnum.Approved) model.Action = "Suspend"; else model.Action = "Unsuspend"; return PartialView("_SuspendAccount", model); } [HttpPost] public IActionResult SuspendAccount(SuspendProfileAccountViewModel model) { if (ModelState.IsValid) { var response = WebApiHelper.Post>(masterUrl, $"SuspendAccount", new SuspendProfileAccountModel { Suspend = model.Action == "Suspend", Comments = model.Comments, ProfileId = model.ProfileId, ProfileTypeId = model.ProfileTypeId, UserId = SessionManager.Current.CurrentUser._UserId }, SessionManager.Current?.CurrentUser.AccessToken); return Json(response.Result); } else { return BadRequest(ModelState); } } private void PopulateLists(ProfileEditViewModel model) { var apiResponse = WebApiHelper.Get(API_BASE + "master/", "registrationlists", _token); if (apiResponse.Result?.Result != null) { var data = apiResponse.Result.Result; model.ProfileTypeList = data.ProfileTypeList.Where(m => m.Id != (int)ProfileTypeEnum.BuddyFinance) .Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); model.EthnicityList = data.EthnicityTypeList.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); model.GenderList = data.GenderList.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); model.SourceOfIncomeList = data.SourceOfIncomeList.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); model.EmploymentStatusList = data.EmploymentStatusList.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); model.EmploymentTypeList = data.EmploymentTypeList.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); model.SalaryDayList = new List { //new SelectListItem //{ // Value = 1.ToString(), // Text = "1st" //}, new SelectListItem { Value = 15.ToString(), Text = "15th" }, new SelectListItem { Value = 20.ToString(), Text = "20th" }, new SelectListItem { Value = 25.ToString(), Text = "25th" }, new SelectListItem { Value = 27.ToString(), Text = "27th" },new SelectListItem { Value = 30.ToString(), Text = "Last day of the month" } }; model.ProvinceList = data.ProvincesList.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); foreach (var addressType in data.AddressTypesList) { if (!model.Addresses.Any(m => m.AddressTypeId == addressType.Id)) { model.Addresses.Add(new AddressViewModel { AddressTypeId = addressType.Id, AddressType = new AddressType { Description = addressType.Description } }); } } foreach (var documentType in data.DocumentTypeList) { if (!model.Documents.Any(m => m.DocumentTypeId == documentType.Id)) { model.Documents.Add(new Admin.Models.DocumentViewModel { DocumentTypeId = documentType.Id, DocumentType = new DocumentType { Id = documentType.Id, Description = documentType.Description } }); } } } } public IActionResult LoanOffers(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var id_ = id.ToDecryptedInt(); var model = new List(); var helperResponse = WebApiHelper.Get(apiRoot + "loanoffers/", "getloanoffers?profileId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) model = apiResponse.Result; else ViewBag.Message = "Could not get loan offers"; } else ViewBag.Message = "Could not get loan offers"; _httpContextAccessor.HttpContext.Session.Set("Offers", model); return PartialView("_LoanOffers", model); } public IActionResult LoanOfferRequests(string id) { var offers = _httpContextAccessor.HttpContext.Session.Get>("Offers"); var id_ = id.ToDecryptedInt(); var model = new List(); var getFromAPI = false; // var message = ""; if (offers.Any()) { var offer = offers.Find(m => m.Id == id_); if (offer != null) { model = offer.LoanRequestOffers; } else { getFromAPI = true; } } else { getFromAPI = true; } if (getFromAPI) { var helperResponse = WebApiHelper.Get(apiRoot + "loanoffers/", "getloanrequestoffers?loanOfferId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) model = apiResponse.Result; else return Json(new { success = false, message = "Could not get loan offer requests. " + apiResponse.ErrorMessage }); } else return Json(new { success = false, message = "Could not get loan offer requests. " + helperResponse.ErrorMessage }); } return PartialView("_LoanOfferRequests", model); } public IActionResult LoanRequests(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var id_ = id.ToDecryptedInt(); var model = new List(); var helperResponse = WebApiHelper.Get(apiRoot + "loans/", "getrequests?profileId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) model = apiResponse.Result; else ViewBag.Message = "Could not get loan requests"; } else ViewBag.Message = "Could not get loan requests"; _httpContextAccessor.HttpContext.Session.Set("Requests", model); return PartialView("_LoanRequests", model); } public IActionResult LoanRequestOffers(string id) { var requests = _httpContextAccessor.HttpContext.Session.Get>("Requests"); var id_ = id.ToDecryptedInt(); var model = new List(); var getFromAPI = false; // var message = ""; if (requests.Any()) { var request = requests.Find(m => m.Id == id_); if (request != null) { model = request.LoanRequestOffers; } else { getFromAPI = true; } } else { getFromAPI = true; } if (getFromAPI || model == null) { var helperResponse = WebApiHelper.Get>>(apiRoot + "loanoffers/", "loanrequestoffers?loanRequestId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) model = apiResponse.Result; else return Json(new { success = false, message = "Could not get loan request offers. " + apiResponse.ErrorMessage }); } else return Json(new { success = false, message = "Could not get loan request offers. " + helperResponse.ErrorMessage }); } return PartialView("_LoanRequestOffers", model); } public IActionResult Funds(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var id_ = id.ToDecryptedInt(); var model = new ProfileFundsModel(); var helperResponse = WebApiHelper.Get>(apiRoot + "managecash/", "funds?profileId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) model = apiResponse.Result; else return Json(new { success = false, message = apiResponse.ErrorMessage }); } else return Json(new { success = false, message = "Processing could not be completed. " + helperResponse.ErrorMessage }); return PartialView("_Funds", model); } public IActionResult Loans(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var id_ = id.ToDecryptedInt(); var loans = new List(); var helperResponse = WebApiHelper.Get(apiRoot + "loans/", "getloans?profileId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) loans = apiResponse.Result; else return Json(new { success = false, message = "Could not get loans. " + apiResponse.ErrorMessage }); } else return Json(new { success = false, message = "Could not get loans. " + helperResponse.ErrorMessage }); return PartialView("_Loans", loans); } public IActionResult Deposit(int profileId, double availableFunds = 0) { //if (string.IsNullOrEmpty(profileId)) //{ // return NotFound(); //} var id_ = profileId; // profileId.ToDecryptedInt(); return PartialView("_Deposit", new SaveProfileCashViewModel { Id = id_, AvailableFunds = availableFunds, UserId = SessionManager.Current?.CurrentUser._UserId }); } public IActionResult Deposits(string id) { if (string.IsNullOrEmpty(id)) { return NotFound(); } var id_ = id.ToDecryptedInt(); var model = new List(); var helperResponse = WebApiHelper.Get(apiRoot + "managecash/", "deposits?profileId=" + id_, _token); if (helperResponse.ErrorCode == 0) { var apiResponse = helperResponse.Result; if (apiResponse.ErrorCode == 0) model = apiResponse.Result; else return Json(new { success = false, message = apiResponse.ErrorMessage }); } else return Json(new { success = false, message = "Processing could not be completed. " + helperResponse.ErrorMessage }); return PartialView("_Deposits", model); } public IActionResult Reject(string id, string el) { if (string.IsNullOrEmpty(id)) return NotFound(); var model = new ReviewProfileViewModel { ProfileId = id, Ref = el, UserId = SessionManager.Current.CurrentUser._UserId }; return PartialView(model); } public IActionResult Suspend(string id, string el) { if (string.IsNullOrEmpty(id)) return NotFound(); var model = new SuspendProfileViewModel { ProfileId = id, Ref = el, UserId = SessionManager.Current.CurrentUser._UserId }; return PartialView(model); } public IActionResult AddDocument(int id, int type) { var model = new Models.DocumentViewModel { ProfileId = id, DocumentTypeId = type, DocumentType = new DocumentType { Description = EnumExtensions.GetEnumDescription((DocumentTypeEnum)type) } }; return PartialView("_EditDocument", model); } public IActionResult EditDocument(int id) { Document document = GetDocument(id); if (document == null) { return Json(new { success = false, message = "Document not found" }); } var model = new Models.DocumentViewModel(document); return PartialView("_EditDocument", model); } [HttpPost] public IActionResult EditDocument(Models.DocumentViewModel model) { if (ModelState.IsValid) { if (model.UploadFile != null) { if (model.FileData == null) { model.FileData = new FileData { }; model.FileData.FileName = model.UploadFile.FileName; model.FileData.ContentType = model.UploadFile.ContentType; model.FileData.Size = (int)model.UploadFile.Length; model.FileData.Contents = Convert.ToBase64String(GetFileContents(model.UploadFile)); } var response = WebApiHelper.Post(masterUrl, $"UpdateDocument", (Document)model, SessionManager.Current?.CurrentUser.AccessToken); if (response.ErrorCode != 0) { return Json(response.Result); } } } var docs = WebApiHelper.Get>>(masterUrl, $"{model.ProfileId}/documents", _token); var documents = docs.Result.Result.Select(m => new Models.DocumentViewModel(m)).ToList(); var apiResponse = WebApiHelper.Get(API_BASE + "master/", "documenttypes", _token); var documentTypes = apiResponse.Result?.Result; foreach (var documentType in documentTypes) { if (!documents.Any(m => m.DocumentTypeId == documentType.Id)) { documents.Add(new Admin.Models.DocumentViewModel { DocumentTypeId = documentType.Id, DocumentType = new DocumentType { Id = documentType.Id, Description = documentType.Description } }); } } return PartialView("_Documents", documents); //return Json(result); } public IActionResult AddAddress(int id, int type) { var model = new Models.AddressViewModel { AddressProfileId = id, AddressTypeId = type, AddressType = new AddressType { Description = EnumExtensions.GetEnumDescription((AddressTypeEnum)type) } }; var apiResponse = WebApiHelper.Get(API_BASE + "master/", "provinces", _token); model.ProvinceList = apiResponse.Result?.Result?.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); return PartialView("_EditAddress", model); } public IActionResult EditAddress(int id) { var model = new AddressViewModel(); var apiResponse = WebApiHelper.Get>(masterUrl, $"getaddress?addressId={id}", _token); if (apiResponse.ErrorCode == 0) { var result = apiResponse.Result; if (result.ErrorCode == 0) { model = new AddressViewModel(result.Result); } else { ViewData["Message"] = $"could not load document. {apiResponse.ErrorMessage}"; } } else { ViewData["Message"] = $"could not load document. {apiResponse.ErrorMessage}"; } var apiResponse_ = WebApiHelper.Get(API_BASE + "master/", "provinces", _token); model.ProvinceList = apiResponse_.Result?.Result?.Select(m => new SelectListItem { Value = m.Id.ToString(), Text = m.Description }).ToList(); return PartialView("_EditAddress", model); } [HttpPost] public IActionResult EditAddress(Models.AddressViewModel model) { if (ModelState.IsValid) { var response = WebApiHelper.Post(masterUrl, $"UpdateAddress", (Address)model, SessionManager.Current?.CurrentUser.AccessToken); if (response.ErrorCode != 0) { return Json(response.Result); } } var addressesResponse = WebApiHelper.Get>>(masterUrl, $"{model.AddressProfileId}/addresses", _token); var addresses = addressesResponse.Result.Result.Select(m => new Models.AddressViewModel(m)).ToList(); var apiResponse = WebApiHelper.Get(API_BASE + "master/", "addresstypes", _token); var addressTypes = apiResponse.Result?.Result; // ?.Select(m => new SelectListItem //{ // Value = m.Id.ToString(), // Text = m.Description //}).ToList(); foreach (var addressType in addressTypes) { if (!addresses.Any(m => m.AddressTypeId == addressType.Id)) { addresses.Add(new AddressViewModel { AddressTypeId = addressType.Id, AddressType = new AddressType { Description = addressType.Description } }); } } return PartialView("_Addresses", addresses); } private byte[] GetFileContents(IFormFile uploadFile) { byte[] data; using (MemoryStream memoryStream = new MemoryStream()) { uploadFile.CopyTo(memoryStream); data = memoryStream.ToArray(); } return data; } public IActionResult PreviewDocument(int documentId) { //Document document = null; //var profile = _httpContextAccessor.HttpContext.Session.Get("DetailProfile"); //if (profile == null) //{ // //Get document from API //} //else //{ // document = profile.Documents.Find(m => m.Id == documentId); //} Document document = GetDocument(documentId); if (document == null) { return Json(new { success = false, message = "Document not found" }); } var fileData = document.FileData; //return PartialView("_PreviewFile", document.FileData); //return File(Convert.FromBase64String(fileData.Contents), fileData.ContentType, fileData.FileName); var contentDisposition = new System.Net.Mime.ContentDisposition { FileName = fileData.FileName, Inline = true }; Response.Headers.Add("Content-Disposition", contentDisposition.ToString()); var stream = new MemoryStream(Convert.FromBase64String(fileData.Contents)); return new FileStreamResult(stream, fileData.ContentType); } public IActionResult DownloadDocument(int documentId) { Document document = GetDocument(documentId); if (document == null) return View("_ErrorFileDownload"); var fileData = document.FileData; return File(Convert.FromBase64String(fileData.Contents), fileData.ContentType, fileData.FileName); } private Document GetDocument(int id) { Document document = null; var profile = _httpContextAccessor.HttpContext.Session.Get("DetailProfile"); if (profile == null) { var apiResponse = WebApiHelper.Get($"{ apiRoot}files/", $"getdocument?documentId={id}", _token); if (apiResponse.ErrorCode == 0) { var result = apiResponse.Result; if (result.ErrorCode == 0) { document = result.Result; } else { ViewData["Message"] = $"could not load document. {apiResponse.ErrorMessage}"; } } else { ViewData["Message"] = $"could not load document. {apiResponse.ErrorMessage}"; } } else { document = profile.Documents.Find(m => m.DocumentId == id); } return document; } public IActionResult Statement(string id) { //BuddyFinance TX history var profileId = id.ToDecryptedInt(); var model = new List(); var apiResponse = WebApiHelper.Get(apiRoot, "transactions/gettransactions?profileId=" + profileId, _token); if (apiResponse.ErrorCode == 0) { var result = apiResponse.Result; if (result.ErrorCode == 0) { model = result.Result; return PartialView("_StatementPartialView", model); } else { return Json(new { success = false, message = $"could not load buddy finance transaction history. {result.ErrorMessage}" }); } } else { ViewData["Message"] = $"could not load buddy finance transaction history. {apiResponse.ErrorMessage}"; return Json(new { success = false, message = $"could not load buddy finance transaction history. {apiResponse.ErrorMessage}" }); } } public IActionResult LoanStatement(string loanId) { var model = new LoanStatement(); var apiResponse = WebApiHelper.Get>(apiRoot + "loans", "statement?loanId=" + loanId, _token); if (apiResponse.ErrorCode == 0) { var result = apiResponse.Result; if (result.ErrorCode == 0) { model = result.Result; return PartialView("_LoanStatementPartialView", model); } else { return Json(new { success = false, message = $"could not load loan statement. {result.ErrorMessage}" }); } } else { return Json(new { success = false, message = $"could not load loan statement. {apiResponse.ErrorMessage}" }); } } } }