/// <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); }
/// <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)); }
/// <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); }
/// <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)); }
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); }