public void Can_SearchByDate()
        {
            var production1 = new Models.Data.EggProduction
            {
                Id   = Guid.NewGuid(),
                Date = DateTime.Today,
            };

            var production2 = new Models.Data.EggProduction
            {
                Id   = Guid.NewGuid(),
                Date = DateTime.Today.AddDays(-3)
            };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(production1);
                conn.InsertParam(production2);
            }

            var result = service.Search(new DateRangeSearchInfo
            {
                Start     = DateTime.Today.AddDays(-1),
                End       = DateTime.Today.AddDays(10),
                PageIndex = 1,
                PageSize  = 10
            });

            Assert.Equal(1, result.Total);
            Compare(production1, null, result.Items[0]);
        }
        private EggProduction MapDataToModel(Models.Data.EggProduction eggData,
                                             IList <Models.Data.EggProductionDetail> detailsData)
        {
            var production = Mapper.Map <Models.Data.EggProduction, EggProduction>(eggData);

            if (production != null)
            {
                foreach (var detailData in detailsData)
                {
                    var detail = Mapper.Map <Models.Data.EggProductionDetail, EggProductionDetail>(detailData);
                    production.Details.Add(detail);
                }
            }

            return(production);
        }
        public void Cant_SaveNewEggProduction_WithDuplicateDate()
        {
            var data1 = new Models.Data.EggProduction
            {
                Id   = Guid.NewGuid(),
                Date = DateTime.Today
            };

            var house = new Models.HenHouse
            {
                Id           = Guid.NewGuid(),
                Name         = "House 1",
                PurchaseCost = 1,
                Depreciation = 1,
                YearUsage    = 1,
                Active       = true
            };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(house);
                conn.InsertParam(data1);
            }

            var production = new Models.EggProduction
            {
                Date    = DateTime.Today,
                Details = new List <EggProductionDetail>()
                {
                    new Models.EggProductionDetail
                    {
                        CrackedEggCount = 1,
                        Fcr             = 1,
                        GoodEggCount    = 1,
                        HouseId         = house.Id,
                        RetailQuantity  = 1.2m
                    }
                }
            };

            Assert.Throws <ServiceException>(() => service.Save(production));
        }
        public void Can_GetById()
        {
            var id = Guid.NewGuid();

            var house = new Models.HenHouse
            {
                Id           = Guid.NewGuid(),
                Name         = "House 1",
                PurchaseCost = 1,
                Depreciation = 1,
                YearUsage    = 1,
                Active       = true
            };


            var data = new Models.Data.EggProduction
            {
                Id   = id,
                Date = DateTime.Today
            };
            var detail = new Models.Data.EggProductionDetail
            {
                CrackedEggCount = 1,
                Fcr             = 1,
                GoodEggCount    = 1,
                HouseId         = house.Id,
                ProductionId    = id,
                RetailQuantity  = 1.2m
            };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(house);
                conn.InsertParam(data);
                conn.InsertParam(detail);
            }

            var production = service.Get(id);

            Compare(data, null, production);
        }
        void Compare(Models.Data.EggProduction productionData, List <Models.Data.EggProductionDetail> details, Models.EggProduction production)
        {
            Assert.Equal(productionData.Id, production.Id);
            Assert.Equal(productionData.Date, production.Date);

            if (details != null)
            {
                Assert.Equal(details.Count, production.Details.Count);

                foreach (var detailData in details)
                {
                    var detail = production.Details.FirstOrDefault(d => d.HouseId == detailData.HouseId);

                    Assert.Equal(detailData.CrackedEggCount, detail.CrackedEggCount);
                    Assert.Equal(detailData.Fcr, detail.Fcr);
                    Assert.Equal(detailData.GoodEggCount, detail.GoodEggCount);
                    Assert.Equal(detailData.HouseId, detail.HouseId);
                    Assert.Equal(detailData.RetailQuantity, detail.RetailQuantity);
                }
            }
        }
        public void Cant_SaveExistingEggProduction_WithDuplicateDate()
        {
            var id = Guid.NewGuid();

            var house = new Models.HenHouse
            {
                Id = Guid.NewGuid(),
                Name = "House 1",
                PurchaseCost = 1,
                Depreciation = 1,
                YearUsage = 1,
                Active = true
            };

            var data = new Models.Data.EggProduction
            {
                Id = id,
                Date = DateTime.Today
            };

            var data2 = new Models.Data.EggProduction
                {
                    Id = Guid.NewGuid(),
                    Date = DateTime.Today.AddDays(-1)
                };

            var detail = new Models.Data.EggProductionDetail
            {
                CrackedEggCount = 1,
                Fcr = 1,
                GoodEggCount = 1,
                HouseId = house.Id,
                ProductionId = id,
                RetailQuantity = 1.2m
            };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(house);
                conn.InsertParam(data);
                conn.InsertParam(detail);
                conn.InsertParam(data2);
            }

            var production = new Models.EggProduction
            {
                Id = id,
                Date = DateTime.Today.AddDays(-1),
                Details = new List<EggProductionDetail>()
                        {
                            new Models.EggProductionDetail
                                {
                                    CrackedEggCount = 2,
                                    Fcr = 2,
                                    GoodEggCount = 2,
                                    HouseId = house.Id,
                                    RetailQuantity = 1.7m
                                }
                        }
            };

            Assert.Throws<ServiceException>(() => service.Save(production));
        }
        public void Can_SearchByDate()
        {
            var production1 = new Models.Data.EggProduction
                {
                    Id = Guid.NewGuid(),
                    Date = DateTime.Today,
                };

            var production2 = new Models.Data.EggProduction
                {
                    Id = Guid.NewGuid(),
                    Date = DateTime.Today.AddDays(-3)
                };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(production1);
                conn.InsertParam(production2);
            }

            var result = service.Search(new DateRangeSearchInfo
            {
                Start = DateTime.Today.AddDays(-1),
                End = DateTime.Today.AddDays(10),
                PageIndex = 1,
                PageSize = 10
            });

            Assert.Equal(1, result.Total);
            Compare(production1, null, result.Items[0]);
        }
        public void Can_SaveExistingEggProduction()
        {
            var id = Guid.NewGuid();

            var house = new Models.HenHouse
            {
                Id = Guid.NewGuid(),
                Name = "House 1",
                PurchaseCost = 1,
                Depreciation = 1,
                YearUsage = 1,
                Active = true
            };

            var data = new Models.Data.EggProduction
            {
                Id = id,
                Date = DateTime.Today
            };

            var detail = new Models.Data.EggProductionDetail
            {
                CrackedEggCount = 1,
                Fcr = 1,
                GoodEggCount = 1,
                HouseId = house.Id,
                ProductionId = id,
                RetailQuantity = 1.2m
            };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(house);
                conn.InsertParam(data);
                conn.InsertParam(detail);
            }

            var production = new Models.EggProduction
            {
                Id =id,
                Date = DateTime.Today,
                Details = new List<EggProductionDetail>()
                        {
                            new Models.EggProductionDetail
                                {
                                    CrackedEggCount = 2,
                                    Fcr = 2,
                                    GoodEggCount = 2,
                                    HouseId = house.Id,
                                    RetailQuantity = 1.7m
                                }
                        }
            };

            service.Save(production);

            using (var conn = factory.OpenDbConnection())
            {
                data = conn.FirstOrDefault<Models.Data.EggProduction>(e => e.Date == production.Date);
                var details = conn.Where<Models.Data.EggProductionDetail>(new { ProductionId = data.Id });
                Compare(data, details, production);
            }
        }
        public void Can_GetById()
        {
            var id = Guid.NewGuid();

            var house = new Models.HenHouse
                {
                    Id = Guid.NewGuid(),
                    Name = "House 1",
                    PurchaseCost = 1,
                    Depreciation = 1,
                    YearUsage = 1,
                    Active = true
                };

            var data = new Models.Data.EggProduction
                {
                    Id=id,
                    Date=DateTime.Today
                };
            var detail = new Models.Data.EggProductionDetail
                {
                    CrackedEggCount = 1,
                    Fcr = 1,
                    GoodEggCount = 1,
                    HouseId = house.Id,
                    ProductionId = id,
                    RetailQuantity = 1.2m
                };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(house);
                conn.InsertParam(data);
                conn.InsertParam(detail);
            }

            var production = service.Get(id);
            Compare(data, null, production);
        }
        public void Save(EggProduction production)
        {
            using (var db = factory.OpenDbConnection())
            {
                using (var tx = db.OpenTransaction())
                {
                    bool isNew = production.IsNew;

                    Models.Data.EggProduction productionData = null;

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

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

                    productionData = Mapper.Map <EggProduction, Models.Data.EggProduction>(production);

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

                    if (!isNew)
                    {
                        db.Delete <Models.Data.EggProductionDetail>(where : "ProductionId = {0}".Params(productionData.Id.ToString()));
                    }

                    foreach (var detail in production.Details)
                    {
                        var detailData = Mapper.Map <EggProductionDetail, Models.Data.EggProductionDetail>(detail);
                        detailData.ProductionId = production.Id;
                        db.InsertParam(detailData);
                    }
                    try
                    {
                        tx.Commit();
                    }
                    catch (Exception ex)
                    {
                        tx.Rollback();
                        throw new ServiceException(ex.Message);
                    }
                }
            }
        }
        public void Can_SaveExistingEggProduction()
        {
            var id = Guid.NewGuid();

            var house = new Models.HenHouse
            {
                Id           = Guid.NewGuid(),
                Name         = "House 1",
                PurchaseCost = 1,
                Depreciation = 1,
                YearUsage    = 1,
                Active       = true
            };

            var data = new Models.Data.EggProduction
            {
                Id   = id,
                Date = DateTime.Today
            };

            var detail = new Models.Data.EggProductionDetail
            {
                CrackedEggCount = 1,
                Fcr             = 1,
                GoodEggCount    = 1,
                HouseId         = house.Id,
                ProductionId    = id,
                RetailQuantity  = 1.2m
            };

            using (var conn = factory.OpenDbConnection())
            {
                conn.InsertParam(house);
                conn.InsertParam(data);
                conn.InsertParam(detail);
            }

            var production = new Models.EggProduction
            {
                Id      = id,
                Date    = DateTime.Today,
                Details = new List <EggProductionDetail>()
                {
                    new Models.EggProductionDetail
                    {
                        CrackedEggCount = 2,
                        Fcr             = 2,
                        GoodEggCount    = 2,
                        HouseId         = house.Id,
                        RetailQuantity  = 1.7m
                    }
                }
            };

            service.Save(production);

            using (var conn = factory.OpenDbConnection())
            {
                data = conn.FirstOrDefault <Models.Data.EggProduction>(e => e.Date == production.Date);
                var details = conn.Where <Models.Data.EggProductionDetail>(new { ProductionId = data.Id });
                Compare(data, details, production);
            }
        }