using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Linq; using System.Threading.Tasks; using System.Net; using System.Web; using System.Web.Mvc; using HealthchoiceMVC.Models; using HealthchoiceMVC.Services; using System.Text.RegularExpressions; using System.Data.Entity.Core; using HealthchoiceMVC.NonDbModels; namespace HealthchoiceMVC.Controllers { public class ProviderController : Controller { CommonController common = new CommonController(); ApplicationUser user = new ApplicationUser(); HCLocalService service = new HCLocalService(); private HCDBEntities db = new HCDBEntities(); private ApplicationDbContext userDb = new ApplicationDbContext(); // GET: provider/Create public ActionResult TermsAndConditions() { return View(); } // GET: provider public async Task Index() { return View(await db.provider.ToListAsync()); } // GET: provider/Details/5 public async Task Details(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } provider provider = await db.provider.FindAsync(id); if (provider == null) { return HttpNotFound(); } return View(provider); } public provider GetProvider(string userGuid) { //get provider based on id if (userGuid == "") { return new provider(); } using (HCDBEntities entities = new HCDBEntities()) { var link = entities.user_link.Where(i => i.UserId == userGuid).FirstOrDefault(); if(link== null) { return new provider(); } provider provider = entities.provider.Find(link.entity_key); if (provider == null) { return new provider(); } return provider; } } private void PopulateViewbag() { //ViewBag.CountryList = service.GetListOfCountries(); //ViewBag.CountryListAll = service.GetListOfCountriesAll(); //ViewBag.GenderList = service.GetLookUpDropDown("gender"); ViewBag.TitleList = service.GetLookUpDropDown("title"); ViewBag.IdType = service.GetLookUpDropDown("id_no_type"); //ViewBag.PDIStatus = service.GetLookUpDropDown("PDI"); ViewBag.Disciplines = service.GetDisciplines(); List SubDisciplines = new List(); SubDisciplines.Add(new SelectListItem { Text = "-Select discipline first-", Value = "" }); ViewBag.SubDisciplines = SubDisciplines; ViewBag.ProvSpecialityTypeList = service.GetLookUpDropDown("provider_speciality_type"); var SubDisciplineKeys = new string[] { "", "18" }; ViewBag.SubDisciplineList = service.GetSubDisciplinesByDisciplineCode(14).Where(s => SubDisciplineKeys.Contains(s.Value)); //JQuery needs to be added. } // GET: provider/Create public ActionResult Create() { return View(); } // GET: Provider/CreateShort public ActionResult CreateShort() { provider_short provider = new provider_short(); user = service.GetCurrentUserByName(User.Identity.Name); provider.prov_first_name = user.FirstName; provider.prov_surname = user.LastName; provider.prov_cell_no = user.ContactNumber; provider.prov_email = user.Email; //remove this after testing /* provider.prov_cell_no = "0727977277"; provider.prov_tel_no = "0215320937"; provider.prov_discipline_code = 14; provider.prov_sub_discipline_key = 18; provider.prov_hpcsa_no = "1234567"; provider.prov_middle_name = "Etienne"; provider.prov_title = "Dr"; provider.prov_id_no = "6606305051086"; */ // for phase 1 - physiotherapy launch //provider.prov_discipline_code = 72; //provider.prov_sub_discipline_key = 182; PopulateViewbag(); return View(provider); } // POST: provider/Create // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task Create([Bind(Include = "prov_key,prov_title,prov_initials,prov_first_name,prov_middle_name,prov_surname,prov_country_code,prov_id_no,prov_id_type_key,prov_gender_code,prov_vat_no,prov_pdi_status_code,prov_discipline_code,prov_sub_discipline_key,prov_hpcsa_no,prov_email,prov_tel_dialling_code,prov_tel_no,prov_fax_no,prov_cell_no,prov_speciality_code,prov_disp_lic_ind,prov_disp_lic_no,prov_no_of_locations,prov_registered,prov_deregistered,modified_dt,modified_by_key,user_guid,registration_complete")] provider provider) { if (ModelState.IsValid) { db.provider.Add(provider); await db.SaveChangesAsync(); return RedirectToAction("Index"); } return View(provider); } private string CleanPhone(string phone) { Regex digitsOnly = new Regex(@"[^\d]"); return digitsOnly.Replace(phone, ""); } private void PageValidation(provider provider) { if (provider.prov_id_type_key.Equals("1") && provider.prov_id_no.Length != 13) { ModelState.AddModelError(String.Empty, "Your South African ID Number should be 13 digits."); } if (provider.prov_key == 0) { //sa ID if (provider.prov_id_type_key == 1) { IdentityInfo i = new IdentityInfo(provider.prov_id_no); if (!i.IsValid) { ModelState.AddModelError(string.Empty, "Invalid ID Number entered"); } } } if (provider.prov_disp_lic_ind == true && provider.prov_disp_lic_no == null) { ModelState.AddModelError(String.Empty, "Please include your dispensing license number."); } if (provider.prov_disp_lic_ind == false && provider.prov_disp_lic_no != null) { ModelState.AddModelError(String.Empty, "Please select the can dispense option as well as your dispensing license number."); } string telNumeric = CleanPhone(provider.prov_tel_no); string mobileNumeric = CleanPhone(provider.prov_cell_no); if (telNumeric.Length < 10) ModelState.AddModelError("prov_tel_no", "Telephone number should contain at least 10 numeric characters"); if (mobileNumeric.Length < 10) ModelState.AddModelError("prov_cell_no", "Alternative number should contain at least 10 numeric characters"); if ((provider.prov_tel_no != null && provider.prov_cell_no != null) && (telNumeric.Length >= 9 && mobileNumeric.Length >= 9)) { if (telNumeric.Substring(telNumeric.Length - 9) == mobileNumeric.Substring(mobileNumeric.Length - 9)) { ModelState.AddModelError("prov_tel_no", "Telephone and alternative number cannot be the same"); } } } // POST: Provider/CreateShort [HttpPost] [ValidateAntiForgeryToken] public async Task CreateShort([Bind(Include = "prov_title,prov_first_name,prov_middle_name,prov_surname,prov_country_code,prov_id_no,prov_id_type_key,prov_discipline_code,prov_sub_discipline_key,prov_hpcsa_no,prov_email,prov_tel_no,prov_cell_no,prov_registered")] provider_short provider_short) { try { user = service.GetCurrentUserByName(User.Identity.Name); provider provider = new provider(); MapShortToLong(provider_short, provider); PageValidation(provider); foreach (var modelValue in ModelState.Values) { modelValue.Errors.Clear(); } using (HCDBEntities entities = new HCDBEntities()) { //check user with idnumber isn't already registered var p = await entities.provider.Where(i => i.prov_id_no == provider.prov_id_no).FirstOrDefaultAsync().ConfigureAwait(false); if (p != null) { ModelState.AddModelError(string.Empty, "User with ID number already registered as a provider"); } //check that the HPCSA number is not used //provider must have a unique practice (HPCSA) number p = await entities.provider.Where(i => i.prov_hpcsa_no == provider.prov_hpcsa_no).FirstOrDefaultAsync().ConfigureAwait(false); if (p != null) { ModelState.AddModelError(string.Empty, "Provider with that HPCSA number already registered."); } p = await entities.provider.Where(i => i.prov_hpcsa_no == provider.prov_hpcsa_no).FirstOrDefaultAsync().ConfigureAwait(false); if (p != null) { ModelState.AddModelError(string.Empty, "Provider with that HPCSA number already registered."); } } var errors = ViewData.ModelState.Where(n => n.Value.Errors.Count > 0).ToList(); if (ModelState.IsValid) { if (provider.prov_initials == null) { string initials = ""; initials = provider.prov_first_name.ElementAt(0).ToString().ToUpper(); if (provider.prov_middle_name != null) { initials += "" + provider.prov_middle_name.ElementAt(0).ToString().ToUpper(); } provider.prov_initials = initials; } //add the provider record provider.prov_registered = DateTime.Now; provider.modified_by_key = user.Id; provider.modified_dt = DateTime.Now; db.provider.Add(provider); await db.SaveChangesAsync(); //add the user_link record user_link user_link = new user_link(); user_link.entity_key = provider.prov_key; user_link.entity_type = "Provider"; user_link.UserId = user.Id; user_link.modified_by_key = user.Id; user_link.modified_dt = DateTime.Now; db.user_link.Add(user_link); await db.SaveChangesAsync(); //add the prov_user_link record prov_user_link prov_user_link = new prov_user_link(); prov_user_link.prov_key = provider.prov_key; prov_user_link.UserId = user.Id; db.prov_user_link.Add(prov_user_link); await db.SaveChangesAsync(); //Add provider role var result = new CommonController(); await result.AddUserRole(user.Id, "3"); //Provider await result.AddUserRole(user.Id, "7"); //ProviderAdmin return RedirectToAction("Index", "Home"); } PopulateViewbag(); return View(provider_short); } catch (EntityException e) { ModelState.AddModelError(string.Empty, "Error saving registration details"); PopulateViewbag(); return View(provider_short); } catch (Exception exc) { ModelState.AddModelError(string.Empty, "Error saving registration details"); PopulateViewbag(); return View(provider_short); } } private static void MapShortToLong(provider_short provider_short, provider provider) { provider.prov_cell_no = provider_short.prov_cell_no; provider.prov_country_code = provider_short.prov_country_code; provider.prov_discipline_code = provider_short.prov_discipline_code; provider.prov_email = provider_short.prov_email; provider.prov_first_name = provider_short.prov_first_name; provider.prov_hpcsa_no = provider_short.prov_hpcsa_no; provider.prov_id_no = provider_short.prov_id_no; provider.prov_id_type_key = provider_short.prov_id_type_key; provider.prov_initials = provider_short.prov_initials; provider.prov_middle_name = provider_short.prov_middle_name; provider.prov_sub_discipline_key = provider_short.prov_sub_discipline_key; provider.prov_surname = provider_short.prov_surname; provider.prov_tel_no = provider_short.prov_tel_no; provider.prov_title = provider_short.prov_title; } // GET: provider/Edit/5 public async Task Edit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } provider provider = await db.provider.FindAsync(id); if (provider == null) { return HttpNotFound(); } if (provider.registration_complete == false) RedirectToAction("EditShort", new { Id = id }); return View(provider); } public async Task EditShort(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } provider provider = await db.provider.FindAsync(id); provider_short provider_short = new provider_short(); MapLongToShort(provider_short, provider); if (provider == null) { return HttpNotFound(); } PopulateViewbag(); return View(provider_short); } private static void MapLongToShort(provider_short provider_short, provider provider) { provider_short.prov_key = provider.prov_key; provider_short.prov_cell_no = provider.prov_cell_no; provider_short.prov_country_code = provider.prov_country_code; provider_short.prov_discipline_code = provider.prov_discipline_code; provider_short.prov_email = provider.prov_email; provider_short.prov_first_name = provider.prov_first_name; provider_short.prov_hpcsa_no = provider.prov_hpcsa_no; provider_short.prov_id_no = provider.prov_id_no; provider_short.prov_id_type_key = provider.prov_id_type_key; provider_short.prov_initials = provider.prov_initials; provider_short.prov_middle_name = provider.prov_middle_name; provider_short.prov_sub_discipline_key = provider.prov_sub_discipline_key; provider_short.prov_surname = provider.prov_surname; provider_short.prov_tel_no = provider.prov_tel_no; provider_short.prov_title = provider.prov_title; } // POST: provider/Edit/5 // To protect from overposting attacks, please enable the specific properties you want to bind to, for // more details see http://go.microsoft.com/fwlink/?LinkId=317598. [HttpPost] [ValidateAntiForgeryToken] public async Task Edit([Bind(Include = "prov_key,prov_title,prov_initials,prov_first_name,prov_middle_name,prov_surname,prov_country_code,prov_id_no,prov_id_type_key,prov_gender_code,prov_vat_no,prov_pdi_status_code,prov_discipline_code,prov_sub_discipline_key,prov_hpcsa_no,prov_email,prov_tel_dialling_code,prov_tel_no,prov_fax_no,prov_cell_no,prov_speciality_code,prov_disp_lic_ind,prov_disp_lic_no,prov_no_of_locations,prov_registered,prov_deregistered,modified_dt,modified_by_key,user_guid,registration_complete")] provider provider) { if (ModelState.IsValid) { db.Entry(provider).State = EntityState.Modified; await db.SaveChangesAsync(); return RedirectToAction("Index"); } return View(provider); } // POST: provider/EditShort/5 [HttpPost] [ValidateAntiForgeryToken] public async Task EditShort([Bind(Include = "prov_key,prov_title,prov_first_name,prov_middle_name,prov_surname,prov_country_code,prov_id_no,prov_id_type_key,prov_discipline_code,prov_sub_discipline_key,prov_hpcsa_no,prov_email,prov_tel_no,prov_cell_no,prov_registered")] provider_short provider_short) { provider provider = new provider(); MapShortToLong(provider_short, provider); PageValidation(provider); if (ModelState.IsValid) { db.Entry(provider_short).State = EntityState.Modified; await db.SaveChangesAsync(); return RedirectToAction("Index","Nome"); } PopulateViewbag(); return View(provider_short); } // GET: provider/Delete/5 public async Task Delete(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } provider provider = await db.provider.FindAsync(id); if (provider == null) { return HttpNotFound(); } return View(provider); } // POST: provider/Delete/5 [HttpPost, ActionName("Delete")] [ValidateAntiForgeryToken] public async Task DeleteConfirmed(int id) { provider provider = await db.provider.FindAsync(id); db.provider.Remove(provider); await db.SaveChangesAsync(); return RedirectToAction("Index"); } protected override void Dispose(bool disposing) { if (disposing) { db.Dispose(); } base.Dispose(disposing); } } }