public void Save(DistributorViewModel distviewmodel)
        {
            bool isNew = false;
            CostCentre distributorCC = _costCentreRepository.GetById(distviewmodel.Id);
            if (distributorCC==null) //then new
            {
                
                isNew = true;
                Producer parentCC = _producerRepository.GetProducer();
                distributorCC = _costCentreFactory.CreateCostCentre(distviewmodel.Id, CostCentreType.Distributor, parentCC);
            }
          

            Distributor distributor = distributorCC as Distributor;
            distributor.CostCentreCode = distviewmodel.CostCentreCode;
            distributor.Name = distviewmodel.Name;
            distributor.Owner = distviewmodel.Owner;
            distributor.Region = _regionrepository.GetById(distviewmodel.RegionId);
            distributor.ASM = distviewmodel.ASM != Guid.Empty  ? _userRepository.GetById(distviewmodel.ASM) : null;
            distributor.SalesRep = distviewmodel.SalesRep != Guid.Empty
                                       ? _userRepository.GetById(distviewmodel.SalesRep)
                                       : null;
            distributor.Surveyor = distviewmodel.Surveyor != Guid.Empty
                                       ? _userRepository.GetById(distviewmodel.Surveyor)
                                       : null;
            distributor.AccountNo = distviewmodel.AccountNo;
            distributor.VatRegistrationNo = distviewmodel.VatRegistrationNo;
            distributor.PIN = distviewmodel.PIN;
            distributor.ProductPricingTier = _pricingTierRepository.GetById(distviewmodel.PricingTierId);
            distributor.PaybillNumber = distviewmodel.PayBillNumber;
            distributor.MerchantNumber = distviewmodel.MerchantNumber;

            Guid distributorId = _distrepository.Save(distributor);

            if (isNew)
            {
                CostCentre savedDistributor = _distrepository.GetById(distributorId);
                
                //also setup a distributor pending dispatchwarehouse
                CostCentre _ccdpdw =
                    _costCentreFactory.CreateCostCentre(Guid.NewGuid(), CostCentreType.DistributorPendingDispatchWarehouse,
                                                        savedDistributor);
                DistributorPendingDispatchWarehouse ccdpdw = _ccdpdw as DistributorPendingDispatchWarehouse;
                ccdpdw.Name = savedDistributor.Name + " - Pending Dispatch Warehouse ";
                _costCentreRepository.Save(ccdpdw);
            }

        }
        public ActionResult CreateDistributor(DistributorViewModel dvm)
        {
            try
            {
                ViewBag.RegionList = _DistributorViewModelBuilder.Region();
                _DistributorViewModelBuilder.Save(dvm);
                return RedirectToAction("listDistributors");
            }
            catch (DomainValidationException dve)
            {

                string msg = ValidationSummary.DomainValidationErrors(dve);
                ViewBag.msg = msg;
                return View();
            }
            catch (Exception ex)
            {
                ViewBag.msg = ex.Message;

                return View();
            }

        }
 public ActionResult EditDistributor(DistributorViewModel dvm)
 {
     _DistributorViewModelBuilder.Save(dvm);
     ViewBag.RegionList = _DistributorViewModelBuilder.Region();
     return RedirectToAction("listDistributors");
 }
        public ActionResult EditDistributor(DistributorViewModel dvm)
        {
            //ViewBag.RegionList = _DistributorViewModelBuilder.Region();
            //ViewBag.ASMList = _DistributorViewModelBuilder.ASM();
            //ViewBag.SalesRepList = _DistributorViewModelBuilder.SalesRep();
            //ViewBag.SurveyorList = _DistributorViewModelBuilder.Surveyor();
            try
            {
                _DistributorViewModelBuilder.Save(dvm);
                _auditLogViewModelBuilder.AddAuditLog(this.User.Identity.Name, "Edit", "Distributor", DateTime.Now);
                Session["msg"] = "Distributor Successfully Edited";
                return RedirectToAction("listDistributors");
            }
            catch (DomainValidationException dve)
            {
                ValidationSummary.DomainValidationErrors(dve,ModelState);
                _log.Debug("Failed to edit distributor" + dve.Message);
                _log.Error("Failed to edit distributor" + dve.ToString());
                return View();
            }
            catch (Exception ex)
            {
                _log.Debug("Failed to edit distributor" + ex.Message);
                _log.Error("Failed to edit distributor" + ex.ToString());
                HQMailerViewModelBuilder hqm = new HQMailerViewModelBuilder(ConfigurationSettings.AppSettings["ServerIP"], ConfigurationSettings.AppSettings["UserName"], ConfigurationSettings.AppSettings["Password"]);


                hqm.Send(ConfigurationSettings.AppSettings["ServerEmail"], ConfigurationSettings.AppSettings["MailGroup"], "Test", "Edit Distributor error:" + ex.Message);

                return View();
            }

        }
        public ActionResult CreateDistributor(DistributorViewModel dvm)
        {
            ViewBag.RegionList = _DistributorViewModelBuilder.Region();
            ViewBag.ASMList = _DistributorViewModelBuilder.ASM();
            ViewBag.SalesRepList = _DistributorViewModelBuilder.SalesRep();
            ViewBag.SurveyorList = _DistributorViewModelBuilder.Surveyor();
            //ViewBag.TierList = _DistributorViewModelBuilder.PricingTier();
            try
            {
                if (dvm.RegionId == Guid.Empty)
                {
                    ModelState.AddModelError("Distributor", "Region is required");
                    return View();
                }
                else
                {
                    dvm.Id = Guid.NewGuid();
                    _DistributorViewModelBuilder.Save(dvm);
                    _auditLogViewModelBuilder.AddAuditLog(this.User.Identity.Name, "Create", "Distributor", DateTime.Now);
                    Session["msg"] = "Distributor Successfully Created";
                    var latestDistributr = _DistributorViewModelBuilder.Get(dvm.Id);//.Where(n => n.DateCreated < DateTime.Now).OrderByDescending(n => n.DateCreated).ThenByDescending(n => n.id).ToList()[0];//;
                    //  DistributorViewModel  latestDistributr = _DistributorViewModelBuilder.GetAll().FirstOrDefault(n=>n.DateCreated<DateTime.Now);

                    Guid distributrId = latestDistributr.Id;
                    string distributorName = latestDistributr.Name;
                    // return RedirectToAction("listDistributors");
                    return RedirectToAction("CreateContact", "Contact", new { CostCentre = distributrId, CostCentreName = distributorName, ContactFor = "Distributor" });
                }
            }
            catch (DomainValidationException dve)
            {

                ValidationSummary.DomainValidationErrors(dve, ModelState);
                _log.Debug("Failed to create distributor" + dve.Message);
                _log.Error("Failed to create distributor" + dve.ToString());
                return View();
            }
            catch (Exception ex)
            {
                ViewBag.msg = ex.Message;
                _log.Debug("Failed to create distributor" + ex.Message);
                _log.Error("Failed to create distributor" + ex.ToString()); HQMailerViewModelBuilder hqm = new HQMailerViewModelBuilder(ConfigurationSettings.AppSettings["ServerIP"], ConfigurationSettings.AppSettings["UserName"], ConfigurationSettings.AppSettings["Password"]);


                hqm.Send(ConfigurationSettings.AppSettings["ServerEmail"], ConfigurationSettings.AppSettings["MailGroup"], "Test", "Create Distributor error:" + ex.Message);

                return View();
            }

        }
        DistributorViewModel Map(Distributor distributor)
        {
            DistributorViewModel distributorViewModel = new DistributorViewModel();
            distributorViewModel.Id = distributor.Id;
            distributorViewModel.Name = distributor.Name;
            distributorViewModel.Owner = distributor.Owner;
            if (distributor.Region != null)
            {
                distributorViewModel.RegionId = distributor.Region.Id;
                distributorViewModel.RegionName = distributor.Region.Name;
            }


            if (distributor.SalesRep != null)
            {
                distributorViewModel.SalesRepName =_userRepository.GetById(distributor.SalesRep.Id).Username;
            }
            if (distributor.Surveyor != null)
            {
                distributorViewModel.SurveyorName =_userRepository.GetById(distributor.Surveyor.Id).Username;
            }
            if (distributor.ASM != null)
            {
                distributorViewModel.ASMName =_userRepository.GetById( distributor.ASM.Id).Username;
            }

            distributorViewModel.RegionId = distributor.Region == null ? Guid.Empty: distributor.Region.Id;
            distributorViewModel.PricingTierId = distributor.ProductPricingTier == null ? Guid.Empty : distributor.ProductPricingTier.Id;
            distributorViewModel.Region =distributor.Region==null ? "": _regionrepository.GetById(distributor.Region.Id).Name;
            distributorViewModel.AccountNo = distributor.AccountNo;
            distributorViewModel.VatRegistrationNo = distributor.VatRegistrationNo;
            distributorViewModel.PIN = distributor.PIN;
            distributorViewModel.CostCentreCode = distributor.CostCentreCode;
            distributorViewModel.DateCreated = distributor._DateCreated;
            distributorViewModel.PayBillNumber = distributor.PaybillNumber;
            distributorViewModel.MerchantNumber = distributor.MerchantNumber;
            distributorViewModel.ASM = distributor.ASM == null ? Guid.Empty : distributor.ASM.Id;
            distributorViewModel.SalesRep = distributor.SalesRep == null ? Guid.Empty : distributor.SalesRep.Id;
            distributorViewModel.Surveyor = distributor.Surveyor == null ? Guid.Empty : distributor.Surveyor.Id;
            if (distributor.Id == Guid.Empty)
                distributorViewModel.IsActive = true;
            else
                distributorViewModel.IsActive = distributor._Status == EntityStatus.Active ? true : false;

            distributorViewModel.CanEditRegion = _masterDataUsage.CanEditHubOrDistributrRegion(distributor);

            return distributorViewModel;


        }