public void Detail_ShouldHave_HouseId()
        {
            var detail = new HenDepreciationDetail {
                InitialPrice = 10, SellingPrice = 20, Depreciation = 10
            };
            var errors = detail.Validate();

            Assert.True(errors.Any(e => e.Message == "HenDepreciationDetail_RequireHouseId"));
        }
        public void Detail_ShouldHave_SellingPrice()
        {
            var detail = new HenDepreciationDetail {
                HouseId = Guid.NewGuid(), InitialPrice = 10, SellingPrice = -20, Depreciation = 10
            };
            var errors = detail.Validate();

            Assert.True(errors.Any(e => e.Message == "HenDepreciationDetail_InvalidSellingPrice"));
        }
        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);
        }