public SalesReceiptsService( ISalesReceiptsServiceSettings salesReceiptsServiceSettings, IOrderRepository orderRepository, IOrderParametersProvider orderParametersProvider, IOrganizationParametersProvider organizationParametersProvider, ISalesReceiptsParametersProvider salesReceiptsParametersProvider ) { 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)); _salesReceiptsParametersProvider = salesReceiptsParametersProvider ?? throw new ArgumentNullException(nameof(salesReceiptsParametersProvider)); }
public FiscalizationWorker( IOrderRepository orderRepository, ISalesReceiptSender salesReceiptSender, IOrderParametersProvider orderParametersProvider, IOrganizationParametersProvider organizationParametersProvider, ISalesReceiptsParametersProvider salesReceiptsParametersProvider, 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.organizationParametersProvider = organizationParametersProvider ?? throw new ArgumentNullException(nameof(organizationParametersProvider)); _salesReceiptsParametersProvider = salesReceiptsParametersProvider ?? throw new ArgumentNullException(nameof(salesReceiptsParametersProvider)); this.cashBoxes = cashBoxes ?? throw new ArgumentNullException(nameof(cashBoxes)); }
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); }