public override bool IsValidForOrder(Order order, IStandartNomenclatures standartNomenclatures) { if (!IsForZeroDebt) { return(true); } var forfeitId = standartNomenclatures.GetForfeitId(); BottlesRepository bottlesRepository = new BottlesRepository(); BottlesMovementOperation bottlesMovementAlias = null; Order orderAlias = null; //Долг клиента var counterpartyDebtQuery = order.UoW.Session.QueryOver <BottlesMovementOperation>(() => bottlesMovementAlias) .Where(() => bottlesMovementAlias.DeliveryPoint == null) .Where(() => bottlesMovementAlias.Counterparty.Id == order.Client.Id) .Select( Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Int32, "( ?2 - ?1 )"), NHibernateUtil.Int32, new IProjection[] { Projections.Sum(() => bottlesMovementAlias.Returned), Projections.Sum(() => bottlesMovementAlias.Delivered) } )).SingleOrDefault <int>(); if (counterpartyDebtQuery != 0) { return(false); } //Долг по точкам доставки foreach (var deliveryPoint in order.Client.DeliveryPoints) { if (bottlesRepository.GetBottlesDebtAtDeliveryPoint(order.UoW, deliveryPoint) != 0) { return(false); } } //Возврат бутылей и(ничего или возврат залога или неустойка) var orders1 = order.UoW.Session.QueryOver(() => orderAlias) .Where(() => orderAlias.Client.Id == order.Client.Id) .Where(() => orderAlias.OrderStatus == OrderStatus.Closed) .Where(() => orderAlias.BottlesReturn != 0) .List <Order>(); if (orders1.Count == 0) { return(false); } var orders2 = new List <Order>(); foreach (var o in orders1) { if (o.OrderDepositItems != null && o.OrderItems == null) { orders2.Add(o); } if (o.OrderItems.All(i => i.Nomenclature.Id == forfeitId)) { orders2.Add(o); } if (o.OrderItems == null) { orders2.Add(o); } } if (orders2.Count == 0) { return(false); } //Ввод остатков foreach (var o in orders2) { if (o.DeliveryPoint == null) { continue; } if (o.DeliveryPoint.HaveResidue.HasValue) { if (!o.DeliveryPoint.HaveResidue.Value) { return(false); } } } return(true); }