/// <summary>
        /// Returns a MVCList with all contacts from a Client.
        /// </summary>
        /// <param name="page"></param>
        /// <param name="idCliente"></param>
        /// <returns></returns>
        public MvcList<ContactModel> ListAll(int? page, int idCliente)
        {
            var promoter = new WS.Promoter.Promoter().GetPromoter(Settings.AutenticationKeyEarningSystem, idCliente);

            if (promoter != null)
            {
                var contactList = new Contact().SelectAll(Settings.AutenticationKeyEarningSystem, promoter.IdPromoter);

                page = page ?? 1;

                var contactListPage = new Tuple<IEnumerable<ContactModel>, Int32>(
                    contactList.OrderBy(x => x.Name)
                        .Skip((page.Value * Constants.ManageContactRegistersPerPage) - Constants.ManageContactRegistersPerPage)
                        .Take(Constants.ManageContactRegistersPerPage).ToList(), contactList.Count());

                var list = new MvcList<ContactModel>(contactListPage.Item1,
                                                     page.Value,
                                                     contactListPage.Item2,
                                                     Constants.ManageContactRegistersPerPage);

                return list;
            }

            return new MvcList<ContactModel>(new ContactModel[0], 0, 0);
        }
        public ActionResult NewContact(ContactModel model)
        {
            if (new WS.Promoter.Promoter().ValidateEmail(Settings.AutenticationKeyEarningSystem, model.Email)) return ValidationResult(Resources.Resource.GS_Contact_EmailAlreadyExist);
                

            using (var ws = Service)
            {
                var idPromoter = 0;
                var userAuth = FormsAuthenticationUtil.UserAuthenticated;
                if (userAuth != null && userAuth.IdCliente.HasValue)
                {
                    var promoter = new WS.Promoter.Promoter().GetPromoter(Settings.AutenticationKeyEarningSystem,
                                                                          userAuth.IdCliente.Value);
                    if (promoter != null)
                    {
                        idPromoter = promoter.IdPromoter;
                    }

                    model.IdPromoter = idPromoter;
                    model.Selecionado = true;
                    string validationMessage;

                    var contact = new ContactModel { IdPromoter = idPromoter, Email = model.Email, Name = model.Name };

                    if (ws.ValidarNovoContato(Settings.AutenticationKeyEarningSystem, contact, out validationMessage))
                        model.IdContact = ws.InserirContato(Settings.AutenticationKeyEarningSystem, contact);
                    else
                        return ValidationResult(validationMessage);
                }
            }

            AdicionarItemLista(model);

            return SuccessResult(Resources.Resource.Msg_Geral_CadastroRealizado);
        }
        public ActionResult LoadSelectContact(string selected)
        {
            var userAuth = FormsAuthenticationUtil.UserAuthenticated;
            var search = new SearchContactModel { Contatos = new List<ContactModel>().ToArray() };

            using (var ws = Service)
            {
                if (userAuth != null && userAuth.IdCliente.HasValue)
                {
                    var promoter = new WS.Promoter.Promoter().GetPromoter(Settings.AutenticationKeyEarningSystem,
                                                                          userAuth.IdCliente.Value);
                    if (promoter != null)
                    {
                        search.Contatos = ws.SelectByPromoter(Settings.AutenticationKeyEarningSystem, promoter.IdPromoter);
                    }

                    var contactModels = search.Contatos.ToList();

                    AtualizarLista(ref contactModels, Deserialize<SendEmailModels>(selected));

                    search.TotalPaginas = GetTotalPages(contactModels.Count());
                    search.PaginaAtual = Constants.ContactComponentFirstPage;
                    search.Contatos = contactModels.Take(Constants.ContactComponentRegistersPerPage).ToArray();
                }
            }

            return PartialView("_SelectContact", search);
        }
        public JsonResult Create(string name, string email)
        {
            try
            {
                if (new WS.Promoter.Promoter().ValidateEmail(Settings.AutenticationKeyEarningSystem, email)) return Json(new JsonRequestResult { ResultType = JsonRequestResultType.Error, Message = Resources.Resource.GS_Contact_EmailAlreadyExist }, JsonRequestBehavior.AllowGet);

                if (SecurityHelper.GainSystemUserIsAuthenticated())
                {
                    var userAuth = FormsAuthenticationUtil.UserAuthenticated;

                    if (userAuth != null)
                    {
                        if (userAuth.IdCliente != null)
                        {
                            var promoter = new WS.Promoter.Promoter().GetPromoter(Settings.AutenticationKeyEarningSystem, userAuth.IdCliente.Value);

                            if (promoter != null)
                            {
                                var contact = new ContactModel
                                                  {
                                                      Name = name, 
                                                      Email = email, 
                                                      IdPromoter = promoter.IdPromoter
                                                  };

                                string validationMessage;
                                if (Service.ValidarNovoContato(Settings.AutenticationKeyEarningSystem, contact, out validationMessage))
                                {

                                    var idNewContact = new Contact().Insert(Settings.AutenticationKeyEarningSystem,
                                                                            contact);
                                    if (idNewContact != 0)
                                    {
                                        return
                                            Json(
                                                new JsonRequestResult
                                                    {
                                                        ResultType = JsonRequestResultType.Success,
                                                        Message = Resources.Resource.GS_Contact_Create_Success
                                                    },
                                                JsonRequestBehavior.AllowGet);
                                    }

                                    return
                                        Json(
                                            new JsonRequestResult
                                                {
                                                    ResultType = JsonRequestResultType.Error,
                                                    Message = Resources.Resource.GS_Contact_Create_Error
                                                },
                                            JsonRequestBehavior.AllowGet);
                                }
                                else
                                    return
                                        Json(
                                            new JsonRequestResult
                                            {
                                                ResultType = JsonRequestResultType.Error,
                                                Message = validationMessage
                                            },
                                            JsonRequestBehavior.AllowGet);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogService.Log("GS.ContactController.Create() :: Exception : ", ex);

                return Json(new JsonRequestResult { ResultType = JsonRequestResultType.Error, Message = Resources.Resource.GS_Contact_Create_Error }, JsonRequestBehavior.AllowGet);
            }

            return new JsonResult();
        }
        /// <summary>
        /// View with the Report to print
        /// </summary>
        /// <returns></returns>
        public ActionResult PrintAnnualEarningsReport(string year)
        {
            try
            {
                if (!String.IsNullOrWhiteSpace(year))
                {
                    var promoter = new WS.Promoter.Promoter().GetPromoter(
                        Settings.AutenticationKeyEarningSystem, RetornaidCliente());

                    if (promoter != null)
                    {
                        ViewBag.Year = !String.IsNullOrWhiteSpace(year) ? year : String.Empty;
                        ViewBag.TotalCommissions = GetTotalCommissionsByYear(year, promoter.IdPromoter);

                        return PartialView(promoter);
                    }
                }
            }
            catch (Exception ex)
            {
                LogService.Log("GS.CommissionController.AnnualEarningsDetail() :: Exception : ", ex);
            }

            return View();
        }
        /// <summary>
        /// Opens the View for Annual Earnings Report
        /// </summary>
        /// <returns></returns>
        public ActionResult AnnualEarningsReport()
        {
            var promoter = new WS.Promoter.Promoter().GetPromoter(
                Settings.AutenticationKeyEarningSystem, RetornaidCliente());

            if (promoter != null)
            {
                ViewBag.Years = GetYearsSelectListItem(promoter.IdPromoter);
            }

            return View();
        }
        /// <summary>
        /// Method thats build the model with the Commissions for a Period
        /// </summary>
        /// <param name="idPeriod"></param>
        /// <returns></returns>
        public IEnumerable<CommissionModel> MontaModel(string idPeriod)
        {
            try
            {
                if (!String.IsNullOrWhiteSpace(idPeriod))
                {
                    var idPeriodo = Convert.ToInt32(idPeriod);
                    var period = new WS.Period.Period().Get(Settings.AutenticationKeyEarningSystem, idPeriodo);

                    var dtInicio = period != null ? period.DataInicio : DateTime.MinValue;
                    var dtTermino = period != null ? period.DataTermino : DateTime.MaxValue;

                    var promoter = new WS.Promoter.Promoter().GetPromoter(
                        Settings.AutenticationKeyEarningSystem, RetornaidCliente());

                    if (promoter != null)
                    {
                        //Retorna as comissões
                        var commissions = new Commissions().SelectFiltered(
                            Settings.AutenticationKeyEarningSystem, dtInicio, dtTermino, promoter.IdPromoter);

                        var commissionsGroup = (from c in commissions
                                                group c by c.Pedido.IdCliente
                                                    into g
                                                    select new CommissionModel
                                                    {
                                                        Cliente_Pedido = g.Select(m => m.Cliente_Pedido).FirstOrDefault(),
                                                        Cliente = g.Select(m => m.Cliente).FirstOrDefault(),
                                                        Nivel = g.Select(m => m.Nivel).FirstOrDefault(),
                                                        ValorComissao = g.Sum(m => m.ValorComissao),
                                                        ValorPedido = g.Sum(m => m.ValorPedido)
                                                    }).ToArray();



                        return commissions.Any() ? commissionsGroup : new CommissionModel[0];
                    }
                }
            }
            catch (Exception ex)
            {
                LogService.Log("GS.CommissionController.Listing() :: Exception : ", ex);
            }

            return new CommissionModel[0];
        }