public void Should_HaveDetails()
        {
            var info   = new HenDepreciation();
            var errors = info.Validate();

            Assert.True(errors.Any(e => e.Message == "HenDepreciation_RequireDetails"));
        }
        public HttpResponseMessage Post(HenDepreciation 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);
        }
        public void Should_ConsistOf_DifferentHouses()
        {
            var houseId = Guid.NewGuid();

            var info = new HenDepreciation
            {
                Date    = DateTime.Today,
                Details = new List <HenDepreciationDetail>()
                {
                    new HenDepreciationDetail {
                        HouseId = houseId
                    },
                    new HenDepreciationDetail {
                        HouseId = houseId
                    }
                }
            };

            var errors = info.Validate();

            Assert.True(errors.Any(e => e.Message == "HenDepreciation_DuplicateHouse"));
        }
        public HttpResponseMessage Put(Guid id, HenDepreciation 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);
        }
        public HenDepreciation GetInitialValues(DateTime date)
        {
            var depreciation = new HenDepreciation {
                Date = date.Date
            };

            string totalFeedQuery = @"SELECT SUM(ConsumableUsageDetail.Count * COnsumableUsageDetail.UnitPrice) 
FROM ConsumableUsageDetail JOIN ConsumableUsage ON  ConsumableUsageDetail.UsageId = ConsumableUsage.Id
JOIN Consumable ON ConsumableUsagedetail.ConsumableId = Consumable.Id WHERE  ConsumableUsageDetail.HouseId=@houseId AND ConsumableUsage.Date=@date
AND Consumable.Type=0";

            string retailQuantityQuery =
                @"SELECT RetailQuantity FROM EggProductionDetail JOIN EggProduction ON EggProductionDetail.ProductionId = EggProduction.Id 
WHERE EggProductionDetail.HouseId=@houseId AND EggProduction.Date=@date";

            using (var db = factory.OpenDbConnection())
            {
                var houses = db.Select <HenHouse>(h => h.Active).OrderBy(h => h.Name).ToList();

                foreach (var house in houses)
                {
                    var detail = new HenDepreciationDetail();
                    detail.HouseId = house.Id;

                    var hens = db.Where <Hen>(new{ HouseId = house.Id, Active = true }).ToList();
                    var cost = hens.Sum(h => h.Count * h.Cost);

                    detail.InitialPrice = cost;

                    if (house.ProductiveAge > 0)
                    {
                        int totalFeed = 0;

                        var command = db.CreateCommand();
                        command.CommandType = CommandType.Text;
                        command.CommandText = totalFeedQuery;
                        command.Parameters.Add(new MySqlParameter("@houseId", MySqlDbType.Guid)
                        {
                            Value = house.Id
                        });
                        command.Parameters.Add(new MySqlParameter("@date", MySqlDbType.DateTime)
                        {
                            Value = date
                        });

                        object result = command.ExecuteScalar();

                        if (result != null && result != DBNull.Value)
                        {
                            totalFeed = Convert.ToInt32(result);
                        }

                        if (totalFeed > 0)
                        {
                            command             = db.CreateCommand();
                            command.CommandType = CommandType.Text;
                            command.CommandText = retailQuantityQuery;
                            command.Parameters.Add(new MySqlParameter("@houseId", MySqlDbType.Guid)
                            {
                                Value = house.Id
                            });
                            command.Parameters.Add(new MySqlParameter("@date", MySqlDbType.DateTime)
                            {
                                Value = date
                            });

                            result = command.ExecuteScalar();

                            decimal retailQuantity = 0;

                            if (result != null && result != DBNull.Value)
                            {
                                retailQuantity = Convert.ToDecimal(result);
                            }

                            if (retailQuantity > 0)
                            {
                                detail.Depreciation = totalFeed / retailQuantity / house.ProductiveAge;
                            }
                        }
                    }
                    else
                    {
                        detail.SellingPrice = 0;
                    }

                    depreciation.Details.Add(detail);
                }
            }

            return(depreciation);
        }
        public void Save(HenDepreciation depreciation)
        {
            using (var db = factory.OpenDbConnection())
            {
                using (var tx = db.OpenTransaction())
                {
                    bool isNew = depreciation.IsNew;

                    Models.Data.HenDepreciation depreciationData = null;

                    if (isNew)
                    {
                        depreciationData = db.FirstOrDefault <Models.Data.HenDepreciation>(u => u.Date == depreciation.Date);
                    }
                    else
                    {
                        depreciationData = db.Query <Models.Data.HenDepreciation>("Date = @Date and Id <> @Id",
                                                                                  new { Date = depreciation.Date, Id = depreciation.Id.ToString() })
                                           .FirstOrDefault();
                    }
                    if (depreciationData != null)
                    {
                        tx.Rollback();
                        throw new ServiceException("HenDepreciation_DuplicateDate");
                    }

                    if (isNew)
                    {
                        depreciation.Id = Guid.NewGuid();
                    }

                    depreciationData = Mapper.Map <HenDepreciation, Models.Data.HenDepreciation>(depreciation);

                    if (isNew)
                    {
                        db.InsertParam(depreciationData);
                    }
                    else
                    {
                        db.UpdateParam(depreciationData);
                    }

                    if (!isNew)
                    {
                        db.Delete <Models.Data.HenDepreciationDetail>(where : "DepreciationId = {0}".Params(depreciationData.Id.ToString()));
                    }

                    foreach (var detail in depreciation.Details)
                    {
                        var detailData = Mapper.Map <HenDepreciationDetail, Models.Data.HenDepreciationDetail>(detail);
                        detailData.DepreciationId = depreciation.Id;
                        db.InsertParam(detailData);
                    }
                    try
                    {
                        tx.Commit();
                    }
                    catch (Exception ex)
                    {
                        tx.Rollback();
                        throw new ServiceException(ex.Message);
                    }
                }
            }
        }