/// <summary>
        /// Maps the usage to model. Need to use automapper?
        /// </summary>
        /// <param name="usage">The usage.</param>
        /// <param name="details">The details.</param>
        /// <returns>EggFarmSystem.Models.ConsumableUsage.</returns>
        private ConsumableUsage MapUsageToModel(Models.Data.ConsumableUsage usage, List<Models.Data.ConsumableUsageDetail> details)
        {
            var model = new ConsumableUsage();
            model.Id = usage.Id;
            model.Date = usage.Date;
            model.Total = usage.Total;
            model.Details = new List<ConsumableUsageDetail>();

            foreach (var detail in details)
            {
                var detailModel = new ConsumableUsageDetail
                    {
                        ConsumableId = detail.ConsumableId,
                        Count = detail.Count,
                        HouseId = detail.HouseId,
                        SubTotal = detail.SubTotal,
                        UnitPrice = detail.UnitPrice
                    };
                model.Details.Add(detailModel);
            }

            return model;
        }
        public HttpResponseMessage Post(ConsumableUsage value)
        {
            HttpResponseMessage response = null;
            ValidateModel(value);

            if (!ModelState.IsValid)
            {
                response = Request.CreateResponse(HttpStatusCode.BadRequest, GetModelErrors());
                return response;
            }

            try
            {
                service.Save(value);
                response = Request.CreateResponse(HttpStatusCode.Created, value);
                string uri = Url.Link("DefaultApi", new { id = value.Id });
                response.Headers.Location = new Uri(uri);
            }
            catch (Exception ex)
            {
                response = Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
            }

            return response;
        }
        /// <summary>
        /// Saves the specified model.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <returns><c>true</c> if save success, <c>false</c> otherwise</returns>
        public void Save(ConsumableUsage model)
        {
            using (var db = factory.OpenDbConnection())
            {
                using (var trans = db.OpenTransaction())
                {
                     bool isNew = model.IsNew;

                    Models.Data.ConsumableUsage usage = null;

                    if (isNew)
                    {
                        usage = db.FirstOrDefault<Models.Data.ConsumableUsage>(u => u.Date == model.Date);
                    }
                    else
                    {
                        usage = db.Query<Models.Data.ConsumableUsage>("Date = @Date and Id <> @Id",
                                                                      new {Date = model.Date, Id = model.Id.ToString()})
                                  .FirstOrDefault();
                    }

                    if (usage != null)
                    {
                        trans.Rollback();
                        throw new ServiceException("Usage_DuplicateDate");
                    }

                    if (isNew)
                        model.Id = Guid.NewGuid();

                    usage = Mapper.Map<ConsumableUsage, Models.Data.ConsumableUsage>(model);

                    if(isNew) db.InsertParam(usage); else db.UpdateParam(usage);

                    if (! isNew)
                        db.Delete<Models.Data.ConsumableUsageDetail>(where: "UsageId = {0}".Params(usage.Id.ToString()));

                    foreach (var detailModel in model.Details)
                    {
                        var detail = Mapper.Map<ConsumableUsageDetail, Models.Data.ConsumableUsageDetail>(detailModel);
                        detail.UsageId = usage.Id;
                        db.InsertParam(detail);
                    }
                    try
                    {
                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        throw new ServiceException(ex.Message);
                    }

                }
            }
        }
        public HttpResponseMessage Put(Guid id, ConsumableUsage value)
        {
            ValidateModel(value);

            if (! ModelState.IsValid || value.Id != id)
            {
                return Request.CreateResponse(HttpStatusCode.BadRequest, GetModelErrors());
            }

            HttpResponseMessage response = null;

            try
            {
                service.Save(value);
                response = Request.CreateResponse(HttpStatusCode.OK);
            }
            catch (Exception ex)
            {
                response = Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
            }

            return response;
        }