private static void UpdateMedical(DSModel db, KeyBinder key, DriverMedicalModel model)
        {
            var poco = db.DriversMedicals
                .Where(m => m.DriverMedicalID == model.DriverMedicalID)
                .FirstOrDefault();
            model.Map(poco);
            db.FlushChanges();

            SaveReminders(db, key, model, poco);
        }
        private static void InsertMedical(DSModel db, KeyBinder key, DriverMedicalModel model)
        {
            DriversMedical poco = new DriversMedical();
            model.Map(poco);
            db.Add(poco);

            key.AddKey(poco, model, model.GetName(p => p.DriverMedicalID));
            db.FlushChanges();
            SaveReminders(db, key, model, poco);
        }
        public static void DeleteMedical(DSModel db, DriverMedicalModel model)
        {
            if (db == null)
                throw new ArgumentNullException("db");
            if (model == null)
                throw new ArgumentNullException("model");

            db.DriversMedicals
                .Where(m => m.DriverMedicalID == model.DriverMedicalID)
                .DeleteAll();
        }
        private static void SaveReminders(DSModel db, KeyBinder key, DriverMedicalModel model, DriversMedical poco)
        {
            string sqlDelete = @"DELETE FROM drivers_medicals_reminders WHERE DriverMedicalID = @DriverMedicalID AND DriverMedicalReminderID NOT IN (@DriverMedicalReminderID);";
            string ids = "0";
            if (model.Reminders.Count > 0)
                ids = string.Join<uint>(",", model.Reminders.Select(r => r.DriverMedicalReminderID));

            sqlDelete = sqlDelete.Replace("@DriverMedicalReminderID", ids);

            db.ExecuteNonQuery(sqlDelete, new MySqlParameter("DriverMedicalID", poco.DriverMedicalID));
            string sqlInsert = @"
                INSERT INTO drivers_medicals_reminders
                  (DriverMedicalID, ReminderID, ReminderType, ShouldRemind) VALUES (@DriverMedicalID, @ReminderID, @ReminderType, @ShouldRemind);
                SELECT LAST_INSERT_ID();";
            string sqlUpdate = @"
                UPDATE drivers_medicals_reminders
                SET
                  DriverMedicalID = @DriverMedicalID, 
                  ReminderID = @ReminderID, 
                  ReminderType = @ReminderType, 
                  ShouldRemind = @ShouldRemind
                WHERE
                  DriverMedicalReminderID = @DriverMedicalReminderID;";

            foreach (var rem in model.Reminders)
            {
                if (rem.DriverMedicalReminderID == 0)
                {
                    rem.DriverMedicalID = poco.DriverMedicalID;
                    UtilityModel<uint> temp = new UtilityModel<uint>();
                    temp.Value = db.ExecuteQuery<uint>(sqlInsert,
                        new MySqlParameter("DriverMedicalID", rem.DriverMedicalID),
                        new MySqlParameter("ReminderID", rem.ReminderID),
                        new MySqlParameter("ReminderType", rem.ReminderType),
                        new MySqlParameter("ShouldRemind", rem.ShouldRemind))
                        .First();
                    key.AddKey(temp, rem, "Value", rem.GetName(p => p.DriverMedicalReminderID));
                }
                else
                {
                    rem.DriverMedicalID = poco.DriverMedicalID;
                    db.ExecuteNonQuery(sqlUpdate,
                        new MySqlParameter("DriverMedicalReminderID", rem.DriverMedicalReminderID),
                        new MySqlParameter("DriverMedicalID", rem.DriverMedicalID),
                        new MySqlParameter("ReminderID", rem.ReminderID),
                        new MySqlParameter("ReminderType", rem.ReminderType),
                        new MySqlParameter("ShouldRemind", rem.ShouldRemind));
                }
            }
        }
        public static void SaveMedical(DSModel db, KeyBinder key, DriverMedicalModel model)
        {
            if (db == null)
                throw new ArgumentNullException("db");
            if (key == null)
                throw new ArgumentNullException("key");
            if (model == null)
                throw new ArgumentNullException("model");

            if (model.DriverMedicalID == 0)
                InsertMedical(db, key, model);
            else
                UpdateMedical(db, key, model);
        }
        public static DriverMedicalModel GetMedical(DSModel db, uint driverMedicalID)
        {
            if (db == null)
                throw new ArgumentNullException("db");

            var poco = db.DriversMedicals.Where(m => m.DriverMedicalID == driverMedicalID).FirstOrDefault();
            var med = new DriverMedicalModel(poco);
            var reminders = DriverMedicalRepository.GetReminders(db, driverMedicalID);
            foreach (var r in reminders)
                med.Reminders.Add(r);
            med.IsChanged = false;

            return med;
        }
        public static CheckResult ValidateSave(DSModel db, DriverMedicalModel model)
        {
            CheckResult res = new CheckResult(model);

            if (model.DriverID == 0)
                res.AddError("Driver cannot be empty!", model.GetName(p => p.DriverID));
            if (model.MedTypeID == 0)
                res.AddError("Medical type cannot be empty!", model.GetName(p => p.MedTypeID));
            if (model.ExaminationDate == DateTime.MinValue)
                res.AddError("Examination date cannot be empty!", model.GetName(p => p.ExaminationDate));
            if (model.ValidityDate == DateTime.MinValue)
                res.AddError("Validity date cannot be empty!", model.GetName(p => p.ValidityDate));
            if (model.ValidityDate.Date <= model.ExaminationDate.Date)
                res.AddError("Validity date cannot be earlier than Examination date!", model.GetName(p => p.ValidityDate));

            return res;
        }
        public static CheckResult ValidateDelete(DSModel db, DriverMedicalModel model)
        {
            CheckResult res = new CheckResult(model);

            return res;
        }