public static IUnitOfWorkGeneric<NonfreeRentAgreement> Create(CounterpartyContract contract)
 {
     var uow = UnitOfWorkFactory.CreateWithNewRoot<NonfreeRentAgreement> ();
     uow.Root.Contract = uow.GetById<CounterpartyContract>(contract.Id);
     uow.Root.AgreementNumber = AdditionalAgreement.GetNumber (uow.Root.Contract);
     return uow;
 }
示例#2
0
        void RunAgreementCreateDialog(CounterpartyContract contract)
        {
            ITdiTab dlg;
            string  paymentTypeString = "";

            switch (UoWGeneric.Root.Payment)
            {
            case PaymentType.cash:
                paymentTypeString = "наличной";
                break;

            case PaymentType.cashless:
                paymentTypeString = "безналичной";
                break;

            case PaymentType.barter:
                paymentTypeString = "бартерной";
                break;
            }
            string question = "Отсутствует доп. соглашение сервиса с клиентом в договоре для " +
                              paymentTypeString +
                              " формы оплаты. Создать?";

            if (MessageDialogWorks.RunQuestionDialog(question))
            {
                dlg = new RepairAgreementDlg(contract);
                (dlg as IAgreementSaved).AgreementSaved += (sender, e) => {
                    UoWGeneric.Root.InitialOrder?.CreateOrderAgreementDocument(e.Agreement);
                };
                TabParent.AddSlaveTab(this, dlg);
            }
        }
示例#3
0
 public WaterAgreementDlg(CounterpartyContract contract, DeliveryPoint deliveryPoint, DateTime?date) : this(contract, deliveryPoint)
 {
     if (date.HasValue)
     {
         UoWGeneric.Root.IssueDate = UoWGeneric.Root.StartDate = date.Value;
     }
     ConfigureDlg();
     Entity.FillFixedPricesFromDeliveryPoint(UoW);
 }
示例#4
0
 public FreeRentAgreementDlg(CounterpartyContract contract, DeliveryPoint point, DateTime?IssueDate)
 {
     this.Build();
     UoWGeneric = FreeRentAgreement.Create(contract);
     UoWGeneric.Root.DeliveryPoint = point;
     if (IssueDate.HasValue)
     {
         UoWGeneric.Root.IssueDate = UoWGeneric.Root.StartDate = IssueDate.Value;
     }
     ConfigureDlg();
 }
示例#5
0
 public DailyRentAgreementDlg(CounterpartyContract contract, DeliveryPoint point, DateTime?IssueDate, PaidRentPackage paidRentPackage)         // : this (contract)
 {
     this.Build();
     UoWGeneric = DailyRentAgreement.Create(contract);
     UoWGeneric.Root.DeliveryPoint = point;
     if (IssueDate.HasValue)
     {
         UoWGeneric.Root.IssueDate = UoWGeneric.Root.StartDate = IssueDate.Value;
     }
     ConfigureDlg();
     PaidRentPackage = paidRentPackage;
     dailyrentpackagesview1.PaidRentPackage = PaidRentPackage;
     dailyrentpackagesview1.AddEquipment(PaidRentPackage);
 }
示例#6
0
 public FreeRentAgreementDlg(CounterpartyContract contract, DeliveryPoint point, DateTime?IssueDate, FreeRentPackage freeRentPackage)
 {
     this.Build();
     UoWGeneric = FreeRentAgreement.Create(contract);
     UoWGeneric.Root.DeliveryPoint = point;
     if (IssueDate.HasValue)
     {
         UoWGeneric.Root.IssueDate = UoWGeneric.Root.StartDate = IssueDate.Value;
     }
     ConfigureDlg();
     FreeRentPackage = freeRentPackage;
     freerentpackagesview1.FreeRentPackage = FreeRentPackage;
     freerentpackagesview1.AddEquipment(FreeRentPackage);
 }
示例#7
0
 public EquipSalesAgreementDlg(CounterpartyContract contract, DeliveryPoint point, DateTime?IssueDate, Nomenclature nomenclature = null)
 {
     this.Build();
     UoWGeneric = SalesEquipmentAgreement.Create(contract);
     UoWGeneric.Root.DeliveryPoint = point;
     if (IssueDate.HasValue)
     {
         UoWGeneric.Root.IssueDate = UoWGeneric.Root.StartDate = IssueDate.Value;
     }
     if (nomenclature != null)
     {
         Entity.AddEquipment(nomenclature);
     }
     ConfigureDlg();
 }
        public IList <NotFullyPaidOrderNode> GetAllNotFullyPaidOrdersByClientAndOrg(
            IUnitOfWork uow, int counterpartyId, int organizationId, int closingDocumentDeliveryScheduleId)
        {
            VodovozOrder              orderAlias                     = null;
            OrderItem                 orderItemAlias                 = null;
            PaymentItem               paymentItemAlias               = null;
            CounterpartyContract      counterpartyContractAlias      = null;
            Organization              orderOrganizationAlias         = null;
            DeliverySchedule          deliveryScheduleAlias          = null;
            CashlessMovementOperation cashlessMovementOperationAlias = null;
            NotFullyPaidOrderNode     resultAlias                    = null;

            var orderSumProjection     = GetOrderSumProjection(orderItemAlias);
            var allocatedSumProjection = QueryOver.Of(() => paymentItemAlias)
                                         .JoinAlias(pi => pi.CashlessMovementOperation, () => cashlessMovementOperationAlias)
                                         .Where(pi => pi.Order.Id == orderAlias.Id)
                                         .Where(pi => pi.PaymentItemStatus != AllocationStatus.Cancelled)
                                         .Select(Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "IFNULL(?1, ?2)"),
                                                                         NHibernateUtil.Decimal,
                                                                         Projections.Sum(() => cashlessMovementOperationAlias.Expense),
                                                                         Projections.Constant(0)));

            return(uow.Session.QueryOver(() => orderAlias)
                   .Inner.JoinAlias(o => o.OrderItems, () => orderItemAlias)
                   .Inner.JoinAlias(o => o.Contract, () => counterpartyContractAlias)
                   .Inner.JoinAlias(() => counterpartyContractAlias.Organization, () => orderOrganizationAlias)
                   .Inner.JoinAlias(o => o.DeliverySchedule, () => deliveryScheduleAlias)
                   .Where(() => orderAlias.Client.Id == counterpartyId)
                   .And(() => orderOrganizationAlias.Id == organizationId)
                   .And(() => orderAlias.OrderStatus == OrderStatus.Shipped ||
                        orderAlias.OrderStatus == OrderStatus.UnloadingOnStock ||
                        orderAlias.OrderStatus == OrderStatus.Closed)
                   .And(() => orderAlias.PaymentType == PaymentType.cashless)
                   .And(() => orderAlias.OrderPaymentStatus != OrderPaymentStatus.Paid)
                   .And(() => deliveryScheduleAlias.Id != closingDocumentDeliveryScheduleId)
                   .SelectList(list =>
                               list.SelectGroup(o => o.Id).WithAlias(() => resultAlias.Id)
                               .Select(o => o.DeliveryDate).WithAlias(() => resultAlias.OrderDeliveryDate)
                               .Select(o => o.CreateDate).WithAlias(() => resultAlias.OrderCreationDate)
                               .Select(orderSumProjection).WithAlias(() => resultAlias.OrderSum)
                               .SelectSubQuery(allocatedSumProjection).WithAlias(() => resultAlias.AllocatedSum))
                   .Where(Restrictions.Gt(orderSumProjection, 0))
                   .TransformUsing(Transformers.AliasToBean <NotFullyPaidOrderNode>())
                   .OrderBy(o => o.DeliveryDate).Asc
                   .OrderBy(o => o.CreateDate).Asc
                   .List <NotFullyPaidOrderNode>());
        }
示例#9
0
        public override bool Save()
        {
            var valid = new QSValidator <ServiceClaim> (UoWGeneric.Root);

            if (valid.RunDlgIfNotValid((Window)this.Toplevel))
            {
                return(false);
            }

            CounterpartyContract contract = CounterpartyContractRepository.GetCounterpartyContractByPaymentType
                                                (UoWGeneric, UoWGeneric.Root.Counterparty, UoWGeneric.Root.Counterparty.PersonType, UoWGeneric.Root.Payment);

            if (contract == null)
            {
                RunContractCreateDialog();
                return(false);
            }

            UoWGeneric.Session.Refresh(contract);
            if (!contract.RepairAgreementExists())
            {
                RunAgreementCreateDialog(contract);
                return(false);
            }

            if (UoWGeneric.Root.InitialOrder != null)
            {
                UoWGeneric.Root.InitialOrder.AddServiceClaimAsInitial(UoWGeneric.Root);
            }

            if (UoWGeneric.Root.FinalOrder != null)
            {
                UoWGeneric.Root.FinalOrder.AddServiceClaimAsFinal(UoWGeneric.Root);
            }

            if (UoWGeneric.IsNew)
            {
                UoWGeneric.Root.AddHistoryRecord(UoWGeneric.Root.Status,
                                                 String.IsNullOrWhiteSpace(textComment.Buffer.Text) ? "Заявка зарегистрирована" : textComment.Buffer.Text);
            }

            logger.Info("Сохраняем заявку на обслуживание...");
            UoWGeneric.Save();
            logger.Info("Ok");
            return(true);
        }
        private void LoadData()
        {
            CounterpartyContract contractAlias = null;

            //получаем список контрактов
            var contracts = UoW.Session.QueryOver <CounterpartyContract>(() => contractAlias)
                            .Where(() => contractAlias.Counterparty.Id == Counterparty.Id)
                            .List();

            foreach (var contract in contracts)
            {
                CounterpartyDocumentNode contractNode = new CounterpartyDocumentNode();
                contractNode.Document  = contract;
                contractNode.Documents = new List <CounterpartyDocumentNode>();

                CounterpartyDocs.Add(contractNode);
            }

            ytreeDocuments.YTreeModel = new RecursiveTreeModel <CounterpartyDocumentNode>(CounterpartyDocs, x => x.Parent, x => x.Documents);
        }
示例#11
0
        public CounterpartyContract CreateContract(IUnitOfWork uow, Order order, DateTime?issueDate)
        {
            var contractType      = counterpartyContractRepository.GetContractTypeForPaymentType(order.Client.PersonType, order.PaymentType);
            var org               = organizationProvider.GetOrganization(uow, order);
            var contractSubNumber = CounterpartyContract.GenerateSubNumber(order.Client);

            CounterpartyContract contract = new CounterpartyContract {
                Counterparty      = order.Client,
                ContractSubNumber = contractSubNumber,
                Organization      = org,
                IsArchive         = false,
                ContractType      = contractType
            };

            if (issueDate.HasValue)
            {
                contract.IssueDate = issueDate.Value;
            }
            return(contract);
        }
示例#12
0
 public FreeRentAgreementDlg(CounterpartyContract contract)
 {
     this.Build();
     UoWGeneric = FreeRentAgreement.Create(contract);
     ConfigureDlg();
 }
示例#13
0
        protected override IQueryOver <Payment> ItemsQuery(IUnitOfWork uow)
        {
            UnallocatedBalancesJournalNode resultAlias               = null;
            VodOrder                  orderAlias                     = null;
            VodOrder                  orderAlias2                    = null;
            OrderItem                 orderItemAlias                 = null;
            PaymentItem               paymentItemAlias               = null;
            Counterparty              counterpartyAlias              = null;
            Organization              organizationAlias              = null;
            CounterpartyContract      counterpartyContractAlias      = null;
            Organization              orderOrganizationAlias         = null;
            CashlessMovementOperation cashlessMovementOperationAlias = null;

            var query = uow.Session.QueryOver <Payment>()
                        .Inner.JoinAlias(cmo => cmo.Counterparty, () => counterpartyAlias)
                        .Inner.JoinAlias(cmo => cmo.Organization, () => organizationAlias);

            var income = QueryOver.Of <CashlessMovementOperation>()
                         .Where(cmo => cmo.Counterparty.Id == counterpartyAlias.Id)
                         .And(cmo => cmo.Organization.Id == organizationAlias.Id)
                         .And(cmo => cmo.CashlessMovementOperationStatus != AllocationStatus.Cancelled)
                         .Select(Projections.Sum <CashlessMovementOperation>(cmo => cmo.Income));

            var expense = QueryOver.Of <CashlessMovementOperation>()
                          .Where(cmo => cmo.Counterparty.Id == counterpartyAlias.Id)
                          .And(cmo => cmo.Organization.Id == organizationAlias.Id)
                          .And(cmo => cmo.CashlessMovementOperationStatus != AllocationStatus.Cancelled)
                          .Select(Projections.Sum <CashlessMovementOperation>(cmo => cmo.Expense));

            var balanceProjection = Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "?1 - ?2"),
                                                            NHibernateUtil.Decimal,
                                                            Projections.SubQuery(income),
                                                            Projections.SubQuery(expense));

            var orderSumProjection = OrderRepository.GetOrderSumProjection(orderItemAlias);

            var totalNotPaidOrders = QueryOver.Of(() => orderAlias)
                                     .Inner.JoinAlias(o => o.OrderItems, () => orderItemAlias)
                                     .Inner.JoinAlias(o => o.Contract, () => counterpartyContractAlias)
                                     .Inner.JoinAlias(() => counterpartyContractAlias.Organization, () => orderOrganizationAlias)
                                     .Where(() => orderAlias.Client.Id == counterpartyAlias.Id)
                                     .And(() => orderOrganizationAlias.Id == organizationAlias.Id)
                                     .And(() => orderAlias.PaymentType == PaymentType.cashless)
                                     .And(() => orderAlias.OrderPaymentStatus != OrderPaymentStatus.Paid)
                                     .Select(orderSumProjection)
                                     .Where(Restrictions.Gt(orderSumProjection, 0));

            var totalPayPartiallyPaidOrders = QueryOver.Of(() => paymentItemAlias)
                                              .JoinEntityAlias(() => orderAlias2, () => paymentItemAlias.Order.Id == orderAlias2.Id, JoinType.InnerJoin)
                                              .Inner.JoinAlias(() => orderAlias2.Contract, () => counterpartyContractAlias)
                                              .Inner.JoinAlias(() => counterpartyContractAlias.Organization, () => orderOrganizationAlias)
                                              .Inner.JoinAlias(() => paymentItemAlias.CashlessMovementOperation, () => cashlessMovementOperationAlias)
                                              .Where(() => orderAlias2.Client.Id == counterpartyAlias.Id)
                                              .And(() => orderOrganizationAlias.Id == organizationAlias.Id)
                                              .And(() => cashlessMovementOperationAlias.CashlessMovementOperationStatus != AllocationStatus.Cancelled)
                                              .And(() => orderAlias2.PaymentType == PaymentType.cashless)
                                              .And(() => orderAlias2.OrderPaymentStatus == OrderPaymentStatus.PartiallyPaid)
                                              .Select(Projections.Sum(() => cashlessMovementOperationAlias.Expense));

            var counterpartyDebtProjection = Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "?1 - IFNULL(?2, ?3)"),
                                                                     NHibernateUtil.Decimal,
                                                                     Projections.SubQuery(totalNotPaidOrders),
                                                                     Projections.SubQuery(totalPayPartiallyPaidOrders),
                                                                     Projections.Constant(0));

            query.Where(GetSearchCriterion(
                            () => counterpartyAlias.Id,
                            () => counterpartyAlias.Name,
                            () => balanceProjection,
                            () => counterpartyDebtProjection));

            #region filter

            if (_filterViewModel.Counterparty != null)
            {
                query.Where(() => counterpartyAlias.Id == _filterViewModel.Counterparty.Id);
            }

            if (_filterViewModel.Organization != null)
            {
                query.Where(() => organizationAlias.Id == _filterViewModel.Organization.Id);
            }

            #endregion

            return(query.SelectList(list => list
                                    .SelectGroup(() => counterpartyAlias.Id).WithAlias(() => resultAlias.CounterpartyId)
                                    .SelectGroup(() => organizationAlias.Id).WithAlias(() => resultAlias.OrganizationId)
                                    .Select(p => counterpartyAlias.INN).WithAlias(() => resultAlias.CounterpartyINN)
                                    .Select(p => counterpartyAlias.Name).WithAlias(() => resultAlias.CounterpartyName)
                                    .Select(p => organizationAlias.Name).WithAlias(() => resultAlias.OrganizationName)
                                    .Select(balanceProjection).WithAlias(() => resultAlias.CounterpartyBalance)
                                    .Select(counterpartyDebtProjection).WithAlias(() => resultAlias.CounterpartyDebt))
                   .Where(Restrictions.Gt(balanceProjection, 0))
                   .And(Restrictions.Gt(counterpartyDebtProjection, 0))
                   .OrderBy(balanceProjection).Desc
                   .TransformUsing(Transformers.AliasToBean <UnallocatedBalancesJournalNode>())
                   .SetTimeout(120));
        }
示例#14
0
        public override void UpdateNodes()
        {
            Counterparty         counterpartyAlias            = null;
            Counterparty         counterpartyAliasForSubquery = null;
            CounterpartyContract contractAlias = null;
            CounterpartyVMNode   resultAlias   = null;

            Vodovoz.Domain.Contacts.Phone phoneAlias = null;
            DeliveryPoint addressAlias        = null;
            Tag           tagAliasForSubquery = null;

            var query = UoW.Session.QueryOver <Counterparty>(() => counterpartyAlias);

            if (Filter != null && !Filter.RestrictIncludeArhive)
            {
                query.Where(c => !c.IsArchive);
            }

            if (Filter?.CounterpartyType != null)
            {
                query.Where(t => t.CounterpartyType == Filter.CounterpartyType);
            }

            var contractsSubquery = QueryOver.Of <CounterpartyContract>(() => contractAlias)
                                    .Left.JoinAlias(c => c.Counterparty, () => counterpartyAliasForSubquery)
                                    .Where(() => counterpartyAlias.Id == counterpartyAliasForSubquery.Id)
                                    .Select(Projections.SqlFunction(
                                                new SQLFunctionTemplate(NHibernateUtil.String, "GROUP_CONCAT( CONCAT(?2,' - ',?1) SEPARATOR ?3)"),
                                                NHibernateUtil.String,
                                                Projections.Property(() => contractAlias.ContractSubNumber),
                                                Projections.Property(() => counterpartyAliasForSubquery.VodovozInternalId),
                                                Projections.Constant("\n")));

            var addressSubquery = QueryOver.Of <DeliveryPoint>(() => addressAlias)
                                  .Where(d => d.Counterparty.Id == counterpartyAlias.Id)
                                  .Where(() => addressAlias.IsActive)
                                  .Select(Projections.SqlFunction(
                                              new SQLFunctionTemplate(NHibernateUtil.String, "GROUP_CONCAT( ?1 SEPARATOR ?2)"),
                                              NHibernateUtil.String,
                                              Projections.Property(() => addressAlias.CompiledAddress),
                                              Projections.Constant("\n")));

            var tagsSubquery = QueryOver.Of <Counterparty>(() => counterpartyAliasForSubquery)
                               .Where(() => counterpartyAlias.Id == counterpartyAliasForSubquery.Id)
                               .JoinAlias(c => c.Tags, () => tagAliasForSubquery)
                               .Select(Projections.SqlFunction(
                                           new SQLFunctionTemplate(NHibernateUtil.String, "GROUP_CONCAT( CONCAT(' <span foreground=\"', ?1, '\"> ♥</span>', ?2) SEPARATOR '\n')"),
                                           NHibernateUtil.String,
                                           Projections.Property(() => tagAliasForSubquery.ColorText),
                                           Projections.Property(() => tagAliasForSubquery.Name)
                                           ));

            if (Filter != null && Filter.Tag != null)
            {
                query.JoinAlias(c => c.Tags, () => tagAliasForSubquery)
                .Where(() => tagAliasForSubquery.Id == Filter.Tag.Id);
            }

            var counterpartyList = query
                                   .JoinAlias(c => c.Phones, () => phoneAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                   .SelectList(list => list
                                               .SelectGroup(c => c.Id).WithAlias(() => resultAlias.Id)
                                               .SelectGroup(c => c.VodovozInternalId).WithAlias(() => resultAlias.InternalId)
                                               .Select(c => c.Name).WithAlias(() => resultAlias.Name)
                                               .Select(c => c.INN).WithAlias(() => resultAlias.INN)
                                               .Select(c => c.IsArchive).WithAlias(() => resultAlias.IsArhive)
                                               .SelectSubQuery(contractsSubquery).WithAlias(() => resultAlias.Contracts)
                                               .Select(Projections.SqlFunction(
                                                           new SQLFunctionTemplate(NHibernateUtil.String, "GROUP_CONCAT( ?1 SEPARATOR ?2)"),
                                                           NHibernateUtil.String,
                                                           Projections.Property(() => phoneAlias.Number),
                                                           Projections.Constant("\n"))
                                                       ).WithAlias(() => resultAlias.Phones)
                                               .Select(Projections.SqlFunction(
                                                           new SQLFunctionTemplate(NHibernateUtil.String, "GROUP_CONCAT( ?1 SEPARATOR ?2)"),
                                                           NHibernateUtil.String,
                                                           Projections.Property(() => phoneAlias.DigitsNumber),
                                                           Projections.Constant("\n"))
                                                       ).WithAlias(() => resultAlias.PhonesDigits)
                                               .SelectSubQuery(addressSubquery).WithAlias(() => resultAlias.Addresses)
                                               .SelectSubQuery(tagsSubquery).WithAlias(() => resultAlias.Tags)
                                               )
                                   .TransformUsing(Transformers.AliasToBean <CounterpartyVMNode>())
                                   .List <CounterpartyVMNode>();

            SetItemsSource(counterpartyList);
        }
示例#15
0
 public EquipSalesAgreementDlg(CounterpartyContract contract)
 {
     this.Build();
     UoWGeneric = SalesEquipmentAgreement.Create(contract);
     ConfigureDlg();
 }
示例#16
0
 public WaterAgreementDlg(CounterpartyContract contract, DeliveryPoint deliveryPoint) : this(contract)
 {
     UoWGeneric.Root.DeliveryPoint = UoW.GetById <DeliveryPoint>(deliveryPoint.Id);
     ConfigureDlg();
 }
示例#17
0
 public WaterAgreementDlg(CounterpartyContract contract)
 {
     this.Build();
     UoWGeneric = WaterSalesAgreement.Create(contract);
     ConfigureDlg();
 }
示例#18
0
 public ContractSavedEventArgs(CounterpartyContract contract)
 {
     Contract = contract;
 }
示例#19
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);
        }
示例#20
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());
        }
        private IQueryOver <VodovozOrder> GetOrdersQuery(IUnitOfWork uow)
        {
            RetailOrderJournalNode resultAlias         = null;
            VodovozOrder           orderAlias          = null;
            Nomenclature           nomenclatureAlias   = null;
            OrderItem            orderItemAlias        = null;
            Counterparty         counterpartyAlias     = null;
            DeliveryPoint        deliveryPointAlias    = null;
            DeliverySchedule     deliveryScheduleAlias = null;
            Employee             authorAlias           = null;
            Employee             lastEditorAlias       = null;
            District             districtAlias         = null;
            CounterpartyContract contractAlias         = null;

            Nomenclature sanitizationNomenclature = _nomenclatureRepository.GetSanitisationNomenclature(uow);

            var query = uow.Session.QueryOver <VodovozOrder>(() => orderAlias);

            if (FilterViewModel != null && FilterViewModel.IsForRetail != null)
            {
                query.JoinEntityAlias(
                    () => counterpartyAlias,
                    () => counterpartyAlias.Id == orderAlias.Client.Id &&
                    counterpartyAlias.IsForRetail == FilterViewModel.IsForRetail,
                    NHibernate.SqlCommand.JoinType.InnerJoin);
            }
            else
            {
                query.Left.JoinAlias(o => o.Client, () => counterpartyAlias);
            }

            if (FilterViewModel.ViewTypes != ViewTypes.Order && FilterViewModel.ViewTypes != ViewTypes.All)
            {
                query.Where(o => o.Id == -1);
            }

            if (FilterViewModel.RestrictStatus != null)
            {
                query.Where(o => o.OrderStatus == FilterViewModel.RestrictStatus);
            }

            if (FilterViewModel.RestrictPaymentType != null)
            {
                query.Where(o => o.PaymentType == FilterViewModel.RestrictPaymentType);
            }

            if (FilterViewModel.HideStatuses != null)
            {
                query.WhereRestrictionOn(o => o.OrderStatus).Not.IsIn(FilterViewModel.HideStatuses);
            }

            if (FilterViewModel.RestrictOnlySelfDelivery != null)
            {
                query.Where(o => o.SelfDelivery == FilterViewModel.RestrictOnlySelfDelivery);
            }

            if (FilterViewModel.RestrictWithoutSelfDelivery != null)
            {
                query.Where(o => o.SelfDelivery != FilterViewModel.RestrictWithoutSelfDelivery);
            }

            if (FilterViewModel.RestrictCounterparty != null)
            {
                query.Where(o => o.Client == FilterViewModel.RestrictCounterparty);
            }

            if (FilterViewModel.DeliveryPoint != null)
            {
                query.Where(o => o.DeliveryPoint == FilterViewModel.DeliveryPoint);
            }

            if (FilterViewModel.RestrictStartDate != null)
            {
                query.Where(o => o.DeliveryDate >= FilterViewModel.RestrictStartDate);
            }

            if (FilterViewModel.RestrictEndDate != null)
            {
                query.Where(o => o.DeliveryDate <= FilterViewModel.RestrictEndDate.Value.AddDays(1).AddTicks(-1));
            }

            if (FilterViewModel.RestrictLessThreeHours == true)
            {
                query.Where(Restrictions
                            .GtProperty(Projections.SqlFunction(
                                            new SQLFunctionTemplate(NHibernateUtil.Time, "ADDTIME(?1, ?2)"),
                                            NHibernateUtil.Time,
                                            Projections.Property(() => deliveryScheduleAlias.From),
                                            Projections.Constant("3:0:0")),
                                        Projections.Property(() => deliveryScheduleAlias.To)));
            }

            if (FilterViewModel.RestrictHideService != null)
            {
                if (FilterViewModel.RestrictHideService.Value)
                {
                    query.Where(o => o.OrderAddressType != OrderAddressType.Service);
                }
                else
                {
                    query.Where(o => o.OrderAddressType == OrderAddressType.Service);
                }
            }

            if (FilterViewModel.RestrictOnlyService != null)
            {
                if (FilterViewModel.RestrictOnlyService.Value)
                {
                    query.Where(o => o.OrderAddressType == OrderAddressType.Service);
                }
                else
                {
                    query.Where(o => o.OrderAddressType != OrderAddressType.Service);
                }
            }

            if (FilterViewModel.OrderPaymentStatus != null)
            {
                query.Where(o => o.OrderPaymentStatus == FilterViewModel.OrderPaymentStatus);
            }

            if (FilterViewModel.Organisation != null)
            {
                query.Where(() => contractAlias.Organization.Id == FilterViewModel.Organisation.Id);
            }

            if (FilterViewModel.PaymentByCardFrom != null)
            {
                query.Where(o => o.PaymentByCardFrom.Id == FilterViewModel.PaymentByCardFrom.Id);
            }

            var bottleCountSubquery = QueryOver.Of <OrderItem>(() => orderItemAlias)
                                      .Where(() => orderAlias.Id == orderItemAlias.Order.Id)
                                      .JoinAlias(() => orderItemAlias.Nomenclature, () => nomenclatureAlias)
                                      .Where(() => nomenclatureAlias.Category == NomenclatureCategory.water && nomenclatureAlias.TareVolume == TareVolume.Vol19L)
                                      .Select(Projections.Sum(() => orderItemAlias.Count));

            var sanitisationCountSubquery = QueryOver.Of <OrderItem>(() => orderItemAlias)
                                            .Where(() => orderAlias.Id == orderItemAlias.Order.Id)
                                            .Where(() => orderItemAlias.Nomenclature.Id == sanitizationNomenclature.Id)
                                            .Select(Projections.Sum(() => orderItemAlias.Count));

            var orderSumSubquery = QueryOver.Of <OrderItem>(() => orderItemAlias)
                                   .Where(() => orderItemAlias.Order.Id == orderAlias.Id)
                                   .Select(
                Projections.Sum(
                    Projections.SqlFunction(
                        new SQLFunctionTemplate(NHibernateUtil.Decimal, "ROUND(IFNULL(?1, ?2) * ?3 - ?4, 2)"),
                        NHibernateUtil.Decimal,
                        Projections.Property <OrderItem>(x => x.ActualCount),
                        Projections.Property <OrderItem>(x => x.Count),
                        Projections.Property <OrderItem>(x => x.Price),
                        Projections.Property <OrderItem>(x => x.DiscountMoney)
                        )
                    )
                );

            query.Left.JoinAlias(o => o.DeliveryPoint, () => deliveryPointAlias)
            .Left.JoinAlias(o => o.DeliverySchedule, () => deliveryScheduleAlias)
            .Left.JoinAlias(o => o.Author, () => authorAlias)
            .Left.JoinAlias(o => o.LastEditor, () => lastEditorAlias)
            .Left.JoinAlias(() => deliveryPointAlias.District, () => districtAlias)
            .Left.JoinAlias(o => o.Contract, () => contractAlias);

            query.Where(GetSearchCriterion(
                            () => orderAlias.Id,
                            () => counterpartyAlias.Name,
                            () => deliveryPointAlias.CompiledAddress,
                            () => authorAlias.LastName,
                            () => orderAlias.DriverCallId,
                            () => orderAlias.OnlineOrder,
                            () => orderAlias.EShopOrder,
                            () => orderAlias.OrderPaymentStatus
                            ));

            var resultQuery = query
                              .SelectList(list => list
                                          .Select(() => orderAlias.Id).WithAlias(() => resultAlias.Id)
                                          .Select(() => orderAlias.SelfDelivery).WithAlias(() => resultAlias.IsSelfDelivery)
                                          .Select(() => orderAlias.DeliveryDate).WithAlias(() => resultAlias.Date)
                                          .Select(() => orderAlias.CreateDate).WithAlias(() => resultAlias.CreateDate)
                                          .Select(() => deliveryScheduleAlias.Name).WithAlias(() => resultAlias.DeliveryTime)
                                          .Select(() => orderAlias.OrderStatus).WithAlias(() => resultAlias.StatusEnum)
                                          .Select(() => orderAlias.Address1c).WithAlias(() => resultAlias.Address1c)
                                          .Select(() => authorAlias.LastName).WithAlias(() => resultAlias.AuthorLastName)
                                          .Select(() => authorAlias.Name).WithAlias(() => resultAlias.AuthorName)
                                          .Select(() => authorAlias.Patronymic).WithAlias(() => resultAlias.AuthorPatronymic)
                                          .Select(() => lastEditorAlias.LastName).WithAlias(() => resultAlias.LastEditorLastName)
                                          .Select(() => lastEditorAlias.Name).WithAlias(() => resultAlias.LastEditorName)
                                          .Select(() => lastEditorAlias.Patronymic).WithAlias(() => resultAlias.LastEditorPatronymic)
                                          .Select(() => orderAlias.LastEditedTime).WithAlias(() => resultAlias.LastEditedTime)
                                          .Select(() => orderAlias.DriverCallId).WithAlias(() => resultAlias.DriverCallId)
                                          .Select(() => orderAlias.OnlineOrder).WithAlias(() => resultAlias.OnlineOrder)
                                          .Select(() => counterpartyAlias.Name).WithAlias(() => resultAlias.Counterparty)
                                          .Select(() => districtAlias.DistrictName).WithAlias(() => resultAlias.DistrictName)
                                          .Select(() => deliveryPointAlias.CompiledAddress).WithAlias(() => resultAlias.CompilledAddress)
                                          .Select(() => deliveryPointAlias.City).WithAlias(() => resultAlias.City)
                                          .Select(() => deliveryPointAlias.Street).WithAlias(() => resultAlias.Street)
                                          .Select(() => deliveryPointAlias.Building).WithAlias(() => resultAlias.Building)
                                          .Select(() => orderAlias.EShopOrder).WithAlias(() => resultAlias.EShopOrder)
                                          .Select(() => orderAlias.OrderPaymentStatus).WithAlias(() => resultAlias.OrderPaymentStatus)
                                          .SelectSubQuery(orderSumSubquery).WithAlias(() => resultAlias.Sum)
                                          .SelectSubQuery(bottleCountSubquery).WithAlias(() => resultAlias.BottleAmount)
                                          .SelectSubQuery(sanitisationCountSubquery).WithAlias(() => resultAlias.SanitisationAmount)
                                          )
                              .OrderBy(x => x.CreateDate).Desc
                              .SetTimeout(60)
                              .TransformUsing(Transformers.AliasToBean <RetailOrderJournalNode <VodovozOrder> >());

            return(resultQuery);
        }
示例#22
0
        public IQueryOver <Payment, Payment> GetAllUnallocatedBalances(IUnitOfWork uow, int closingDocumentDeliveryScheduleId)
        {
            UnallocatedBalancesJournalNode resultAlias               = null;
            Order                     orderAlias                     = null;
            Order                     orderAlias2                    = null;
            OrderItem                 orderItemAlias                 = null;
            PaymentItem               paymentItemAlias               = null;
            Counterparty              counterpartyAlias              = null;
            Organization              organizationAlias              = null;
            CounterpartyContract      counterpartyContractAlias      = null;
            Organization              orderOrganizationAlias         = null;
            DeliverySchedule          deliveryScheduleAlias          = null;
            DeliverySchedule          deliveryScheduleAlias2         = null;
            CashlessMovementOperation cashlessMovementOperationAlias = null;

            var query = uow.Session.QueryOver <Payment>()
                        .Inner.JoinAlias(cmo => cmo.Counterparty, () => counterpartyAlias)
                        .Inner.JoinAlias(cmo => cmo.Organization, () => organizationAlias);

            var income = QueryOver.Of <CashlessMovementOperation>()
                         .Where(cmo => cmo.Counterparty.Id == counterpartyAlias.Id)
                         .And(cmo => cmo.Organization.Id == organizationAlias.Id)
                         .And(cmo => cmo.CashlessMovementOperationStatus != AllocationStatus.Cancelled)
                         .Select(Projections.Sum <CashlessMovementOperation>(cmo => cmo.Income));

            var expense = QueryOver.Of <CashlessMovementOperation>()
                          .Where(cmo => cmo.Counterparty.Id == counterpartyAlias.Id)
                          .And(cmo => cmo.Organization.Id == organizationAlias.Id)
                          .And(cmo => cmo.CashlessMovementOperationStatus != AllocationStatus.Cancelled)
                          .Select(Projections.Sum <CashlessMovementOperation>(cmo => cmo.Expense));

            var balanceProjection = Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "?1 - ?2"),
                                                            NHibernateUtil.Decimal,
                                                            Projections.SubQuery(income),
                                                            Projections.SubQuery(expense));

            var orderSumProjection = OrderRepository.GetOrderSumProjection(orderItemAlias);

            var totalNotPaidOrders = QueryOver.Of(() => orderAlias)
                                     .Inner.JoinAlias(o => o.OrderItems, () => orderItemAlias)
                                     .Inner.JoinAlias(o => o.Contract, () => counterpartyContractAlias)
                                     .Inner.JoinAlias(() => counterpartyContractAlias.Organization, () => orderOrganizationAlias)
                                     .Inner.JoinAlias(o => o.DeliverySchedule, () => deliveryScheduleAlias)
                                     .Where(() => orderAlias.Client.Id == counterpartyAlias.Id)
                                     .And(() => orderOrganizationAlias.Id == organizationAlias.Id)
                                     .And(() => orderAlias.OrderStatus == OrderStatus.Shipped ||
                                          orderAlias.OrderStatus == OrderStatus.UnloadingOnStock ||
                                          orderAlias.OrderStatus == OrderStatus.Closed)
                                     .And(() => orderAlias.PaymentType == PaymentType.cashless)
                                     .And(() => orderAlias.OrderPaymentStatus != OrderPaymentStatus.Paid)
                                     .And(() => deliveryScheduleAlias.Id != closingDocumentDeliveryScheduleId)
                                     .Select(orderSumProjection)
                                     .Where(Restrictions.Gt(orderSumProjection, 0));

            var totalPayPartiallyPaidOrders = QueryOver.Of(() => paymentItemAlias)
                                              .JoinEntityAlias(() => orderAlias2, () => paymentItemAlias.Order.Id == orderAlias2.Id, JoinType.InnerJoin)
                                              .Inner.JoinAlias(() => orderAlias2.Contract, () => counterpartyContractAlias)
                                              .Inner.JoinAlias(() => counterpartyContractAlias.Organization, () => orderOrganizationAlias)
                                              .Inner.JoinAlias(() => paymentItemAlias.CashlessMovementOperation, () => cashlessMovementOperationAlias)
                                              .Inner.JoinAlias(() => orderAlias2.DeliverySchedule, () => deliveryScheduleAlias2)
                                              .Where(() => orderAlias2.Client.Id == counterpartyAlias.Id)
                                              .And(() => orderOrganizationAlias.Id == organizationAlias.Id)
                                              .And(() => cashlessMovementOperationAlias.CashlessMovementOperationStatus != AllocationStatus.Cancelled)
                                              .And(() => orderAlias2.OrderStatus == OrderStatus.Shipped ||
                                                   orderAlias2.OrderStatus == OrderStatus.UnloadingOnStock ||
                                                   orderAlias2.OrderStatus == OrderStatus.Closed)
                                              .And(() => orderAlias2.PaymentType == PaymentType.cashless)
                                              .And(() => orderAlias2.OrderPaymentStatus == OrderPaymentStatus.PartiallyPaid)
                                              .And(() => deliveryScheduleAlias2.Id != closingDocumentDeliveryScheduleId)
                                              .Select(Projections.Sum(() => cashlessMovementOperationAlias.Expense));

            var counterpartyDebtProjection = Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "?1 - IFNULL(?2, ?3)"),
                                                                     NHibernateUtil.Decimal,
                                                                     Projections.SubQuery(totalNotPaidOrders),
                                                                     Projections.SubQuery(totalPayPartiallyPaidOrders),
                                                                     Projections.Constant(0));

            return(query.SelectList(list => list
                                    .SelectGroup(() => counterpartyAlias.Id).WithAlias(() => resultAlias.CounterpartyId)
                                    .SelectGroup(() => organizationAlias.Id).WithAlias(() => resultAlias.OrganizationId)
                                    .Select(p => counterpartyAlias.INN).WithAlias(() => resultAlias.CounterpartyINN)
                                    .Select(p => counterpartyAlias.Name).WithAlias(() => resultAlias.CounterpartyName)
                                    .Select(p => organizationAlias.Name).WithAlias(() => resultAlias.OrganizationName)
                                    .Select(balanceProjection).WithAlias(() => resultAlias.CounterpartyBalance)
                                    .Select(counterpartyDebtProjection).WithAlias(() => resultAlias.CounterpartyDebt))
                   .Where(Restrictions.Gt(balanceProjection, 0))
                   .And(Restrictions.Gt(counterpartyDebtProjection, 0))
                   .OrderBy(balanceProjection).Desc
                   .TransformUsing(Transformers.AliasToBean <UnallocatedBalancesJournalNode>())
                   .SetTimeout(180));
        }