// GET: Enquiries/Create
        public ActionResult Create()
        {
            UserCreateEditEnquiryViewModel newEnquiry = new UserCreateEditEnquiryViewModel();

            newEnquiry.InvoiceEmail = User.Identity.GetUserDefaultInvoicingEmail();
            newEnquiry.NoOfYears    = 10;
            newEnquiry.DataUsedFor  = "Ecological report";
            ViewBag.SearchTypeId    = new SelectList(db.SearchTypes, "SearchTypeId", "Name");
            //get all boundaries for displaying on map
            SpatialHelper spatial = new SpatialHelper();

            ViewBag.Boundaries = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.DISPLAY);
            ViewBag.Coverage   = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.COVERAGE);
            return(View(newEnquiry));
        }
        public ActionResult Edit([Bind(Include = "Code, EnquiryId,Name,InvoiceEmail,SearchAreaWkt,SearchTypeId" +
                                                 ",NoOfYears,EstimatedCost,JobNumber,Agency,AgencyContact,DataUsedFor,Citations,GisKml,Express,EnquiryDate" +
                                                 ",Comment,AddedToRersDate, DataCleanedDate, ReportCompleteDate, DocumentsCleanedDate, EnquiryDeliveredDate" +
                                                 ", AdminComment, RowVersion")] UserCreateEditEnquiryViewModel model)
        {
            SpatialHelper spatial = new SpatialHelper();

            ViewBag.SearchTypeId = new SelectList(db.SearchTypes, "SearchTypeId", "Name", model.SearchTypeId);
            //get all boundaries for displaying on map
            ViewBag.Boundaries = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.DISPLAY);
            ViewBag.Coverage   = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.COVERAGE);

            if (ModelState.IsValid)
            {
                DbGeometry geom    = DbGeometry.FromText(model.SearchAreaWkt, 27700);
                var        user    = User.Identity.GetAppUser();
                var        userId  = User.Identity.GetIntUserId();
                Enquiry    enquiry = new Enquiry
                {
                    Code                 = model.Code,
                    EnquiryId            = model.EnquiryId,
                    ApplicationUserId    = userId,
                    Name                 = model.Name,
                    InvoiceEmail         = model.InvoiceEmail,
                    SearchArea           = geom,
                    SearchTypeId         = model.SearchTypeId,
                    NoOfYears            = model.NoOfYears,
                    EstimatedCost        = model.EstimatedCost,
                    JobNumber            = model.JobNumber,
                    Agency               = model.Agency,
                    AgencyContact        = model.AgencyContact,
                    DataUsedFor          = model.DataUsedFor,
                    Citations            = model.Citations,
                    GisKml               = model.GisKml,
                    Express              = model.Express,
                    Comment              = model.Comment,
                    AddedToRersDate      = model.AddedToRersDate,
                    DataCleanedDate      = model.DataCleanedDate,
                    ReportCompleteDate   = model.ReportCompleteDate,
                    DocumentsCleanedDate = model.DocumentsCleanedDate,
                    EnquiryDeliveredDate = model.EnquiryDeliveredDate,
                    AdminComment         = model.AdminComment,
                    RowVersion           = model.RowVersion
                };
                try
                {
                    db.Entry(enquiry).State = EntityState.Modified;
                    db.SaveChanges();
                    return(RedirectToAction("Index"));
                }
                catch (DbUpdateConcurrencyException)
                {
                    ViewBag.Message = "Sorry, couldn't update due to a concurrency issue <br />Please try again";

                    return(View(model));
                }
                catch (DbEntityValidationException ex)
                {
                    foreach (var result in ex.EntityValidationErrors)
                    {
                        foreach (var error in result.ValidationErrors)
                        {
                            ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
                        }
                    }
                    return(View(model));
                }
            }

            return(View(model));
        }
        // GET: Enquiries/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            var     userId  = User.Identity.GetUserId <int>();
            Enquiry enquiry = db.Enquiries.Include(e => e.Invoice)
                              .Include(q => q.Quotes).FirstOrDefault(e => e.EnquiryId == id);

            if (enquiry == null)
            {
                return(HttpNotFound());
            }

            if (userId == enquiry.ApplicationUserId || userManager.IsInRole(userId, "Admin") || userManager.IsInRole(userId, "EnquiryManager"))
            {
                //do not allow editing of enquiry if there are quotes
                if (enquiry.Quotes.Count > 0)
                {
                    if (enquiry.Quotes.Where(q => q.AcceptedDate != null).Count() > 0)
                    {
                        TempData["ErrorMessage"] = "Cannot edit an enquiry that has an accepted quote, please contact us if there is an issue";
                    }
                    else
                    {
                        TempData["ErrorMessage"] = "Cannot edit an enquiry that has been quoted, please delete all quotes for this enquiry and try again";
                    }

                    // send user back to the index
                    return(RedirectToAction("Index", "Enquiries"));
                }
                FormatHelper formatHelper = new FormatHelper();
                var          wkt          = enquiry.SearchArea.WellKnownValue.WellKnownText;
                UserCreateEditEnquiryViewModel userCreateEditEnquiryViewModel = new UserCreateEditEnquiryViewModel
                {
                    Code                 = enquiry.Code,
                    EnquiryId            = enquiry.EnquiryId,
                    Name                 = enquiry.Name,
                    InvoiceEmail         = enquiry.InvoiceEmail,
                    SearchAreaWkt        = wkt,
                    SearchTypeId         = enquiry.SearchTypeId,
                    NoOfYears            = enquiry.NoOfYears,
                    EstimatedCost        = enquiry.EstimatedCost,
                    JobNumber            = enquiry.JobNumber,
                    Agency               = enquiry.Agency,
                    AgencyContact        = enquiry.AgencyContact,
                    DataUsedFor          = enquiry.DataUsedFor,
                    Citations            = enquiry.Citations,
                    GisKml               = enquiry.GisKml,
                    Express              = enquiry.Express,
                    Comment              = enquiry.Comment,
                    AddedToRersDate      = enquiry.AddedToRersDate,
                    DataCleanedDate      = enquiry.DataCleanedDate,
                    ReportCompleteDate   = enquiry.ReportCompleteDate,
                    DocumentsCleanedDate = enquiry.DocumentsCleanedDate,
                    EnquiryDeliveredDate = enquiry.EnquiryDeliveredDate,
                    AdminComment         = enquiry.AdminComment,
                    RowVersion           = enquiry.RowVersion
                };
                ViewBag.SearchTypeId = new SelectList(db.SearchTypes, "SearchTypeId", "Name", userCreateEditEnquiryViewModel.SearchTypeId);
                //get all boundaries for displaying on map
                SpatialHelper spatial = new SpatialHelper();
                ViewBag.Boundaries = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.DISPLAY);
                ViewBag.Coverage   = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.COVERAGE);
                return(View(userCreateEditEnquiryViewModel));
            }
            else
            {
                // send user back to the index
                return(RedirectToAction("Index", "Enquiries"));
            }
        }
        public ActionResult Create([Bind(Include = "Code, EnquiryId,Name,InvoiceEmail,SearchAreaWkt,SearchTypeId,NoOfYears,EstimatedCost,JobNumber,Agency,AgencyContact,DataUsedFor,Citations,GisKml,Express,EnquiryDate,Comment")] UserCreateEditEnquiryViewModel model)
        {
            if (ModelState.IsValid)
            {
                DbGeometry geom = DbGeometry.FromText(model.SearchAreaWkt, 27700); //(EPSG:27700) is OSGB, (EPSG:3857) google maps geometric, wgs84 (EPSG:4326) google geographic
                var        defaultInvoiceEmail = User.Identity.GetUserDefaultInvoicingEmail();
                var        user   = User.Identity.GetAppUser();
                var        userId = User.Identity.GetIntUserId();
                if (model.InvoiceEmail != null)
                {
                    defaultInvoiceEmail = model.InvoiceEmail;
                }
                Enquiry enquiry = new Enquiry
                {
                    Code = model.Code,
                    ApplicationUserId = userId,
                    Name          = model.Name,
                    InvoiceEmail  = defaultInvoiceEmail,
                    SearchArea    = geom,
                    SearchTypeId  = model.SearchTypeId,
                    EstimatedCost = model.EstimatedCost,
                    NoOfYears     = model.NoOfYears,
                    JobNumber     = model.JobNumber,
                    Agency        = model.Agency,
                    AgencyContact = model.AgencyContact,
                    DataUsedFor   = model.DataUsedFor,
                    Citations     = model.Citations,
                    GisKml        = model.GisKml,
                    Express       = model.Express,
                    Comment       = model.Comment,
                };

                db.Enquiries.Add(enquiry);

                try
                {
                    db.SaveChanges();
                    FormatHelper formatHelper = new FormatHelper();
                    var          enquiryCode  = formatHelper.GetEnquiryCodePrefix(enquiry.EnquiryId);
                    enquiry.Code            = enquiryCode;
                    db.Entry(enquiry).State = EntityState.Modified;
                    db.SaveChanges();
                    return(RedirectToAction("Index"));
                }
                catch (DbEntityValidationException ex)
                {
                    foreach (var result in ex.EntityValidationErrors)
                    {
                        foreach (var error in result.ValidationErrors)
                        {
                            ModelState.AddModelError(error.PropertyName, error.ErrorMessage);
                        }
                    }
                    return(View(model));
                }
            }

            ViewBag.DefaultInvoiceEmail = User.Identity.GetUserDefaultInvoicingEmail();
            ViewBag.SearchTypeId        = new SelectList(db.SearchTypes, "SearchTypeId", "Name", model.SearchTypeId);
            //get all boundaries for displaying on map
            SpatialHelper spatial = new SpatialHelper();

            ViewBag.Boundaries = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.DISPLAY);
            ViewBag.Coverage   = spatial.GetGeoJsonCollectionFromBoundaryCollection(db.Boundaries.ToList(), SpatialHelper.BoundaryType.COVERAGE);
            return(View(model));
        }