public async Task <bool> Put(PlacedOrderDetail model)
        {
            var result = false;

            //if current user is Restaurant Admin, don't let them update order detail
            // because when update price will be wrong
            if (_authenticationDto.TypeId == (int)EAccountType.Admin || _authenticationDto.TypeId == (int)EAccountType.Mod ||
                _authenticationDto.TypeId == (int)EAccountType.RestaurantAdmin)
            {
                return(result);
            }
            if (ModelState.IsValid)
            {
                result = await _placedOrderDetailBusiness.Update(model);

                //if (result)
                //{
                //    //get total price from order details
                //    var totalDetailPrice = await _placedOrderDetailBusiness.GetTotalDetailPriceByOrderId
                //    (_authenticationDto.RestaurantId, _authenticationDto.BranchId, model.PlacedOrderId);

                //    // get and update order price by newest order details price
                //    var order = await _placedOrderBusiness.GetById(_authenticationDto.RestaurantId, _authenticationDto.BranchId, model.PlacedOrderId);
                //    if (order != null)
                //    {
                //        order.Price = totalDetailPrice;
                //    }
                //}
            }
            return(result);
        }
        public async Task <bool> Update(PlacedOrderDetail model)
        {
            var result = false;
            var record = await _placedOrderDetailRepository.Repo.FirstOrDefaultAsync(c => c.Id == model.Id);

            if (record != null)
            {
                record.OfferId     = model.OfferId;
                record.MenuId      = model.MenuId;
                record.SizeId      = model.SizeId;
                record.Quantity    = model.Quantity;
                record.MenuPrice   = model.MenuPrice;
                record.Price       = model.Price;
                record.IsFinish    = model.IsFinish;
                record.Description = model.Description;

                var totalDetailPrice = await GetTotalDetailPriceByOrderId(record.RestaurantId, record.BranchId, record.PlacedOrderId);

                var placedOrder = await _placedOrderRepository.Repo.ToFilterByRole(f => f.RestaurantId,
                                                                                   f => f.BranchId, record.RestaurantId, record.BranchId).Where(c => c.Id == record.PlacedOrderId)
                                  .FirstOrDefaultAsync();

                if (placedOrder != null)
                {
                    placedOrder.Price = (record.MenuPrice * record.Quantity) + totalDetailPrice;

                    if (placedOrder.DiscountType == (int)EDiscountType.Percent)
                    {
                        placedOrder.FinalPrice = placedOrder.Price + placedOrder.Tax - ((placedOrder.Price * placedOrder.Discount) / 100);
                    }
                    else if (placedOrder.DiscountType == (int)EDiscountType.Money)
                    {
                        placedOrder.FinalPrice = placedOrder.Price + placedOrder.Tax - placedOrder.Discount;
                    }

                    await _placedOrderDetailRepository.SaveChangeAsync();

                    result = true;
                }
            }
            return(result);
        }
        public async Task <int> Post(PlacedOrderDetail model)
        {
            var result = 0;

            //if current user is Restaurant Admin, don't let them add order detail
            // because when update price will be wrong
            if (_authenticationDto.TypeId == (int)EAccountType.Admin || _authenticationDto.TypeId == (int)EAccountType.Mod ||
                _authenticationDto.TypeId == (int)EAccountType.RestaurantAdmin)
            {
                return(result);
            }

            if (ModelState.IsValid)
            {
                model.RestaurantId = _authenticationDto.RestaurantId;
                model.BranchId     = _authenticationDto.BranchId;
                model.Status       = 1;
                model.IsFinish     = 0;
                model.Price        = model.Quantity * model.MenuPrice;

                var modelInsert = await _placedOrderDetailBusiness.Add(model);

                result = modelInsert.Id;

                //if (result > 0)
                //{
                //    //get total price from order details
                //    var totalDetailPrice = await _placedOrderDetailBusiness.GetTotalDetailPriceByOrderId
                //        (model.RestaurantId, model.BranchId, model.PlacedOrderId);

                //    // get and update order price by newest order details price
                //    var order = await _placedOrderBusiness.GetById(model.RestaurantId, model.BranchId, model.PlacedOrderId);
                //    if (order != null)
                //    {
                //        order.Price = totalDetailPrice;
                //        await _placedOrderBusiness.UpdatePriceToPlacedOrder(_mapper.Map<PlacedOrder>(order));
                //    }
                //}
            }
            return(result);
        }
        public async Task <PlacedOrderDetail> Add(PlacedOrderDetail model)
        {
            //var order = new PlacedOrder
            //{
            //    CreatedDate = DateTime.Now
            //};

            //order.PlacedOrderDetail.Add(model);


            var entity = _placedOrderDetailRepository.Add(model);

            var totalDetailPrice = await GetTotalDetailPriceByOrderId(entity.RestaurantId, entity.BranchId, entity.PlacedOrderId);

            var placedOrder = await _placedOrderRepository.Repo.ToFilterByRole(f => f.RestaurantId,
                                                                               f => f.BranchId, entity.RestaurantId, entity.BranchId).Where(c => c.Id == entity.PlacedOrderId)
                              .FirstOrDefaultAsync();

            if (placedOrder != null)
            {
                placedOrder.Price = (entity.MenuPrice * entity.Quantity) + totalDetailPrice;
                if (placedOrder.DiscountType == (int)EDiscountType.Percent)
                {
                    placedOrder.FinalPrice = placedOrder.Price + placedOrder.Tax - ((placedOrder.Price * placedOrder.Discount) / 100);
                }
                else if (placedOrder.DiscountType == (int)EDiscountType.Money)
                {
                    placedOrder.FinalPrice = placedOrder.Price + placedOrder.Tax - placedOrder.Discount;
                }

                await _placedOrderDetailRepository.SaveChangeAsync();

                return(entity);
            }


            return(null);
        }