public JsonResult Create(string model)
        {
            if (!AuthorizationProvider.IsStatementAdmin())
            {
                return(Forbidden());
            }

            var accountModel = JsonConvert.DeserializeObject <PropertyAccountViewModel>(model);

            try
            {
                var dataProvider = new PropertyAccountProvider(_dbContext);
                var entity       = new PropertyAccount();
                dataProvider.MapData(accountModel, ref entity);
                dataProvider.Create(entity);
                dataProvider.Commit();                                     // need to commit to get the newly inserted PropertyAccountId

                accountModel.PropertyAccountId = entity.PropertyAccountId; // set the created Id to return to kendo grid

                foreach (var m in accountModel.SelectedPayoutMethods)
                {
                    _dbContext.PropertyAccountPayoutMethods.Add(new PropertyAccountPayoutMethod
                    {
                        PayoutMethodId    = Int32.Parse(m.Value),
                        PropertyAccountId = entity.PropertyAccountId
                    });
                }
                dataProvider.Commit();

                return(Json(accountModel, JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                var    innerErrorMessage = ex.InnerException != null ? ex.InnerException.Message : string.Empty;
                string message           = string.Format("Creating Property Account fails. {1} - {2}", ex.Message, innerErrorMessage);
                return(InternalError(message, "fail", ex));
            }
        }
        public JsonResult Update(string model) // parameter must be the same json object defined in parameterMap in kendo's datab source
        {
            if (!AuthorizationProvider.IsStatementAdmin())
            {
                return(Forbidden());
            }

            var accountModel = JsonConvert.DeserializeObject <PropertyAccountViewModel>(model);

            try
            {
                var dataProvider = new PropertyAccountProvider(_dbContext);
                var entity       = dataProvider.Retrieve(accountModel.PropertyAccountId);
                dataProvider.MapData(accountModel, ref entity);
                dataProvider.Update(entity.PropertyAccountId, entity);

                // update properties if changed
                if (dataProvider.IsPayoutMethodLinkChanged(accountModel))
                {
                    // ad-hoc property codes PropertyPayoutMethods replacement
                    var oldPayoutMethods = _dbContext.PropertyAccountPayoutMethods.Where(x => x.PropertyAccountId == entity.PropertyAccountId).ToList();
                    _dbContext.PropertyAccountPayoutMethods.RemoveRange(oldPayoutMethods);
                    foreach (var m in accountModel.SelectedPayoutMethods)
                    {
                        _dbContext.PropertyAccountPayoutMethods.Add(new PropertyAccountPayoutMethod
                        {
                            PropertyAccountId = accountModel.PropertyAccountId,
                            PayoutMethodId    = Int32.Parse(m.Value),
                        });
                    }
                }

                dataProvider.Commit();

                return(Json(accountModel, JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                var    innerErrorMessage = ex.InnerException != null ? ex.InnerException.Message : string.Empty;
                string message           = string.Format("Saving Property Account {0:d} fails. {1} - {2}", accountModel.PropertyAccountId, ex.Message, innerErrorMessage);
                return(InternalError(message, "fail", ex));
            }
        }
        public JsonResult Delete(string model)
        {
            if (!AuthorizationProvider.IsStatementAdmin())
            {
                return(Forbidden());
            }

            var accountModel = JsonConvert.DeserializeObject <PropertyAccountViewModel>(model);

            try
            {
                var dataProvider = new PropertyAccountProvider(_dbContext);
                dataProvider.Delete(accountModel.PropertyAccountId);
                dataProvider.Commit();
                return(Json("success", JsonRequestBehavior.AllowGet));
            }
            catch (Exception ex)
            {
                return(InternalError(string.Format("Delete Property Account {0:d} fails.", accountModel.PropertyAccountId), "fail", ex));
            }
        }