コード例 #1
0
        public CounterpartyOrderViewModel(Counterparty client,
                                          IUnitOfWorkFactory unitOfWorkFactory,
                                          ITdiCompatibilityNavigation tdinavigation,
                                          IRouteListRepository routedListRepository,
                                          MangoManager mangoManager,
                                          IOrderParametersProvider orderParametersProvider,
                                          IEmployeeJournalFactory employeeJournalFactory,
                                          ICounterpartyJournalFactory counterpartyJournalFactory,
                                          INomenclatureRepository nomenclatureRepository,
                                          IParametersProvider parametersProvider,
                                          int count = 5)
        {
            Client                      = client;
            tdiNavigation               = tdinavigation;
            _routedListRepository       = routedListRepository;
            MangoManager                = mangoManager;
            _orderParametersProvider    = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
            _employeeJournalFactory     = employeeJournalFactory ?? throw new ArgumentNullException(nameof(employeeJournalFactory));
            _counterpartyJournalFactory = counterpartyJournalFactory ?? throw new ArgumentNullException(nameof(counterpartyJournalFactory));
            _nomenclatureRepository     = nomenclatureRepository ?? throw new ArgumentNullException(nameof(nomenclatureRepository));
            _parametersProvider         = parametersProvider ?? throw new ArgumentNullException(nameof(parametersProvider));
            UoW         = unitOfWorkFactory.CreateWithoutRoot();
            LatestOrder = _orderRepository.GetLatestOrdersForCounterparty(UoW, client, count).ToList();

            RefreshOrders = _RefreshOrders;
            NotifyConfiguration.Instance.BatchSubscribe(_RefreshCounterparty)
            .IfEntity <Counterparty>()
            .AndWhere(c => c.Id == client.Id)
            .Or.IfEntity <DeliveryPoint>()
            .AndWhere(d => client.DeliveryPoints.Any(cd => cd.Id == d.Id));
        }
コード例 #2
0
 public Stage1OrganizationProvider(IOrganizationParametersProvider organizationParametersProvider,
                                   IOrderParametersProvider orderParametersProvider)
 {
     this.organizationParametersProvider = organizationParametersProvider ??
                                           throw new ArgumentNullException(nameof(organizationParametersProvider));
     this.orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
 }
コード例 #3
0
        public PaymentByCardViewModel(
            IEntityUoWBuilder uowBuilder,
            IUnitOfWorkFactory unitOfWorkFactory,
            ICommonServices commonServices,
            CallTaskWorker callTaskWorker,
            IOrderPaymentSettings orderPaymentSettings,
            IOrderParametersProvider orderParametersProvider,
            Employee currentEmployee) : base(uowBuilder, unitOfWorkFactory, commonServices)
        {
            if (orderPaymentSettings == null)
            {
                throw new ArgumentNullException(nameof(orderPaymentSettings));
            }

            if (orderParametersProvider == null)
            {
                throw new ArgumentNullException(nameof(orderParametersProvider));
            }

            _callTaskWorker  = callTaskWorker ?? throw new ArgumentNullException(nameof(callTaskWorker));
            _currentEmployee = currentEmployee;

            TabName = "Оплата по карте";

            ItemsList = UoW.GetAll <PaymentFrom>().ToList();

            if (PaymentByCardFrom == null)
            {
                PaymentByCardFrom = ItemsList.FirstOrDefault(p => p.Id == orderPaymentSettings.DefaultSelfDeliveryPaymentFromId);
            }

            Entity.PropertyChanged += Entity_PropertyChanged;

            ValidationContext.ServiceContainer.AddService(typeof(IOrderParametersProvider), orderParametersProvider);
        }
コード例 #4
0
 public ExportOperation(IOrderParametersProvider orderParametersProvider, Export1cMode mode, DateTime start, DateTime end)
 {
     this.orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     uow        = UnitOfWorkFactory.CreateWithoutRoot();
     this.start = start;
     this.end   = end;
     this.mode  = mode;
 }
コード例 #5
0
 public SalesReceiptsInstanceProvider(
     ISalesReceiptsServiceSettings salesReceiptsServiceSettings,
     IOrderRepository orderRepository,
     IOrderParametersProvider orderParametersProvider)
 {
     _salesReceiptsServiceSettings =
         salesReceiptsServiceSettings ?? throw new ArgumentNullException(nameof(salesReceiptsServiceSettings));
     _orderRepository         = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
     _orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
 }
コード例 #6
0
 public FiscalizationWorker(
     IOrderRepository orderRepository,
     ISalesReceiptSender salesReceiptSender,
     IOrderParametersProvider orderParametersProvider,
     IEnumerable <CashBox> cashBoxes)
 {
     this.orderRepository         = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
     this.salesReceiptSender      = salesReceiptSender ?? throw new ArgumentNullException(nameof(salesReceiptSender));
     this.orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     this.cashBoxes = cashBoxes ?? throw new ArgumentNullException(nameof(cashBoxes));
 }
コード例 #7
0
 public SmsPaymentService(
     IPaymentController paymentController,
     IDriverPaymentService androidDriverService,
     IOrderParametersProvider orderParametersProvider,
     SmsPaymentFileCache smsPaymentFileCache
     )
 {
     this.paymentController       = paymentController ?? throw new ArgumentNullException(nameof(paymentController));
     this.androidDriverService    = androidDriverService ?? throw new ArgumentNullException(nameof(androidDriverService));
     this.orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     this.smsPaymentFileCache     = smsPaymentFileCache ?? throw new ArgumentNullException(nameof(smsPaymentFileCache));
 }
コード例 #8
0
 public SmsPaymentServiceInstanceProvider(
     IPaymentController paymentController,
     IDriverPaymentService driverPaymentService,
     IOrderParametersProvider orderParametersProvider,
     SmsPaymentFileCache smsPaymentFileProdiver
     )
 {
     this.paymentController       = paymentController ?? throw new ArgumentNullException(nameof(paymentController));
     this.driverPaymentService    = driverPaymentService ?? throw new ArgumentNullException(nameof(driverPaymentService));
     this.orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     this.smsPaymentFileProdiver  = smsPaymentFileProdiver ?? throw new ArgumentNullException(nameof(smsPaymentFileProdiver));
 }
コード例 #9
0
 public Stage2OrganizationProvider(
     IOrganizationParametersProvider organizationParametersProvider,
     IOrderParametersProvider orderParametersProvider,
     IGeographicGroupParametersProvider geographicGroupParametersProvider)
 {
     _organizationParametersProvider = organizationParametersProvider
                                       ?? throw new ArgumentNullException(nameof(organizationParametersProvider));
     _orderParametersProvider = orderParametersProvider
                                ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     _geographicGroupParametersProvider = geographicGroupParametersProvider
                                          ?? throw new ArgumentNullException(nameof(geographicGroupParametersProvider));
 }
コード例 #10
0
 public SalesReceiptsService(
     ISalesReceiptsServiceSettings salesReceiptsServiceSettings,
     IOrderRepository orderRepository,
     IOrderParametersProvider orderParametersProvider,
     IOrganizationParametersProvider organizationParametersProvider
     )
 {
     this.salesReceiptsServiceSettings = salesReceiptsServiceSettings ?? throw new ArgumentNullException(nameof(salesReceiptsServiceSettings));
     this.orderRepository                = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
     this.orderParametersProvider        = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     this.organizationParametersProvider = organizationParametersProvider ?? throw new ArgumentNullException(nameof(organizationParametersProvider));
 }
コード例 #11
0
        public CounterpartyTalkViewModel(
            INavigationManager navigation,
            ITdiCompatibilityNavigation tdinavigation,
            IUnitOfWorkFactory unitOfWorkFactory,
            IRouteListRepository routedListRepository,
            IInteractiveService interactiveService,
            IOrderParametersProvider orderParametersProvider,
            MangoManager manager,
            IEmployeeJournalFactory employeeJournalFactory,
            ICounterpartyJournalFactory counterpartyJournalFactory,
            INomenclatureRepository nomenclatureRepository,
            IOrderRepository orderRepository,
            IParametersProvider parametersProvider,
            IDeliveryRulesParametersProvider deliveryRulesParametersProvider,
            IDeliveryPointJournalFactory deliveryPointJournalFactory) : base(navigation, manager)
        {
            NavigationManager = navigation ?? throw new ArgumentNullException(nameof(navigation));
            _tdiNavigation    = tdinavigation ?? throw new ArgumentNullException(nameof(navigation));

            _routedListRepository            = routedListRepository;
            _interactiveService              = interactiveService ?? throw new ArgumentNullException(nameof(interactiveService));
            _orderParametersProvider         = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
            _employeeJournalFactory          = employeeJournalFactory ?? throw new ArgumentNullException(nameof(employeeJournalFactory));
            _counterpartyJournalFactory      = counterpartyJournalFactory ?? throw new ArgumentNullException(nameof(counterpartyJournalFactory));
            _nomenclatureRepository          = nomenclatureRepository ?? throw new ArgumentNullException(nameof(nomenclatureRepository));
            _orderRepository                 = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
            _parametersProvider              = parametersProvider ?? throw new ArgumentNullException(nameof(parametersProvider));
            _deliveryRulesParametersProvider = deliveryRulesParametersProvider ?? throw new ArgumentNullException(nameof(deliveryRulesParametersProvider));
            _uow = unitOfWorkFactory.CreateWithoutRoot();
            _deliveryPointJournalFactory =
                deliveryPointJournalFactory ?? throw new ArgumentNullException(nameof(deliveryPointJournalFactory));

            if (ActiveCall.CounterpartyIds.Any())
            {
                var clients = _uow.GetById <Counterparty>(ActiveCall.CounterpartyIds);

                foreach (Counterparty client in clients)
                {
                    CounterpartyOrderViewModel model = new CounterpartyOrderViewModel(
                        client, unitOfWorkFactory, tdinavigation, routedListRepository, MangoManager, _orderParametersProvider,
                        _employeeJournalFactory, _counterpartyJournalFactory, _nomenclatureRepository, _parametersProvider,
                        _deliveryRulesParametersProvider);
                    CounterpartyOrdersViewModels.Add(model);
                }

                currentCounterparty = CounterpartyOrdersViewModels.FirstOrDefault().Client;
            }
            else
            {
                throw new InvalidProgramException("Открыт диалог разговора с имеющимся контрагентом, но ни одного id контрагента не найдено.");
            }
        }
コード例 #12
0
 public Stage2OrganizationProvider(
     IOrganizationParametersProvider organizationParametersProvider,
     IOrderParametersProvider orderParametersProvider,
     IGeographicGroupParametersProvider geographicGroupParametersProvider)
 {
     _organizationParametersProvider =
         organizationParametersProvider ?? throw new ArgumentNullException(nameof(organizationParametersProvider));
     _orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     if (geographicGroupParametersProvider == null)
     {
         throw new ArgumentNullException(nameof(geographicGroupParametersProvider));
     }
     _northOrganizationGeoGroupsIds = new[]
     { geographicGroupParametersProvider.NorthGeographicGroupId, geographicGroupParametersProvider.EastGeographicGroupId };
 }
コード例 #13
0
 public SmsPaymentService(
     IPaymentController paymentController,
     ISmsPaymentStatusNotificationReciever smsPaymentStatusNotificationReciever,
     IOrderParametersProvider orderParametersProvider,
     SmsPaymentFileCache smsPaymentFileCache,
     ISmsPaymentDTOFactory smsPaymentDTOFactory,
     ISmsPaymentValidator smsPaymentValidator
     )
 {
     _paymentController = paymentController ?? throw new ArgumentNullException(nameof(paymentController));
     _smsPaymentStatusNotificationReciever = smsPaymentStatusNotificationReciever ?? throw new ArgumentNullException(nameof(smsPaymentStatusNotificationReciever));
     _orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     _smsPaymentFileCache     = smsPaymentFileCache ?? throw new ArgumentNullException(nameof(smsPaymentFileCache));
     _smsPaymentDTOFactory    = smsPaymentDTOFactory ?? throw new ArgumentNullException(nameof(smsPaymentDTOFactory));
     _smsPaymentValidator     = smsPaymentValidator ?? throw new ArgumentNullException(nameof(smsPaymentValidator));
 }
コード例 #14
0
 public FastPaymentManager(
     IFastPaymentParametersProvider fastPaymentParametersProvider,
     IOrderParametersProvider orderParametersProvider,
     IStandartNomenclatures standartNomenclatures,
     IRouteListItemRepository routeListItemRepository,
     ISelfDeliveryRepository selfDeliveryRepository,
     ICashRepository cashRepository)
 {
     _fastPaymentParametersProvider =
         fastPaymentParametersProvider ?? throw new ArgumentNullException(nameof(fastPaymentParametersProvider));
     _orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     _standartNomenclatures   = standartNomenclatures ?? throw new ArgumentNullException(nameof(standartNomenclatures));
     _routeListItemRepository = routeListItemRepository ?? throw new ArgumentNullException(nameof(routeListItemRepository));
     _selfDeliveryRepository  = selfDeliveryRepository ?? throw new ArgumentNullException(nameof(selfDeliveryRepository));
     _cashRepository          = cashRepository ?? throw new ArgumentNullException(nameof(cashRepository));
 }
コード例 #15
0
 public SmsPaymentServiceInstanceProvider(
     IPaymentController paymentController,
     IDriverPaymentService driverPaymentService,
     ISmsPaymentStatusNotificationReciever smsPaymentStatusNotificationReciever,
     IOrderParametersProvider orderParametersProvider,
     SmsPaymentFileCache smsPaymentFileProdiver,
     ISmsPaymentDTOFactory smsPaymentDTOFactory
     )
 {
     _paymentController    = paymentController ?? throw new ArgumentNullException(nameof(paymentController));
     _driverPaymentService = driverPaymentService ?? throw new ArgumentNullException(nameof(driverPaymentService));
     _smsPaymentStatusNotificationReciever = smsPaymentStatusNotificationReciever ??
                                             throw new ArgumentNullException(nameof(smsPaymentStatusNotificationReciever));
     _orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
     _smsPaymentFileProdiver  = smsPaymentFileProdiver ?? throw new ArgumentNullException(nameof(smsPaymentFileProdiver));
     _smsPaymentDTOFactory    = smsPaymentDTOFactory ?? throw new ArgumentNullException(nameof(smsPaymentDTOFactory));
 }
コード例 #16
0
        public IEnumerable <ReceiptForOrderNode> GetOrdersForCashReceiptServiceToSend(
            IUnitOfWork uow,
            IOrderParametersProvider orderParametersProvider,
            DateTime?startDate = null)
        {
            ReceiptForOrderNode resultAlias       = null;
            OrderItem           orderItemAlias    = null;
            VodovozOrder        orderAlias        = null;
            CashReceipt         cashReceiptAlias  = null;
            Counterparty        counterpartyAlias = null;

            var orderSumProjection = Projections.Sum(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.Decimal, "CAST(IFNULL(?1 * ?2 - ?3, 0) AS DECIMAL(14,2))"),
                    NHibernateUtil.Decimal,
                    Projections.Property(() => orderItemAlias.Count),
                    Projections.Property(() => orderItemAlias.Price),
                    Projections.Property(() => orderItemAlias.DiscountMoney)
                    )
                );

            var paymentTypeRestriction = Restrictions.Disjunction()
                                         .Add(() => orderAlias.PaymentType == PaymentType.Terminal)
                                         .Add(Restrictions.Conjunction()
                                              .Add(() => orderAlias.PaymentType == PaymentType.cash)
                                              .Add(() => counterpartyAlias.AlwaysSendReceipts))
                                         .Add(Restrictions.Conjunction()
                                              .Add(() => orderAlias.PaymentType == PaymentType.ByCard)
                                              .Add(Restrictions.Disjunction()
                                                   .Add(() => orderAlias.PaymentByCardFrom.Id == orderParametersProvider.PaymentFromTerminalId)
                                                   .Add(() => orderAlias.PaymentByCardFrom.Id == orderParametersProvider.GetPaymentByCardFromFastPaymentServiceId)
                                                   .Add(() => orderAlias.PaymentByCardFrom.Id == orderParametersProvider.GetPaymentByCardFromAvangardId)
                                                   //Не выбираем данный источник отправки для чеков, пока нет оплаты на сайте по QR
                                                   /*.Add(() => orderAlias.PaymentByCardFrom.Id == orderParametersProvider.GetPaymentByCardFromSiteByQrCode)*/));

            var statusRestriction = Restrictions.Disjunction()
                                    .Add(Restrictions.In(Projections.Property(() => orderAlias.OrderStatus),
                                                         new[] { OrderStatus.Shipped, OrderStatus.UnloadingOnStock }))
                                    .Add(Restrictions.Conjunction()
                                         .Add(() => orderAlias.SelfDelivery)
                                         .Add(() => orderAlias.IsSelfDeliveryPaid));

            var positiveSumRestriction = Restrictions.Gt(orderSumProjection, 0);

            var notSentRestriction = Restrictions.Disjunction()
                                     .Add(Restrictions.IsNull(Projections.Property(() => cashReceiptAlias.Id)))
                                     .Add(() => !cashReceiptAlias.Sent);

            var ordersToSendQuery = uow.Session.QueryOver <VodovozOrder>(() => orderAlias)
                                    .JoinEntityAlias(() => cashReceiptAlias, () => cashReceiptAlias.Order.Id == orderAlias.Id, JoinType.LeftOuterJoin)
                                    .Left.JoinAlias(() => orderAlias.OrderItems, () => orderItemAlias)
                                    .Inner.JoinAlias(() => orderAlias.Client, () => counterpartyAlias)
                                    .Where(paymentTypeRestriction)
                                    .And(statusRestriction)
                                    .And(positiveSumRestriction)
                                    .And(notSentRestriction);

            if (startDate.HasValue)
            {
                ordersToSendQuery.Where(() => orderAlias.DeliveryDate >= startDate.Value);
            }

            var ordersToSend = ordersToSendQuery
                               .SelectList(list => list
                                           .SelectGroup(() => orderAlias.Id).WithAlias(() => resultAlias.OrderId)
                                           .Select(() => cashReceiptAlias.Id).WithAlias(() => resultAlias.ReceiptId)
                                           .Select(() => cashReceiptAlias.Sent).WithAlias(() => resultAlias.WasSent))
                               .TransformUsing(Transformers.AliasToBean <ReceiptForOrderNode>())
                               .List <ReceiptForOrderNode>();

            return(ordersToSend);
        }
コード例 #17
0
 public PaymentTypeConverter(IOrderParametersProvider orderParametersProvider)
 {
     this._orderParametersProvider = orderParametersProvider ?? throw new ArgumentNullException(nameof(orderParametersProvider));
 }
コード例 #18
0
        public IEnumerable <ReceiptForOrderNode> GetOrdersForCashReceiptServiceToSend(
            IUnitOfWork uow,
            IOrderParametersProvider orderParametersProvider,
            IOrganizationParametersProvider organizationParametersProvider,
            ISalesReceiptsParametersProvider salesReceiptsParametersProvider,
            DateTime?startDate = null)
        {
            #region Aliases Restrictions Projections

            var paymentByCardFromNotToSendSalesReceipts = orderParametersProvider.PaymentsByCardFromNotToSendSalesReceipts;
            var vodovozSouthOrganizationId = organizationParametersProvider.VodovozSouthOrganizationId;

            ExtendedReceiptForOrderNode extendedReceiptForOrderNodeAlias = null;

            OrderItem            orderItemAlias            = null;
            VodovozOrder         orderAlias                = null;
            CashReceipt          cashReceiptAlias          = null;
            Nomenclature         nomenclatureAlias         = null;
            ProductGroup         productGroupAlias         = null;
            Counterparty         counterpartyAlias         = null;
            CounterpartyContract counterpartyContractAlias = null;
            Organization         organizationAlias         = null;

            var orderSumProjection = Projections.Sum(
                Projections.SqlFunction(
                    new SQLFunctionTemplate(NHibernateUtil.Decimal, "CAST(IFNULL(?1 * ?2 - ?3, 0) AS DECIMAL(14,2))"),
                    NHibernateUtil.Decimal,
                    Projections.Property(() => orderItemAlias.Count),
                    Projections.Property(() => orderItemAlias.Price),
                    Projections.Property(() => orderItemAlias.DiscountMoney)
                    )
                );

            var orderSumRestriction = Restrictions.Gt(orderSumProjection, 0);

            var alwaysSendOrdersRestriction = Restrictions.Disjunction()
                                              .Add(() => productGroupAlias.OnlineStore != null)
                                              .Add(() => counterpartyAlias.AlwaysSendReceitps)
                                              .Add(() => orderAlias.SelfDelivery)
                                              .Add(Restrictions.In(Projections.Property(() => orderAlias.PaymentType),
                                                                   new[] { PaymentType.ByCard, PaymentType.Terminal }.ToArray()));

            var orderDeliveredStatuses = Restrictions.In(Projections.Property(() => orderAlias.OrderStatus),
                                                         new[] { OrderStatus.Shipped, OrderStatus.UnloadingOnStock }.ToArray());

            var orderPaymentTypesRestriction = Restrictions.In(Projections.Property(() => orderAlias.PaymentType),
                                                               new[] { PaymentType.cash, PaymentType.Terminal, PaymentType.ByCard }.ToArray());

            var paidByCardRestriction = Restrictions.Disjunction()
                                        .Add(() => orderAlias.PaymentType != PaymentType.ByCard)
                                        .Add(() => organizationAlias.Id != vodovozSouthOrganizationId)
                                        .Add(Restrictions.On(() => orderAlias.PaymentByCardFrom.Id)
                                             .Not.IsIn(paymentByCardFromNotToSendSalesReceipts));

            #endregion

            #region AlwaysSendOrders

            var alwaysSendOrdersQuery = uow.Session.QueryOver <VodovozOrder>(() => orderAlias)
                                        .JoinEntityAlias(() => cashReceiptAlias, () => cashReceiptAlias.Order.Id == orderAlias.Id, JoinType.LeftOuterJoin)
                                        .Left.JoinAlias(() => orderAlias.OrderItems, () => orderItemAlias)
                                        .Left.JoinAlias(() => orderItemAlias.Nomenclature, () => nomenclatureAlias)
                                        .Left.JoinAlias(() => nomenclatureAlias.ProductGroup, () => productGroupAlias)
                                        .Left.JoinAlias(() => orderAlias.Client, () => counterpartyAlias)
                                        .Left.JoinAlias(() => orderAlias.Contract, () => counterpartyContractAlias)
                                        .Left.JoinAlias(() => counterpartyContractAlias.Organization, () => organizationAlias)
                                        .Where(alwaysSendOrdersRestriction)
                                        .And(paidByCardRestriction)
                                        .And(Restrictions.Disjunction()
                                             .Add(orderDeliveredStatuses)
                                             .Add(Restrictions.Conjunction()
                                                  .Add(() => orderAlias.SelfDelivery)
                                                  .Add(() => orderAlias.IsSelfDeliveryPaid)))
                                        .And(orderSumRestriction)
                                        .And(orderPaymentTypesRestriction)
                                        .And(Restrictions.Disjunction()
                                             .Add(Restrictions.IsNull(Projections.Property(() => cashReceiptAlias.Id)))
                                             .Add(() => !cashReceiptAlias.Sent));

            if (startDate.HasValue)
            {
                alwaysSendOrdersQuery.Where(() => orderAlias.DeliveryDate >= startDate.Value);
            }

            var alwaysSendOrders = alwaysSendOrdersQuery
                                   .SelectList(list => list
                                               .SelectGroup(() => orderAlias.Id).WithAlias(() => extendedReceiptForOrderNodeAlias.OrderId)
                                               .Select(() => orderAlias.PaymentType).WithAlias(() => extendedReceiptForOrderNodeAlias.PaymentType)
                                               .Select(orderSumProjection).WithAlias(() => extendedReceiptForOrderNodeAlias.OrderSum)
                                               .Select(() => cashReceiptAlias.Id).WithAlias(() => extendedReceiptForOrderNodeAlias.ReceiptId)
                                               .Select(() => cashReceiptAlias.Sent).WithAlias(() => extendedReceiptForOrderNodeAlias.WasSent))
                                   .TransformUsing(Transformers.AliasToBean <ExtendedReceiptForOrderNode>())
                                   .Future <ExtendedReceiptForOrderNode>();

            //Здесь фильтрация идёт не на уровне запроса, т.к. не NHibernate упорно не хочет клась сложное условие в HAVING
            var result = alwaysSendOrders
                         .Where(x =>
                                x.PaymentType != PaymentType.cash ||
                                x.PaymentType == PaymentType.cash && x.OrderSum < 20000)
                         .Select(x => new ReceiptForOrderNode
            {
                OrderId   = x.OrderId,
                ReceiptId = x.ReceiptId,
                WasSent   = x.WasSent
            });

            #endregion

            #region UniqueOrderSumOrders

            if (salesReceiptsParametersProvider.SendUniqueOrderSumOrders)
            {
                var uniqueOrderSumSendOrdersQuery = uow.Session.QueryOver <VodovozOrder>(() => orderAlias)
                                                    .JoinEntityAlias(() => cashReceiptAlias, () => cashReceiptAlias.Order.Id == orderAlias.Id, JoinType.LeftOuterJoin)
                                                    .Left.JoinAlias(() => orderAlias.OrderItems, () => orderItemAlias)
                                                    .Left.JoinAlias(() => orderItemAlias.Nomenclature, () => nomenclatureAlias)
                                                    .Left.JoinAlias(() => nomenclatureAlias.ProductGroup, () => productGroupAlias)
                                                    .Left.JoinAlias(() => orderAlias.Client, () => counterpartyAlias)
                                                    .Left.JoinAlias(() => orderAlias.Contract, () => counterpartyContractAlias)
                                                    .Left.JoinAlias(() => counterpartyContractAlias.Organization, () => organizationAlias)
                                                    .Where(Restrictions.Not(alwaysSendOrdersRestriction))
                                                    .And(paidByCardRestriction)
                                                    .And(orderDeliveredStatuses)
                                                    .And(orderSumRestriction)
                                                    .And(orderPaymentTypesRestriction);

                if (startDate.HasValue)
                {
                    uniqueOrderSumSendOrdersQuery.Where(() => orderAlias.DeliveryDate >= startDate.Value);
                }

                var notUniqueOrderSumSendOrdersTemp = uniqueOrderSumSendOrdersQuery
                                                      .SelectList(list => list
                                                                  .SelectGroup(() => orderAlias.Id).WithAlias(() => extendedReceiptForOrderNodeAlias.OrderId)
                                                                  .Select(() => orderAlias.PaymentType).WithAlias(() => extendedReceiptForOrderNodeAlias.PaymentType)
                                                                  .Select(orderSumProjection).WithAlias(() => extendedReceiptForOrderNodeAlias.OrderSum)
                                                                  .Select(CustomProjections.Date(() => orderAlias.DeliveryDate))
                                                                  .WithAlias(() => extendedReceiptForOrderNodeAlias.DeliveryDate)
                                                                  .Select(() => cashReceiptAlias.Id).WithAlias(() => extendedReceiptForOrderNodeAlias.ReceiptId)
                                                                  .Select(() => cashReceiptAlias.Sent).WithAlias(() => extendedReceiptForOrderNodeAlias.WasSent))
                                                      .TransformUsing(Transformers.AliasToBean <ExtendedReceiptForOrderNode>())
                                                      .Future <ExtendedReceiptForOrderNode>();

                var notUniqueOrderSumSendOrders = notUniqueOrderSumSendOrdersTemp.Where(x =>
                                                                                        x.PaymentType != PaymentType.cash ||
                                                                                        x.PaymentType == PaymentType.cash && x.OrderSum < 20000).ToList();

                var alreadySentOrders =
                    new List <ExtendedReceiptForOrderNode>(notUniqueOrderSumSendOrders.Where(x => x.WasSent.HasValue && x.WasSent.Value));
                var uniqueOrderSumSendNodes = new List <ExtendedReceiptForOrderNode>();

                foreach (var node in notUniqueOrderSumSendOrders.Where(x => !x.WasSent.HasValue || !x.WasSent.Value))
                {
                    if (alreadySentOrders.All(x => x.OrderSum != node.OrderSum || x.DeliveryDate != node.DeliveryDate) &&
                        uniqueOrderSumSendNodes.All(x => x.OrderSum != node.OrderSum || x.DeliveryDate != node.DeliveryDate))
                    {
                        uniqueOrderSumSendNodes.Add(node);
                    }
                }
                var uniqueOrderSumSendOrderNodes = uniqueOrderSumSendNodes.Select(x => new ReceiptForOrderNode
                {
                    OrderId = x.OrderId, ReceiptId = x.ReceiptId, WasSent = x.WasSent
                });

                result = result.Union(uniqueOrderSumSendOrderNodes);
            }

            #endregion

            return(result);
        }
コード例 #19
0
        public IList <VodovozOrder> GetOrdersToExport1c8(
            IUnitOfWork uow,
            IOrderParametersProvider orderParametersProvider,
            Export1cMode mode,
            DateTime startDate,
            DateTime endDate,
            int?organizationId = null)
        {
            VodovozOrder orderAlias     = null;
            OrderItem    orderItemAlias = null;

            var export1CSubquerySum = QueryOver.Of(() => orderItemAlias)
                                      .Where(() => orderItemAlias.Order.Id == orderAlias.Id)
                                      .Select(Projections.Sum(
                                                  Projections.SqlFunction(new VarArgsSQLFunction("", " * ", ""),
                                                                          NHibernateUtil.Decimal,
                                                                          Projections.Conditional(
                                                                              Restrictions.IsNotNull(Projections.Property <OrderItem>(x => x.ActualCount)),
                                                                              Projections.Property <OrderItem>(x => x.ActualCount),
                                                                              Projections.Property <OrderItem>(x => x.Count)
                                                                              ),
                                                                          Projections.Property <OrderItem>(x => x.Price),
                                                                          Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "( 1 - ?1 / 100 )"),
                                                                                                  NHibernateUtil.Decimal,
                                                                                                  Projections.Property <OrderItem>(x => x.Discount)
                                                                                                  )
                                                                          )
                                                  ))
            ;

            var query = uow.Session.QueryOver(() => orderAlias)
                        .Where(() => orderAlias.OrderStatus.IsIn(VodovozOrder.StatusesToExport1c))
                        .Where(() => startDate <= orderAlias.DeliveryDate && orderAlias.DeliveryDate <= endDate);

            if (organizationId.HasValue)
            {
                CounterpartyContract counterpartyContractAlias = null;

                query.Left.JoinAlias(() => orderAlias.Contract, () => counterpartyContractAlias)
                .Where(() => counterpartyContractAlias.Organization.Id == organizationId);
            }

            switch (mode)
            {
            case Export1cMode.BuhgalteriaOOO:
                query.Where(o => o.PaymentType == PaymentType.cashless)
                .And(Subqueries.Le(0.01, export1CSubquerySum.DetachedCriteria));
                break;

            case Export1cMode.BuhgalteriaOOONew:
                CashReceipt cashReceiptAlias = null;

                query.JoinEntityAlias(() => cashReceiptAlias, () => cashReceiptAlias.Order.Id == orderAlias.Id, JoinType.LeftOuterJoin)
                .Where(Restrictions.Disjunction()
                       .Add(() => orderAlias.PaymentType == PaymentType.cashless)
                       .Add(Restrictions.Conjunction()
                            .Add(Restrictions.On(() => orderAlias.PaymentType)
                                 .IsIn(new[] { PaymentType.Terminal, PaymentType.cash }))
                            .Add(Restrictions.IsNotNull(Projections.Property(() => cashReceiptAlias.Id))))
                       .Add(Restrictions.Conjunction()
                            .Add(() => orderAlias.PaymentType == PaymentType.ByCard)
                            .Add(Restrictions.Disjunction()
                                 .Add(Restrictions.On(() => orderAlias.PaymentByCardFrom.Id)
                                      .IsIn(orderParametersProvider.PaymentsByCardFromNotToSendSalesReceipts))
                                 .Add(Restrictions.IsNotNull(Projections.Property(() => cashReceiptAlias.Id))))
                            )
                       );
                break;

            case Export1cMode.IPForTinkoff:
                query.Where(o => o.PaymentType == PaymentType.ByCard)
                .And(o => o.OnlineOrder != null)
                .And(Subqueries.Le(0.01, export1CSubquerySum.DetachedCriteria));
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(mode), mode, null);
            }

            return(query.List());
        }