private CompanyManager(DSModel db, CompanyModel company, List<CompanyLicensePayRateModel> license, List<CompanyInvoicingPayRateModel> invoice)
     : base(db)
 {
     this.ActiveModel = company;
     this.LicensePayRates = license;
     this.InvoicePayRates = invoice;
 }
        public static CompanyModel GetCompany(DSModel db, uint companyID)
        {
            if (db == null)
                throw new ArgumentNullException("db");

            var poco = db.Companies.Where(c => c.CompanyID == companyID).FirstOrDefault();
            if (poco == null)
                return null;

            CompanyModel mod = new CompanyModel();
            mod.CompanyID = poco.CompanyID;
            mod.CompanyName = poco.CompanyName;
            mod.CompanyCode = poco.CompanyCode;
            mod.CompanyAddress1 = poco.CompanyAddress1;
            mod.CompanyAddress2 = poco.CompanyAddress2;
            mod.CompanyCity = poco.CompanyCity;
            mod.CompanyState = poco.CompanyState;
            mod.CompanyPostCode = poco.CompanyPostCode;
            mod.CompanyFax = poco.CompanyFax;
            mod.CompanyPhone = poco.CompanyPhone;
            mod.CompanyEmail = poco.CompanyEmail;
            mod.LunchTime = poco.LunchTime;
            mod.TrainingTime = poco.TrainingTime;
            mod.IsEnabled = poco.IsEnabled;
            mod.Locations.AddRange(LocationRepository.GetLocationsByCompany(db, companyID));

            mod.IsChanged = false;

            return mod;
        }
        public static CompanyManager CreateEdit(CompanyModel company)
        {
            var db = DB.GetContext();
            var license = CompanyRepository.GetLicensesPayRates(db, company.CompanyID);
            var invoice = CompanyRepository.GetInvoicePayRates(db, company.CompanyID);

            return new CompanyManager(db, company, license, invoice);
        }
        public static CheckResult ValidateSave(DSModel db, CompanyModel model)
        {
            CheckResult res = new CheckResult(model);
            if (string.IsNullOrWhiteSpace(model.CompanyName))
                res.AddError("Please enter a Company Name!", model.GetName(p => p.CompanyName));
            if (model.CompanyCode != string.Empty)
            {
                var check = db.Companies.Where(c => c.CompanyCode == model.CompanyCode && c.CompanyID != model.CompanyID).FirstOrDefault();
                if (check != null)
                    res.AddError("Another company already uses this Company Code! Use Peek or leave blank to autogenerate!", model.GetName(p => p.CompanyCode));
            }
            if (model.TrainingTime < 0m)
                res.AddError("Traning time cannot be negative number!", model.GetName(p => p.TrainingTime));

            var groups = model.Locations.GroupBy(l => l.LocationCode).ToList();
            if (groups.Any(g => g.Count() > 1))
            {
                var gr = groups.Where(g => g.Count() > 1).FirstOrDefault();
                res.AddError(string.Format("Duplicate location codes! Code: {0}", gr.FirstOrDefault().LocationCode));
            }
            return res;
        }
        public CheckResult SaveCompany(CompanyModel model, List<CompanyLicensePayRateModel> licenseRates, List<CompanyInvoicingPayRateModel> invoiceRates)
        {
            try
            {
                using (var db = DB.GetContext())
                {
                    var check = CompanyValidator.ValidateSave(db, model);
                    if (check.Failed)
                        return check;

                    var checkLicense = CompanyValidator.ValidateDriverRates(db, licenseRates);
                    if (checkLicense.Failed)
                        return checkLicense;

                    var checkInvoice = CompanyValidator.ValidateInvoiceRates(db, invoiceRates);
                    if (checkInvoice.Failed)
                        return checkInvoice;

                    KeyBinder key = new KeyBinder();
                    CompanyRepository.SaveCompany(db, key, model);
                    if (model.CompanyID != 0)
                    {
                        CompanyRepository.SaveLicensesPayRates(db, key, licenseRates);
                        CompanyRepository.SaveInvoicePayRates(db, key, invoiceRates);
                    }
                    db.SaveChanges();
                    key.BindKeys();
                    model.IsChanged = false;

                    return check;
                }
            }
            catch (Exception ex)
            {
                return new CheckResult(ex);
            }
        }
        public static void DeleteCompany(DSModel db, CompanyModel model)
        {
            if (db == null)
                throw new ArgumentNullException("db");

            if (model.CompanyID != 0)
            {
                var poco = db.Companies.Where(c => c.CompanyID == model.CompanyID).FirstOrDefault();
                if (poco != null)
                {
                    db.Delete(poco);
                }
            }
        }
        private static void UpdateCompany(DSModel db, KeyBinder key, CompanyModel model)
        {
            Company poco = db.Companies.Where(c => c.CompanyID == model.CompanyID).FirstOrDefault();
            if (poco == null)
                throw new ArgumentException("No company with the specified ID!");

            poco.CompanyID = model.CompanyID;
            poco.CompanyName = model.CompanyName;
            poco.CompanyCode = model.CompanyCode;
            poco.CompanyAddress1 = model.CompanyAddress1;
            poco.CompanyAddress2 = model.CompanyAddress2;
            poco.CompanyCity = model.CompanyCity;
            poco.CompanyState = model.CompanyState;
            poco.CompanyPostCode = model.CompanyPostCode;
            poco.CompanyContactName = model.CompanyContactName;
            poco.CompanyFax = model.CompanyFax;
            poco.CompanyPhone = model.CompanyPhone;
            poco.CompanyEmail = model.CompanyEmail;
            poco.LunchTime = model.LunchTime;
            poco.TrainingTime = model.TrainingTime;
            poco.IsEnabled = model.IsEnabled;

            List<Location> locationsToBeDeleted = poco.Locations.Where(dl => !model.Locations.Any(ml => ml.LocationID == dl.LocationID)).ToList();
            foreach (var del in locationsToBeDeleted)
            {
                db.Delete(del);
                poco.Locations.Remove(del);
            }

            foreach (var ins in model.Locations)
            {
                Location loc = LocationRepository.SaveLocation(db, key, ins, poco);
                poco.Locations.Add(loc);
                key.AddKey(loc, ins, ins.GetName(p => p.LocationID));
            }
        }
        private static void InsertCompany(DSModel db, KeyBinder key, CompanyModel model)
        {
            Company poco = new Company();
            poco.CompanyID = model.CompanyID;
            poco.CompanyName = model.CompanyName;
            if (model.CompanyCode == string.Empty)
                poco.CompanyCode = "C" + CompanyRepository.PeekCompanyCode(db, "C");
            else
                poco.CompanyCode = model.CompanyCode;
            poco.CompanyAddress1 = model.CompanyAddress1;
            poco.CompanyAddress2 = model.CompanyAddress2;
            poco.CompanyCity = model.CompanyCity;
            poco.CompanyState = model.CompanyState;
            poco.CompanyPostCode = model.CompanyPostCode;
            poco.CompanyContactName = model.CompanyContactName;
            poco.CompanyFax = model.CompanyFax;
            poco.CompanyPhone = model.CompanyPhone;
            poco.CompanyEmail = model.CompanyEmail;
            poco.LunchTime = model.LunchTime;
            poco.TrainingTime = model.TrainingTime;
            poco.IsEnabled = model.IsEnabled;

            foreach (var loc in model.Locations)
            {
                Location l = LocationRepository.SaveLocation(db, key, loc, poco);
                poco.Locations.Add(l);
                key.AddKey(l, loc, loc.GetName(p => p.LocationID));
                key.AddKey(poco, loc, loc.GetName(p => p.CompanyID));
            }

            db.Add(poco);

            key.AddKey(poco, model, model.GetName(p => p.CompanyID));
        }
        public static void SaveCompany(DSModel db, KeyBinder key, CompanyModel model)
        {
            if (db == null)
                throw new ArgumentNullException("db");
            if (key == null)
                throw new ArgumentNullException("key");
            if (model == null)
                throw new ArgumentNullException("model");

            if (model.CompanyID == 0)
                InsertCompany(db, key, model);
            else
                UpdateCompany(db, key, model);
        }
        private void BindModel(CompanyModel model)
        {
            BindingSource bsModel = new BindingSource();
            bsModel.DataSource = model;

            CompanyName.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyName), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyCode.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyCode), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyAddress1.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyAddress1), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyAddress2.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyAddress2), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyCity.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyCity), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyState.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyState), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyPostCode.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyPostCode), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyContactName.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyContactName), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyFax.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyFax), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyPhone.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyPhone), true, DataSourceUpdateMode.OnPropertyChanged);
            CompanyEmail.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.CompanyEmail), true, DataSourceUpdateMode.OnPropertyChanged);
            LunchTime.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.LunchTime), true, DataSourceUpdateMode.OnPropertyChanged);
            TrainingTime.DataBindings.Add("EditValue", bsModel, model.GetName(p => p.TrainingTime), true, DataSourceUpdateMode.OnPropertyChanged);
            IsEnabled.DataBindings.Add("Checked", bsModel, model.GetName(p => p.IsEnabled), true, DataSourceUpdateMode.OnPropertyChanged);

            BindingSource bsLocations = new BindingSource();
            bsLocations.DataSource = model.Locations;
            gridControlLocations.DataSource = bsLocations;

            BindingSource bsLicenseRates = new BindingSource();
            bsLicenseRates.DataSource = this.Manager.LicensePayRates;
            gridControlLicense.DataSource = bsLicenseRates;

            BindingSource bsInvoiceRates = new BindingSource();
            bsInvoiceRates.DataSource = this.Manager.InvoicePayRates;
            gridControlInvoice.DataSource = bsInvoiceRates;
        }
 public static CheckResult ValidateDelete(DSModel db, CompanyModel model)
 {
     return new CheckResult(model);
 }
        public CheckResult DeleteCompany(CompanyModel model)
        {
            try
            {
                using (var db = DB.GetContext())
                {
                    var check = CompanyValidator.ValidateDelete(db, model);
                    if (check.Failed)
                        return check;

                    CompanyRepository.DeleteCompany(db, model);
                    db.SaveChanges();
                    return check;
                }
            }
            catch (Exception ex)
            {
                return new CheckResult(ex);
            }
        }
 private CompanyManager(DSModel db, CompanyModel company) : this(db, company, new List<CompanyLicensePayRateModel>(), new List<CompanyInvoicingPayRateModel>()) { }