Exemple #1
0
 private void UpdateIndicatorsForWriteoffWaybill(WriteoffWaybill waybill, short sign)
 {
     articleMovementFactualFinancialIndicatorService.Update(waybill.WriteoffDate.Value, waybill.Sender.Id, waybill.SenderStorage.Id,
                                                            null, null, ArticleMovementOperationType.Writeoff, waybill.Id,
                                                            sign * waybill.PurchaseCostSum,
                                                            sign * (waybill.SenderAccountingPriceSum ?? 0),
                                                            0);
 }
        public void Init()
        {
            storage = new Storage("Тестовое место хранения", StorageType.DistributionCenter)
            {
                Id = 1
            };
            writeoffReason = new WriteoffReason("Тестовая причина списания")
            {
                Id = 2
            };

            var juridicalLegalForm = new LegalForm("ООО", EconomicAgentType.JuridicalPerson)
            {
                Id = 3
            };
            var juridicalPerson = new JuridicalPerson(juridicalLegalForm)
            {
                Id = 4
            };
            var juridicalPerson2 = new JuridicalPerson(juridicalLegalForm)
            {
                Id = 15
            };

            accountOrganization = new AccountOrganization("Тестовое юридическое лицо", "Тестовое юридическое лицо", juridicalPerson)
            {
                Id = 5
            };

            var provider = new Provider("Тестовый поставщик", new ProviderType("Тестовый тип поставщика"), ProviderReliability.Medium, 5)
            {
                Id = 6
            };
            var providerOrganization = new ProviderOrganization("Организация поставщика", "Организация поставщика", juridicalPerson2);
            var articleGroup         = new ArticleGroup("Тестовая группа", "Тестовая группа");
            var measureUnit          = new MeasureUnit("шт.", "Штука", "123", 0)
            {
                Id = 1
            };
            var customDeclarationNumber = new String('0', 25);

            article          = new Article("Тестовый товар А", articleGroup, measureUnit, true);
            providerContract = new ProviderContract(accountOrganization, providerOrganization, "Договор", "4645", DateTime.Now, DateTime.Now);
            provider.AddProviderContract(providerContract);

            user              = new User(new Employee("Иван", "Иванов", "Иванович", new EmployeePost("Менеджер"), null), "Иванов Иван", "ivanov", "pa$$w0rd", new Team("Тестовая команда", null), null);
            receiptWaybill    = new ReceiptWaybill("123АБВ", DateTime.Today.AddDays(1), storage, accountOrganization, provider, 1234.5M, 0M, new ValueAddedTax("18%", 18), providerContract, customDeclarationNumber, user, user, DateTime.Now);
            receiptWaybillRow = new ReceiptWaybillRow(article, 100, 1234.5M, receiptWaybill.PendingValueAddedTax);
            receiptWaybill.AddRow(receiptWaybillRow);

            writeoffWaybill = new WriteoffWaybill("123", DateTime.Today, storage, accountOrganization, writeoffReason, user, user, DateTime.Now);

            priceLists = new List <ArticleAccountingPrice>()
            {
                new ArticleAccountingPrice(article, 10M)
            };
        }
        public void WriteoffWaybill_Must_Throw_Exception_If_WriteoffReason_Is_Null()
        {
            try
            {
                var wb = new WriteoffWaybill("123", DateTime.Today, storage, accountOrganization, null, user, user, DateTime.Now);

                Assert.Fail("Исключение не вызвано.");
            }
            catch (Exception ex)
            {
                Assert.AreEqual("Не указано основание для списания.", ex.Message);
            }
        }
        public void WriteoffWaybill_Must_Throw_Exception_If_SenderStorage_Is_Null()
        {
            try
            {
                var wb = new WriteoffWaybill("123", DateTime.Today, null, accountOrganization, writeoffReason, user, user, DateTime.Now);

                Assert.Fail("Исключение не вызвано.");
            }
            catch (Exception ex)
            {
                Assert.AreEqual("Не указано место хранения отправителя.", ex.Message);
            }
        }
Exemple #5
0
        public void Init()
        {
            // инициализация IoC
            IoCInitializer.Init();

            setting = new Setting()
            {
                UseReadyToAcceptStateForWriteOffWaybill = false
            };
            settingRepository = Mock.Get(IoCContainer.Resolve <ISettingRepository>());
            settingRepository.Setup(x => x.Get()).Returns(setting);

            storage = new Storage("qwe", StorageType.ExtraStorage)
            {
                Id = 42
            };
            accOrgSender = new Mock <AccountOrganization>();
            accOrgSender.Setup(x => x.Id).Returns(1);
            accOrgRecipient = new Mock <AccountOrganization>();
            accOrgRecipient.Setup(x => x.Id).Returns(2);

            valueAddedTax = new ValueAddedTax();
            user          = new Mock <User>();
            user.Setup(x => x.GetPermissionDistributionType(It.IsAny <Permission>())).Returns(PermissionDistributionType.All);
            createdBy = new Mock <User>();
            createdBy.Setup(x => x.GetPermissionDistributionType(It.IsAny <Permission>())).Returns(PermissionDistributionType.All);
            acceptedBy = new Mock <User>();
            acceptedBy.Setup(x => x.GetPermissionDistributionType(It.IsAny <Permission>())).Returns(PermissionDistributionType.All);

            var articleGroup = new ArticleGroup("Тестовая группа", "Тестовая группа");
            var measureUnit  = new MeasureUnit("шт.", "Штука", "123", 0)
            {
                Id = 1
            };

            articleA = new Article("Тестовый товар A", articleGroup, measureUnit, true)
            {
                Id = 1
            };

            receiptWaybillRow = new Mock <ReceiptWaybillRow>();
            receiptWaybillRow.Setup(x => x.Article).Returns(articleA);

            articleAccountingPrice = new List <ArticleAccountingPrice>()
            {
                new ArticleAccountingPrice(articleA, 100)
            };

            writeoffWaybillRepository = Mock.Get(IoCContainer.Resolve <IWriteoffWaybillRepository>());
            articleRepository         = Mock.Get(IoCContainer.Resolve <IArticleRepository>());
            articlePriceService       = Mock.Get(IoCContainer.Resolve <IArticlePriceService>());
            articlePriceService.Setup(x => x.GetArticleAccountingPrices(It.Is <short>(y => y == storage.Id), It.IsAny <IEnumerable <int> >())).Returns(articleAccountingPrice);
            articlePriceService.Setup(x => x.GetArticleAccountingPrices(It.Is <short>(y => y == storage.Id), It.IsAny <ISubQuery>(), It.IsAny <DateTime>())).Returns(articleAccountingPrice);

            articleAvailabilityService = Mock.Get(IoCContainer.Resolve <IArticleAvailabilityService>());

            articleMovementService = Mock.Get(IoCContainer.Resolve <IArticleMovementService>());

            receiptWaybillService = Mock.Get(IoCContainer.Resolve <IReceiptWaybillService>());

            articleRevaluationService = Mock.Get(IoCContainer.Resolve <IArticleRevaluationService>());

            factualFinancialArticleMovementService = new Mock <IFactualFinancialArticleMovementService>();

            articleMovementOperationCountService = new Mock <IArticleMovementOperationCountService>();

            storageRepository = Mock.Get(IoCContainer.Resolve <IStorageRepository>());

            userRepository = Mock.Get(IoCContainer.Resolve <IUserRepository>());

            writeoffWaybillService = new WriteoffWaybillService(settingRepository.Object, writeoffWaybillRepository.Object,
                                                                storageRepository.Object, userRepository.Object,
                                                                articleMovementService.Object,
                                                                articlePriceService.Object,
                                                                factualFinancialArticleMovementService.Object, articleMovementOperationCountService.Object, articleAvailabilityService.Object,
                                                                receiptWaybillService.Object, articleRevaluationService.Object);

            waybill = new WriteoffWaybill("123", DateTime.Now, storage, accOrgSender.Object,
                                          new WriteoffReason(), user.Object, createdBy.Object, DateTime.Now);

            WriteoffWaybillRow row = new WriteoffWaybillRow(receiptWaybillRow.Object, 10);

            waybill.AddRow(row);

            articleMovementService.Setup(x => x.CancelArticleAcceptance(It.IsAny <WriteoffWaybill>()))
            .Returns(new List <OutgoingWaybillRowSourceReservationInfo>()
            {
                new OutgoingWaybillRowSourceReservationInfo(row.Id, 1, 1)
            });
            articleMovementService.Setup(x => x.AcceptArticles(It.IsAny <WriteoffWaybill>()))
            .Returns(new List <OutgoingWaybillRowSourceReservationInfo>()
            {
                new OutgoingWaybillRowSourceReservationInfo(row.Id, 1, 1)
            });
        }
 public void WaybillFinalizationCancelled(WriteoffWaybill waybill)
 {
     articleMovementOperationCountIndicatorService.DecrementIndicator(waybill.WriteoffDate.Value, ArticleMovementOperationType.Writeoff, waybill.SenderStorage.Id);
 }
Exemple #7
0
 /// <summary>
 /// Пересчет финансовых показателей после отмены отгрузки товара по накладной списания
 /// </summary>
 /// <param name="waybill">Накладная списания</param>
 public void WriteoffWaybillWriteoffCancelled(WriteoffWaybill waybill)
 {
     UpdateIndicatorsForWriteoffWaybill(waybill, -1);
 }
Exemple #8
0
 /// <summary>
 /// Пересчет финансовых показателей после отгрузки товара по накладной списания
 /// </summary>
 /// <param name="waybill">Накладная списания</param>
 public void WriteoffWaybillWrittenOff(WriteoffWaybill waybill)
 {
     UpdateIndicatorsForWriteoffWaybill(waybill, 1);
 }
Exemple #9
0
        public WriteoffWaybillMainIndicators GetMainIndicators(WriteoffWaybill waybill, User user, bool calculateReceivelessProfit = false)
        {
            var ind = new WriteoffWaybillMainIndicators();

            var allowToViewPurchaseCost = user.HasPermission(Permission.PurchaseCost_View_ForEverywhere);
            var allowToViewAccPrice     = user.HasPermissionToViewStorageAccountingPrices(waybill.SenderStorage);

            if (waybill.IsAccepted)
            {
                ind.SenderAccountingPriceSum = allowToViewAccPrice ? waybill.SenderAccountingPriceSum : (decimal?)null;

                if (calculateReceivelessProfit)
                {
                    ind.ReceivelessProfitSum     = allowToViewPurchaseCost && allowToViewAccPrice ? waybill.ReceivelessProfitSum : (decimal?)null;
                    ind.ReceivelessProfitPercent = allowToViewPurchaseCost && allowToViewAccPrice ? waybill.ReceivelessProfitPercent : (decimal?)null;
                }
            }
            else
            {
                var storage         = waybill.SenderStorage;
                var purchaseCostSum = allowToViewPurchaseCost ? waybill.PurchaseCostSum : (decimal?)null;

                ind.SenderAccountingPriceSum = allowToViewAccPrice ? (decimal?)0 : null;

                var senderAccountingPrices = new DynamicDictionary <int, decimal?>();

                if (allowToViewAccPrice)
                {
                    senderAccountingPrices = articlePriceService.GetAccountingPrice(storage.Id, writeoffWaybillRepository.GetArticlesSubquery(waybill.Id));
                }

                foreach (var row in waybill.Rows)
                {
                    if (allowToViewAccPrice)
                    {
                        var senderAccountingPrice = senderAccountingPrices[row.Article.Id];

                        ind.SenderAccountingPriceSum += senderAccountingPrice.Value * row.WritingoffCount;
                    }
                }

                if (allowToViewAccPrice)
                {
                    ind.SenderAccountingPriceSum = Math.Round(ind.SenderAccountingPriceSum.Value, 2);
                }

                if (calculateReceivelessProfit)
                {
                    if (allowToViewAccPrice && allowToViewPurchaseCost)
                    {
                        ind.ReceivelessProfitSum     = ind.SenderAccountingPriceSum.Value - purchaseCostSum;
                        ind.ReceivelessProfitPercent = purchaseCostSum != 0M ? ind.ReceivelessProfitSum / purchaseCostSum * 100M : 0M;
                    }
                    else
                    {
                        ind.ReceivelessProfitPercent = null;
                        ind.ReceivelessProfitSum     = null;
                    }
                }
            }

            return(ind);
        }
Exemple #10
0
        /// <summary>
        /// Расчет основных показателей для коллекции позиций накладной списания
        /// </summary>
        /// <param name="rowsToGetIndicators">Список позиций накладной, для которых необходимо расчитать показатели</param>
        /// <param name="rowsToGetIndicatorsArticleSubquery">Подзапрос для товаров из позиций накладной, для которых необходимо расчитать показатели</param>
        private IDictionary <Guid, WriteoffWaybillRowMainIndicators> GetMainIndicatorsForRowList(WriteoffWaybill waybill, IEnumerable <WriteoffWaybillRow> rowsToGetIndicators,
                                                                                                 ISubQuery rowsToGetIndicatorsArticleSubquery, User user)
        {
            var result = new Dictionary <Guid, WriteoffWaybillRowMainIndicators>();

            var allowToViewAccPrices = user.HasPermissionToViewStorageAccountingPrices(waybill.SenderStorage);

            // список УЦ для переданных позиций
            var accountingPrices = new DynamicDictionary <int, decimal?>();

            if (allowToViewAccPrices && !waybill.IsAccepted)
            {
                accountingPrices = articlePriceService.GetAccountingPrice(waybill.SenderStorage.Id, rowsToGetIndicatorsArticleSubquery);
            }

            foreach (var row in rowsToGetIndicators)
            {
                var ind = new WriteoffWaybillRowMainIndicators();

                if (waybill.IsAccepted)
                {
                    ind.SenderAccountingPrice = allowToViewAccPrices ? row.SenderArticleAccountingPrice.AccountingPrice : (decimal?)null;
                }
                else
                {
                    ind.SenderAccountingPrice = allowToViewAccPrices ? accountingPrices[row.Article.Id] : (decimal?)null;
                }

                result.Add(row.Id, ind);
            }

            return(result);
        }
Exemple #11
0
 /// <summary>
 /// Расчет основных показателей для всех позиций накладной списания
 /// </summary>
 public IDictionary <Guid, WriteoffWaybillRowMainIndicators> GetMainRowsIndicators(WriteoffWaybill waybill, User user)
 {
     return(GetMainIndicatorsForRowList(waybill, waybill.Rows, writeoffWaybillRepository.GetArticlesSubquery(waybill.Id), user));
 }