public ActionResult Edit(long id)
        {
            List <ViewModels.Leads.LeadStatusViewModel> leadStatusList = new List <ViewModels.Leads.LeadStatusViewModel>();
            List <ViewModels.Leads.LeadSourceViewModel> leadSourceList = new List <ViewModels.Leads.LeadSourceViewModel>();

            ViewModels.Leads.LeadViewModel viewModel = new ViewModels.Leads.LeadViewModel();

            using (IDbConnection conn = Data.Database.Instance.GetConnection())
            {
                Common.Models.Leads.Lead model = Mapper.Map <Common.Models.Leads.Lead>(Data.Leads.Lead.Get(id, conn, false));

                // Has this already been made an opportunity?  If so, redirect
                Common.Models.Opportunities.Opportunity op = Data.Opportunities.Opportunity.GetForLead(model.Id.Value);
                if (op != null)
                {
                    return(new RedirectResult("/Opportunities/Edit/" + op.Id.Value.ToString()));
                }

                model.Contact = Mapper.Map <Common.Models.Contacts.Contact>(Data.Contacts.Contact.Get(model.Contact.Id.Value));
                if (model.Fee != null)
                {
                    model.Fee = Mapper.Map <Common.Models.Leads.LeadFee>(Data.Leads.LeadFee.Get(model.Fee.Id.Value, conn, false));
                    if (model.Fee.To != null)
                    {
                        model.Fee.To = Mapper.Map <Common.Models.Contacts.Contact>(Data.Contacts.Contact.Get(model.Fee.To.Id.Value));
                    }
                }

                Data.Leads.LeadStatus.List(conn, false).ForEach(x =>
                {
                    leadStatusList.Add(Mapper.Map <ViewModels.Leads.LeadStatusViewModel>(x));
                });

                Data.Leads.LeadSource.List(conn, false).ForEach(x =>
                {
                    leadSourceList.Add(Mapper.Map <ViewModels.Leads.LeadSourceViewModel>(x));
                });

                viewModel         = Mapper.Map <ViewModels.Leads.LeadViewModel>(model);
                viewModel.Contact = Mapper.Map <ViewModels.Contacts.ContactViewModel>(model.Contact);
                viewModel.Fee     = Mapper.Map <ViewModels.Leads.LeadFeeViewModel>(model.Fee);
                if (model.Fee != null)
                {
                    viewModel.Fee.To = Mapper.Map <ViewModels.Contacts.ContactViewModel>(model.Fee.To);
                }
                else
                {
                    viewModel.Fee    = new ViewModels.Leads.LeadFeeViewModel();
                    viewModel.Fee.To = new ViewModels.Contacts.ContactViewModel();
                }
            }

            ViewBag.LeadStatusList = leadStatusList;
            ViewBag.LeadSourceList = leadSourceList;

            return(View(viewModel));
        }
        public ActionResult Close(long id, ViewModels.Leads.LeadViewModel viewModel)
        {
            Common.Models.Account.Users currentUser;
            Common.Models.Leads.Lead    model;

            using (Data.Transaction trans = Data.Transaction.Create(true))
            {
                try
                {
                    currentUser = Data.Account.Users.Get(trans, User.Identity.Name);
                    model       = Mapper.Map <Common.Models.Leads.Lead>(viewModel);
                    Data.Leads.Lead.Close(trans, model, currentUser);
                    trans.Commit();
                    return(RedirectToAction("Index"));
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    return(Edit(id));
                }
            }
        }
        public ActionResult Edit(long id, ViewModels.Leads.LeadViewModel viewModel)
        {
            Common.Models.Account.Users currentUser;
            Common.Models.Leads.Lead    model;

            using (Data.Transaction trans = Data.Transaction.Create(true))
            {
                try
                {
                    currentUser = Data.Account.Users.Get(trans, User.Identity.Name);
                    Common.Models.Leads.Lead oldLead = Data.Leads.Lead.Get(trans, id);

                    model = Mapper.Map <Common.Models.Leads.Lead>(viewModel);
                    //model.Source = Mapper.Map<Common.Models.Leads.LeadSource>(viewModel.Source);
                    model.Fee = Mapper.Map <Common.Models.Leads.LeadFee>(viewModel.Fee);

                    if (oldLead.Fee != null)
                    {
                        model.Fee = Data.Leads.LeadFee.Edit(trans, model.Fee, currentUser);
                    }
                    else
                    {
                        model.Fee = Data.Leads.LeadFee.Create(trans, model.Fee, currentUser);
                    }

                    //model.Source = Data.Leads.LeadSource.Edit(trans, model.Source, currentUser);
                    model = Data.Leads.Lead.Edit(trans, model, currentUser);

                    trans.Commit();

                    return(RedirectToAction("Details", new { Id = id }));
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    return(Edit(id));
                }
            }
        }
        public ActionResult Index()
        {
            int    colorKeeper = -1;
            string contactFilter, sourceFilter;
            int?   sourceTypeFilter = null, statusTypeFilter = null;
            bool?  closedFilter = null;

            ViewModels.Leads.DashboardViewModel viewModel = new ViewModels.Leads.DashboardViewModel();
            System.Drawing.Color[] availableColors        = new System.Drawing.Color[]
            {
                System.Drawing.Color.FromArgb(228, 26, 28),
                System.Drawing.Color.FromArgb(55, 126, 184),
                System.Drawing.Color.FromArgb(77, 175, 74),
                System.Drawing.Color.FromArgb(152, 78, 163),
                System.Drawing.Color.FromArgb(255, 127, 0),
                System.Drawing.Color.FromArgb(166, 86, 40),
                System.Drawing.Color.FromArgb(247, 129, 191),
            };
            ViewModels.ChartJSViewModel chartLeadSourceVM, chartLeadConversionVM;

            contactFilter = Request["contactFilter"];
            sourceFilter  = Request["sourceFilter"];

            if (!string.IsNullOrEmpty(Request["sourceTypeFilter"]))
            {
                int i;
                if (int.TryParse(Request["sourceTypeFilter"], out i))
                {
                    sourceTypeFilter = i;
                }
            }

            if (!string.IsNullOrEmpty(Request["statusTypeFilter"]))
            {
                int i;
                if (int.TryParse(Request["statusTypeFilter"], out i))
                {
                    statusTypeFilter = i;
                }
            }

            if (!string.IsNullOrEmpty(Request["closedFilter"]))
            {
                if (Request["closedFilter"] != "Both")
                {
                    bool i;
                    if (bool.TryParse(Request["closedFilter"], out i))
                    {
                        closedFilter = i;
                    }
                }
            }
            else
            {
                closedFilter = false;
            }

            chartLeadSourceVM = new ViewModels.ChartJSViewModel()
            {
                type = "pie"
            };
            chartLeadSourceVM.data.datasets.Add(new ViewModels.ChartJSViewModel.Dataset());

            chartLeadConversionVM = new ViewModels.ChartJSViewModel()
            {
                type = "bar"
            };

            using (IDbConnection conn = Data.Database.Instance.GetConnection())
            {
                viewModel.Leads       = new List <ViewModels.Leads.LeadViewModel>();
                viewModel.StatusTypes = new List <ViewModels.Leads.LeadStatusViewModel>();
                viewModel.SourceTypes = new List <ViewModels.Leads.LeadSourceTypeViewModel>();

                Data.Leads.LeadSourceType.List(conn, false).ForEach(x =>
                {
                    viewModel.SourceTypes.Add(Mapper.Map <ViewModels.Leads.LeadSourceTypeViewModel>(x));
                });

                Data.Leads.LeadStatus.List(conn, false).ForEach(x =>
                {
                    viewModel.StatusTypes.Add(Mapper.Map <ViewModels.Leads.LeadStatusViewModel>(x));
                });

                Data.Leads.Lead.List(contactFilter, sourceFilter, sourceTypeFilter, statusTypeFilter, closedFilter, conn, false).ForEach(x =>
                {
                    ViewModels.Leads.LeadViewModel lvm = Mapper.Map <ViewModels.Leads.LeadViewModel>(x);
                    lvm.Contact = Mapper.Map <ViewModels.Contacts.ContactViewModel>(Data.Contacts.Contact.Get(x.Contact.Id.Value));
                    lvm.Status  = Mapper.Map <ViewModels.Leads.LeadStatusViewModel>(Data.Leads.LeadStatus.Get(x.Status.Id.Value));
                    lvm.Source  = Mapper.Map <ViewModels.Leads.LeadSourceViewModel>(Data.Leads.LeadSource.Get(x.Source.Id.Value));
                    viewModel.Leads.Add(lvm);
                });

                Data.Leads.Lead.LeadsBySource(DateTime.UtcNow.AddDays(-30), conn, false).ForEach(x =>
                {
                    colorKeeper++;
                    if (colorKeeper >= availableColors.Length)
                    {
                        colorKeeper = 0;
                    }

                    chartLeadSourceVM.data.labels.Add(x.Title);
                    chartLeadSourceVM.data.datasets[0].backgroundColor.Add("rgba(" + availableColors[colorKeeper].R + ", " + availableColors[colorKeeper].G + ", " + availableColors[colorKeeper].B + ", 1)");
                    chartLeadSourceVM.data.datasets[0].data.Add(x.Count.Value);
                    //chartVM.data.datasets[0].borderWidth = "1";
                });

                colorKeeper = -1;
                ViewModels.ChartJSViewModel.Dataset ds = new ViewModels.ChartJSViewModel.Dataset();
                Data.Opportunities.Opportunity.ListSinceGroupingByMonth(DateTime.UtcNow.AddYears(-1), conn, false).ForEach(x =>
                {
                    colorKeeper++;
                    if (colorKeeper >= availableColors.Length)
                    {
                        colorKeeper = 0;
                    }

                    chartLeadConversionVM.data.labels.Add(x.Month.Value.ToString("MMM"));
                    ds.backgroundColor.Add("rgba(" + availableColors[colorKeeper].R + ", " + availableColors[colorKeeper].G + ", " + availableColors[colorKeeper].B + ", 1)");
                    //ds.label = x.Month.Value.ToString("MMM");
                    ds.data.Add(x.Count.Value);
                });
                chartLeadConversionVM.data.datasets.Add(ds);
                chartLeadConversionVM.options.scales       = new ViewModels.ChartJSViewModel.Options.Scales();
                chartLeadConversionVM.options.scales.yAxes = new List <ViewModels.ChartJSViewModel.Options.Scales.Axes>();
                chartLeadConversionVM.options.scales.yAxes.Add(new ViewModels.ChartJSViewModel.Options.Scales.Axes()
                {
                    ticks = new ViewModels.ChartJSViewModel.Options.Scales.Axes.Ticks()
                    {
                        beginAtZero = true
                    }
                });
            }

            ViewBag.LeadSourceGraphData = Newtonsoft.Json.JsonConvert.SerializeObject(chartLeadSourceVM,
                                                                                      Newtonsoft.Json.Formatting.Indented,
                                                                                      new Newtonsoft.Json.JsonSerializerSettings()
            {
                NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore
            });
            ViewBag.LeadConversionGraphData = Newtonsoft.Json.JsonConvert.SerializeObject(chartLeadConversionVM,
                                                                                          Newtonsoft.Json.Formatting.Indented,
                                                                                          new Newtonsoft.Json.JsonSerializerSettings()
            {
                NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore
            });
            return(View(viewModel));
        }