/// <summary>
 /// Устанавливает основание скидки с введенными значениями в рублях или процентах для всего заказа
 /// </summary>
 /// <param name="reason">Основание скидки</param>
 /// <param name="discount">Скидки</param>
 /// <param name="unit">Скидка в процентах или рублях</param>
 /// <param name="orderItems">Список строк заказа</param>
 public void SetCustomDiscountForOrder(DiscountReason reason, decimal discount, DiscountUnits unit, IList <OrderItem> orderItems)
 {
     foreach (var item in orderItems)
     {
         SetCustomDiscountForOrderItem(reason, discount, unit, item);
     }
 }
        public bool Edit(DiscountReason obj)
        {
            Connect();
            SqlCommand cmd = new SqlCommand("IUDiscountReason", con);

            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@HospitalID", HospitalID);
            cmd.Parameters.AddWithValue("@LocationID", LocationID);
            cmd.Parameters.AddWithValue("@DiscountReasonID", obj.DiscountReasonID);
            cmd.Parameters.AddWithValue("@DiscountReason", obj.DiscountReasonName.ToUpper());
            cmd.Parameters.AddWithValue("@CreationID", UserID);
            cmd.Parameters.AddWithValue("@Mode", "Edit");
            con.Open();
            int i = cmd.ExecuteNonQuery();

            con.Close();
            if (i > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public string save(DiscountReason obj)
        {
            Connect();
            try
            {
                SqlCommand cmd = new SqlCommand("IUDiscountReason", con);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@HospitalID", HospitalID);
                cmd.Parameters.AddWithValue("@LocationID", LocationID);
                if (obj.DiscountReasonID == 0)
                {
                    cmd.Parameters.AddWithValue("@Mode", "Add");
                }
                else
                {
                    cmd.Parameters.AddWithValue("@Mode", "Edit");
                }
                cmd.Parameters.AddWithValue("@DiscountReasonID", obj.DiscountReasonID);
                cmd.Parameters.AddWithValue("@DiscountReason", obj.DiscountReasonName);
                cmd.Parameters.AddWithValue("@CreationID", UserID);

                con.Open();
                int i = cmd.ExecuteNonQuery();
                con.Close();
                if (i > 0)
                {
                    obj.Message = "Save Successfully";
                }
            }
            catch (Exception ex)
            {
                obj.Message = ex.Message;
            }
            return(obj.Message);
        }
        /// <summary>
        /// Установка определенной скидки на строку заказа с прикреплением указанного основания скидки,
        /// после проверки возможности этого действия
        /// </summary>
        /// <param name="reason">Основание скидки</param>
        /// <param name="discount">Скидка</param>
        /// <param name="unit">Скидка в процентах или рублях</param>
        /// <param name="orderItem">Строка заказа</param>
        private void SetCustomDiscountForOrderItem(DiscountReason reason, decimal discount, DiscountUnits unit, OrderItem orderItem)
        {
            if (!CanSetDiscount(reason, orderItem))
            {
                return;
            }

            SetCustomDiscount(reason, discount, unit, orderItem);
        }
        /// <summary>
        /// Установка скидки исходя из выбранного основания скидки для строки счета без отгрузки на предоплату
        /// </summary>
        /// <param name="reason">Основание скидки</param>
        /// <param name="orderItem">Строка счета без отгрузки на предоплату</param>
        public void SetDiscountFromDiscountReasonForOrderItemWithoutShipment(
            DiscountReason reason, OrderWithoutShipmentForAdvancePaymentItem orderItem)
        {
            if (!CanSetDiscountForOrderWithoutShipment(reason, orderItem))
            {
                return;
            }

            SetDiscount(reason, orderItem);
        }
        public bool ExistsActiveDiscountReasonWithName(
            IUnitOfWork uow, int discountReasonId, string name, out DiscountReason discountReason)
        {
            discountReason = uow.Session.QueryOver <DiscountReason>()
                             .Where(dr => !dr.IsArchive)
                             .And(dr => dr.Id != discountReasonId)
                             .And(dr => dr.Name == name)
                             .SingleOrDefault();

            return(discountReason != null);
        }
        /// <summary>
        /// Проверка применимости скидки к номенклатуре, т.е. если выбранное основание скидки содержит номенклатуру,
        /// которая указана в основании скидки, либо основание содержит категорию номенклатуры, либо основание содержит товарную группу
        /// с такой номенклатурой, то возвращаем true
        /// </summary>
        /// <param name="reason">Основание скидки</param>
        /// <param name="nomenclature">Номенклатура</param>
        /// <returns>true/false</returns>
        /// <exception cref="ArgumentNullException">Кидаем ошибку, если основание скидки null</exception>
        public bool IsApplicableDiscount(DiscountReason reason, Nomenclature nomenclature)
        {
            if (reason == null)
            {
                throw new ArgumentNullException(nameof(reason));
            }

            return(ContainsNomenclature(nomenclature.Id, reason.Nomenclatures) ||
                   ContainsNomenclatureCategory(nomenclature.Category, reason.NomenclatureCategories) ||
                   ContainsProductGroup(nomenclature.ProductGroup, reason.ProductGroups));
        }
Beispiel #8
0
        public void Check_Perscnt_Discount_For_OrderItems()
        {
            // arrange
            Order testOrder = CreateTestOrderWithOrderItems();

            testOrder.ObservableOrderItems.ListContentChanged -= testOrder.ObservableOrderItems_ListContentChanged;
            DiscountReason discountReason = Substitute.For <DiscountReason>();

            // act
            testOrder.SetDiscount(discountReason, 20m, DiscountUnits.percent);

            // assert
            Assert.AreEqual(400m, testOrder.OrderItems[0].DiscountMoney);
            Assert.AreEqual(100m, testOrder.OrderItems[1].DiscountMoney);
        }
        /// <summary>
        /// Установка скидки исходя из выбранного основания скидки для всего заказа
        /// </summary>
        /// <param name="reason">Основание скидки</param>
        /// <param name="orderItems">Список строк заказа</param>
        /// <param name="canChangeDiscountValue">Может ли пользователь менять скидку</param>
        /// <param name="messages">Описание позиций на которые не применилась скидка</param>
        public void SetDiscountFromDiscountReasonForOrder(
            DiscountReason reason, IList <OrderItem> orderItems, bool canChangeDiscountValue, out string messages)
        {
            messages = null;

            for (var i = 0; i < orderItems.Count; i++)
            {
                SetDiscountFromDiscountReasonForOrderItem(reason, orderItems[i], canChangeDiscountValue, out string message);

                if (message != null)
                {
                    messages += $"№{i + 1} {message}";
                }
            }
        }
Beispiel #10
0
        public void Check_Money_Discount_For_OrderItems()
        {
            // arrange
            Order testOrder = CreateTestOrderWithOrderItems();

            testOrder.ObservableOrderItems.ListContentChanged -= testOrder.ObservableOrderItems_ListContentChanged;
            testOrder.OrderItems.ToList().ForEach(x => x.IsDiscountInMoney = true);             //FIXME : костыль из-за метода Order.CalculateAndSetDiscount()
            DiscountReason discountReason = Substitute.For <DiscountReason>();

            // act
            testOrder.SetDiscount(discountReason, 500m, DiscountUnits.money);

            // assert
            Assert.AreEqual(400m, testOrder.OrderItems[0].DiscountMoney);
            Assert.AreEqual(100m, testOrder.OrderItems[1].DiscountMoney);
        }
        public void SetDiscountByStockTest_Where_DiscountInMoney_is_false(decimal discountMoney, decimal discountPercent, decimal existingDiscountByStock, decimal discountForAdd, decimal result)
        {
            // arrange
            DiscountReason discountReason  = Substitute.For <DiscountReason>();
            OrderItem      testedOrderItem = new OrderItem();

            testedOrderItem.Price             = 50;
            testedOrderItem.Count             = 20;
            testedOrderItem.DiscountByStock   = existingDiscountByStock;
            testedOrderItem.Discount          = discountPercent;
            testedOrderItem.DiscountMoney     = discountMoney;
            testedOrderItem.IsDiscountInMoney = false;

            // act
            testedOrderItem.SetDiscountByStock(discountReason, discountForAdd);

            // assert
            Assert.That(decimal.Round(testedOrderItem.Discount, 2), Is.EqualTo(result));
        }
        /// <summary>
        /// Установка скидки исходя из выбранного основания скидки для строки заказа
        /// </summary>
        /// <param name="reason">Основание скидки</param>
        /// <param name="orderItem">Строка заказа</param>
        /// <param name="canChangeDiscountValue">Может ли пользователь менять скидку</param>
        /// <param name="message">Описание позици на которую не применилась скидка</param>
        /// <returns>true/false - установилась скидка или нет</returns>
        public bool SetDiscountFromDiscountReasonForOrderItem(
            DiscountReason reason, OrderItem orderItem, bool canChangeDiscountValue, out string message)
        {
            message = null;

            if (!CanSetDiscount(reason, orderItem))
            {
                return(false);
            }

            if (!canChangeDiscountValue && OrderItemContainsPromoSetOrFixedPrice(orderItem))
            {
                message = $"{orderItem.Nomenclature.Name}\n";
                return(false);
            }

            SetDiscount(reason, orderItem);
            return(true);
        }
        public ActionResult DiscountReason(DiscountReason obj)
        {
            KeystoneProject.Buisness_Logic.Master.BL_DiscountReason objBlDiscount = new Buisness_Logic.Master.BL_DiscountReason();


            if (objBlDiscount.CheckDiscountReason(obj.DiscountReasonID, obj.DiscountReasonName))
            {
                if (obj.DiscountReasonID > 0)
                {
                    objBlDiscount.save(obj);
                    ViewData["msg"] = obj.Message;
                    ModelState.Clear();

                    TempData["Msg"] = " Discount Reason Updated Successfully";
                    return(RedirectToAction("DiscountReason", "DiscountReason"));
                }
                else
                {
                    objBlDiscount.save(obj);
                    ViewData["msg"] = obj.Message;
                    ModelState.Clear();

                    TempData["Msg"] = " Discount Reason Saved Successfully";
                    return(RedirectToAction("DiscountReason", "DiscountReason"));
                }

                //return RedirectToAction("ShowDiscountReason", "DiscountReason");
            }
            else
            {
                TempData["Msg"] = " Discount Reason Already Exist's";
                return(RedirectToAction("DiscountReason", "DiscountReason"));
            }

            obj.storeAllDiscount = objBlDiscount.SelectAllData();
            // return RedirectToAction("DiscountReason", "DiscountReason");
            return(View(obj));
        }
 /// <summary>
 /// Установка определенной скидки на строку заказа с прикреплением указанного основания скидки
 /// </summary>
 /// <param name="reason">Основание скидки</param>
 /// <param name="discount">Скидка</param>
 /// <param name="unit">Скидка в процентах или рублях</param>
 /// <param name="orderItem">Строка заказа</param>
 private void SetCustomDiscount(DiscountReason reason, decimal discount, DiscountUnits unit, OrderItem orderItem)
 {
     orderItem.IsDiscountInMoney = unit == DiscountUnits.money;
     orderItem.DiscountSetter    = discount;
     orderItem.DiscountReason    = reason;
 }
 /// <summary>
 /// Установка скидки из основания скидки на конкретную позицию
 /// </summary>
 /// <param name="reason">Основание скидки</param>
 /// <param name="item">Элемент, к которому применяется скидка</param>
 private void SetDiscount(DiscountReason reason, IDiscount item)
 {
     item.IsDiscountInMoney = reason.ValueType == DiscountUnits.money;
     item.DiscountSetter    = reason.Value;
     item.DiscountReason    = reason;
 }
 /// <summary>
 /// Возможность установки скидки на строку счета без отгрузки на предоплату
 /// </summary>
 /// <param name="reason">Основание скидки</param>
 /// <param name="orderItem">Строка счета без отгрузки на предоплату</param>
 /// <returns>true/false</returns>
 private bool CanSetDiscountForOrderWithoutShipment(DiscountReason reason, OrderWithoutShipmentForAdvancePaymentItem orderItem) =>
 IsApplicableDiscount(reason, orderItem.Nomenclature) &&
 orderItem.Price * orderItem.Count != default(decimal);
 /// <summary>
 /// Возможность установки скидки на строку заказа
 /// </summary>
 /// <param name="reason">Основание скидки</param>
 /// <param name="orderItem">Строка заказа</param>
 /// <returns>true/false</returns>
 private bool CanSetDiscount(DiscountReason reason, OrderItem orderItem) =>
 IsApplicableDiscount(reason, orderItem.Nomenclature) &&
 orderItem.Price * orderItem.CurrentCount != default(decimal);