Exemplo n.º 1
0
        /// <summary>
        /// Рассчитать учетную цену
        /// </summary>
        /// <param name="rule">Правило расчета учетной цены</param>
        /// <param name="digitRule">Правило расчета последней цифры</param>
        /// <param name="article">Товар, для которого рассчитывать</param>
        /// <param name="accPriceCalcError">true, если не удалось использовать заданное правило расчета учетной цены </param>
        /// <param name="lastDigitError">true, если не удалось использовать заданное правило расчета последней цифры</param>
        public decimal CalculateAccountingPrice(AccountingPriceCalcRule rule, LastDigitCalcRule digitRule, Article article, out bool accPriceCalcError, out bool lastDigitError)
        {
            accPriceCalcError = false;
            lastDigitError    = false;
            decimal?accountingPrice = rule.CalculateAccountingPriceValue(article);

            if (accountingPrice == null)
            {
                accPriceCalcError = true;
                return(0);
            }

            if (accountingPrice <= 0)
            {
                return(0);
            }

            var finalAccountingPrice = digitRule.CalculateLastDigit(article, accountingPrice.Value);

            if (finalAccountingPrice == null)
            {
                lastDigitError = true;
                return(0);
            }

            return(finalAccountingPrice.Value);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Рассчитать учетную цену
        /// </summary>
        /// <param name="rule">Правило расчета учетной цены </param>
        /// <param name="digitRule">Правило расчета последней цифры</param>
        /// <param name="article">Товар, для которого рассчитывать</param>
        /// <param name="error">Признак того, что не удалось применить одно из правил</param>
        /// <returns>Рассчитанная учетная цена</returns>
        public decimal CalculateAccountingPrice(AccountingPriceCalcRule rule, LastDigitCalcRule digitRule, Article article, out bool error)
        {
            bool accPriceCalcError = false, lastDigitError = false;
            var  accPrice = CalculateAccountingPrice(rule, digitRule, article, out accPriceCalcError, out lastDigitError);

            error = accPriceCalcError & lastDigitError;

            return(accPrice);
        }
        public void GetTipsForArticle(AccountingPriceList accountingPriceList, Article article,
                                      out decimal?avgAccPrice, out decimal?minAccPrice, out decimal?maxAccPrice, out decimal?avgPurchaseCost, out decimal?minPurchaseCost,
                                      out decimal?maxPurchaseCost, out decimal?lastPurchaseCost, User user)
        {
            AccountingPriceCalcRule ruleForTips;

            var lastDigitRule = new LastDigitCalcRule(LastDigitCalcRuleType.LeaveAsIs);

            var byPurchaseCostRule    = new AccountingPriceCalcByPurchaseCost(PurchaseCostDeterminationRuleType.ByAveragePurchasePrice, new MarkupPercentDeterminationRule(0M));
            var byAccountingPriceRule = new AccountingPriceCalcByCurrentAccountingPrice(
                new AccountingPriceDeterminationRule(
                    AccountingPriceDeterminationRuleType.ByAverageAccountingPrice, AccountingPriceListStorageTypeGroup.All, storageService.GetList(user, Permission.Storage_List_Details)), 0);

            ruleForTips = accountingPriceCalcRuleService.GetReadyAccountingPriceCalcRule(new AccountingPriceCalcRule(byPurchaseCostRule), article.Id, user);

            avgPurchaseCost  = null;
            maxPurchaseCost  = null;
            minPurchaseCost  = null;
            lastPurchaseCost = null;

            Func <decimal?> calcPrice = () => { return(accountingPriceCalcService.CalculateAccountingPrice(ruleForTips, lastDigitRule, article)); };

            avgPurchaseCost = calcPrice();

            ruleForTips.CalcByPurchaseCost.PurchaseCostDeterminationRuleType = PurchaseCostDeterminationRuleType.ByMaximalPurchaseCost;
            maxPurchaseCost = calcPrice();

            ruleForTips.CalcByPurchaseCost.PurchaseCostDeterminationRuleType = PurchaseCostDeterminationRuleType.ByMinimalPurchaseCost;
            minPurchaseCost = calcPrice();

            ruleForTips = accountingPriceCalcRuleService.GetReadyAccountingPriceCalcRule(new AccountingPriceCalcRule(
                                                                                             new AccountingPriceCalcByPurchaseCost(PurchaseCostDeterminationRuleType.ByLastPurchaseCost, new MarkupPercentDeterminationRule(0M))),
                                                                                         article.Id, user);
            lastPurchaseCost = calcPrice();

            ruleForTips = accountingPriceCalcRuleService.GetReadyAccountingPriceCalcRule(new AccountingPriceCalcRule(byAccountingPriceRule), article.Id, user);

            avgAccPrice = null;
            maxAccPrice = null;
            minAccPrice = null;

            avgAccPrice = calcPrice();

            ruleForTips.CalcByCurrentAccountingPrice.AccountingPriceDeterminationRule.Type = AccountingPriceDeterminationRuleType.ByMaximalAccountingPrice;
            maxAccPrice = calcPrice();

            ruleForTips.CalcByCurrentAccountingPrice.AccountingPriceDeterminationRule.Type = AccountingPriceDeterminationRuleType.ByMinimalAccountingPrice;
            minAccPrice = calcPrice();
        }
        /// <summary>
        /// Подготовить объект правила расчета последней цифры учетной цены по умолчанию к работе
        /// </summary>
        /// <returns>Готовое к работе правило расчета последней цифры учетной цены по умолчанию к работе</returns>
        public LastDigitCalcRule GetReadyLastDigitCalcRule(LastDigitCalcRule rule, IEnumerable <int> articleIdList, User user)
        {
            if (rule.Type == LastDigitCalcRuleType.LeaveLastDigitFromStorage)
            {
                var storage = rule.Storage;

                user.CheckPermissionToViewNotCommandStorageAccountingPrices(storage);

                var accPrice = articlePriceService.GetAccountingPrice(storage.Id, articleIdList, DateTime.Now);

                rule.AccountingPricesAtChosenStorage = accPrice;
            }

            return(rule);
        }
 /// <summary>
 /// Подготовка дефолтных правил к работе. Метод должен быть вызван перед подсчетом цен, иначе, в случае если по указанному правилу цену подсчитать не получится, будет выброшен эксепшн.
 /// </summary>
 public void InitializeDefaultRules(AccountingPriceCalcRule accountingPriceCalcRule, LastDigitCalcRule lastDigitCalcRule, IEnumerable <int> articleIdList, User user)
 {
     accountingPriceCalcRule.DefaultRule = GetReadyAccountingPriceCalcRule(AccountingPriceCalcRule.GetDefault(), articleIdList, user);
     lastDigitCalcRule.DefaultRule       = GetReadyLastDigitCalcRule(LastDigitCalcRule.GetDefault(), articleIdList, user);
 }
 /// <summary>
 /// Подготовить объект правила расчета последней цифры учетной цены по умолчанию к работе
 /// </summary>
 /// <param name="articleAccountingPrice">Позиция реестра цен, чье правило используем</param>
 /// <returns>Готовое к работе правило расчета последней цифры учетной цены по умолчанию к работе</returns>
 public LastDigitCalcRule GetReadyLastDigitCalcRule(LastDigitCalcRule rule, int articleId, User user)
 {
     return(GetReadyLastDigitCalcRule(rule, new List <int> {
         articleId
     }, user));
 }
Exemplo n.º 7
0
        /// <summary>
        /// Рассчитать учетную цену
        /// </summary>
        /// <param name="rule">Правило расчета учетной цены </param>
        /// <param name="digitRule">Правило расчета последней цифры</param>
        /// <param name="articleList">Список товаров, для которых нужно рассчитывать</param>
        /// <param name="accPriceCalcError">Словарь по товарам: true, если не удалось использовать заданное правило расчета учетной цены</param>
        /// <param name="lastDigitError">Словарь по товарам: true, если не удалось использовать заданное правило расчета для последней цифры</param>
        /// <returns>Рассчитанная учетная цена</returns>
        public Dictionary <int, decimal> CalculateAccountingPrice(AccountingPriceCalcRule rule, LastDigitCalcRule digitRule,
                                                                  IEnumerable <Article> articleList, out Dictionary <int, bool> accPriceCalcError, out Dictionary <int, bool> lastDigitError)
        {
            var  result = new Dictionary <int, decimal>();
            bool accPriceCalcErrorForArticle = false, lastDigitErrorForArticle = false;

            accPriceCalcError = new Dictionary <int, bool>();
            lastDigitError    = new Dictionary <int, bool>();

            foreach (var article in articleList)
            {
                result.Add(article.Id, CalculateAccountingPrice(rule, digitRule, article, out accPriceCalcErrorForArticle,
                                                                out lastDigitErrorForArticle));

                // сохраняем информацию о том, что не удалось использовать заданное правило
                accPriceCalcError.Add(article.Id, accPriceCalcErrorForArticle);
                lastDigitError.Add(article.Id, lastDigitErrorForArticle);
            }

            return(result);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Рассчитать учетную цену
        /// </summary>
        /// <param name="rule">Правило расчета учетной цены </param>
        /// <param name="digitRule">Правило расчета последней цифры</param>
        /// <param name="article">Товар, для которого рассчитывать</param>
        /// <returns>Рассчитанная учетная цена</returns>
        public decimal CalculateAccountingPrice(AccountingPriceCalcRule rule, LastDigitCalcRule digitRule, Article article)
        {
            bool accPriceCalcError = false, lastDigitError = false;

            return(CalculateAccountingPrice(rule, digitRule, article, out accPriceCalcError, out lastDigitError));
        }
Exemplo n.º 9
0
        public void Init()
        {
            articleGroup = new ArticleGroup("Бытовая техника", "Бытовая техника");
            articleGroup.SalaryPercent = 15;
            articleGroup.Id            = 8;

            measureUnit    = new MeasureUnit("шт.", "Штука", "123", 0);
            measureUnit.Id = 17;

            articleA = new Article("Пылесос", articleGroup, measureUnit, true)
            {
                Id = 29, Number = "ПЫЛ"
            };
            articleB = new Article("Холодильник", articleGroup, measureUnit, true)
            {
                Id = 38, Number = "ХО-1"
            };
            articleC = new Article("Плита газовая", articleGroup, measureUnit, true)
            {
                Id = 48, Number = "ПГ1"
            };

            articleAccountingPriceA1 = new ArticleAccountingPrice(articleA, 1M);
            articleAccountingPriceA2 = new ArticleAccountingPrice(articleA, 1001M);
            articleAccountingPriceA3 = new ArticleAccountingPrice(articleA, 1192.45M);
            articleAccountingPriceB  = new ArticleAccountingPrice(articleB, 150M);
            articleAccountingPriceC  = new ArticleAccountingPrice(articleC, 180M);

            articleAccountingPriceWrongListOnlyA = new List <ArticleAccountingPrice>();
            articleAccountingPriceWrongListOnlyA.Add(articleAccountingPriceA1);
            articleAccountingPriceWrongListOnlyA.Add(articleAccountingPriceA2);
            articleAccountingPriceWrongListOnlyA.Add(articleAccountingPriceA3);

            articleAccountingPriceCorrectList1 = new List <ArticleAccountingPrice>();
            articleAccountingPriceCorrectList1.Add(articleAccountingPriceA2);
            articleAccountingPriceCorrectList1.Add(articleAccountingPriceB);
            articleAccountingPriceCorrectList1.Add(articleAccountingPriceC);

            storage1 = new Storage("Торговая точка номер 1", StorageType.TradePoint);
            storage2 = new Storage("Доп. склад северный", StorageType.ExtraStorage);
            storage3 = new Storage("Торговая точка номер 2", StorageType.TradePoint);

            storageList1 = new List <Storage>();
            storageList1.Add(storage1);
            storageList1.Add(storage2);
            storageList1.Add(storage3);

            var juridicalLegalForm = new LegalForm("ООО", EconomicAgentType.JuridicalPerson);
            var physicalLegalForm  = new LegalForm("ИП", EconomicAgentType.PhysicalPerson);

            juridicalPerson = new JuridicalPerson(juridicalLegalForm)
            {
                Id = 1
            };
            physicalPerson = new PhysicalPerson(physicalLegalForm)
            {
                Id = 2
            };

            accountOrganization = new AccountOrganization("Тестовое юридическое лицо", "Тестовое юридическое лицо", juridicalPerson)
            {
                Id = 1
            };
            providerOrganization = new ProviderOrganization("Тестовое физическое лицо", "Тестовое физическое лицо", physicalPerson)
            {
                Id = 2
            };

            provider = new Provider("Тестовый поставщик", new ProviderType("Тестовый тип поставщика"), ProviderReliability.Medium, 5);
            provider.AddContractorOrganization(providerOrganization);

            providerContract = new ProviderContract(accountOrganization, providerOrganization, "ABC", "123", DateTime.Now, DateTime.Today);
            provider.AddProviderContract(providerContract);

            user = new User(new Employee("Иван", "Иванов", "Иванович", new EmployeePost("Менеджер"), null), "Иванов Иван", "ivanov", "pa$$w0rd", new Team("Тестовая команда", null), null);
            var customDeclarationNumber = new String('0', 25);

            receiptWaybill = new ReceiptWaybill("123АБВ", DateTime.Today, storage1, accountOrganization, provider, 100.05M, 0M, new ValueAddedTax("18%", 18), providerContract, customDeclarationNumber, user, user, DateTime.Now);

            priceRule = new AccountingPriceCalcRule(
                new AccountingPriceCalcByPurchaseCost(PurchaseCostDeterminationRuleType.ByMinimalPurchaseCost, new MarkupPercentDeterminationRule(10)));
            digitRule = new LastDigitCalcRule(LastDigitCalcRuleType.SetCustom);

            user = new User(new Employee("Иван", "Иванов", "Иванович", new EmployeePost("Менеджер"), null), "Иванов Иван", "ivanov", "pa$$w0rd", new Team("Тестовая команда", null), null);
        }