示例#1
0
        public static QueryOver <Equipment, Equipment> AvailableEquipmentQuery()
        {
            Vodovoz.Domain.Orders.Order orderAlias = null;
            Equipment equipmentAlias = null;
            WarehouseMovementOperation operationAddAlias   = null;
            OrderEquipment             orderEquipmentAlias = null;

            var equipmentInStockCriterion = Subqueries.IsNotNull(
                QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                .OrderBy(() => operationAddAlias.OperationTime).Desc
                .Where(() => equipmentAlias.Id == operationAddAlias.Equipment.Id)
                .Select(op => op.IncomingWarehouse)
                .Take(1).DetachedCriteria
                );

            var subqueryAllReservedEquipment = QueryOver.Of <Vodovoz.Domain.Orders.Order>(() => orderAlias)
                                               .Where(() => orderAlias.OrderStatus == OrderStatus.Accepted ||
                                                      orderAlias.OrderStatus == OrderStatus.InTravelList ||
                                                      orderAlias.OrderStatus == OrderStatus.OnLoading) // чтобы не добавить в доп соглашение оборудование добавленное в уже созданный заказ.
                                               .JoinAlias(() => orderAlias.OrderEquipments, () => orderEquipmentAlias)
                                               .Where(() => orderEquipmentAlias.Direction == Direction.Deliver)
                                               .Select(Projections.Property(() => orderEquipmentAlias.Equipment.Id));

            return(QueryOver.Of <Equipment>(() => equipmentAlias)
                   .Where(equipmentInStockCriterion)
                   .Where(e => e.AssignedToClient == null)
                   .WithSubquery.WhereProperty(() => equipmentAlias.Id).NotIn(subqueryAllReservedEquipment));
        }
示例#2
0
        public static Dictionary <int, decimal> EquipmentInStock(IUnitOfWork UoW, int warehouseId, int[] equipmentIds)
        {
            Equipment equipmentAlias = null;
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;

            var subqueryAdd = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                              .Where(() => operationAddAlias.Equipment.Id == equipmentAlias.Id)
                              .And(Restrictions.Eq(Projections.Property <WarehouseMovementOperation>(o => o.IncomingWarehouse.Id), warehouseId))
                              .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            var subqueryRemove = QueryOver.Of <WarehouseMovementOperation>(() => operationRemoveAlias)
                                 .Where(() => operationRemoveAlias.Equipment.Id == equipmentAlias.Id)
                                 .And(Restrictions.Eq(Projections.Property <WarehouseMovementOperation>(o => o.WriteoffWarehouse.Id), warehouseId))
                                 .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            ItemInStock inStock   = null;
            var         stocklist = UoW.Session.QueryOver <Equipment>(() => equipmentAlias)
                                    .Where(() => equipmentAlias.Id.IsIn(equipmentIds))
                                    .SelectList(list => list
                                                .SelectGroup(() => equipmentAlias.Id).WithAlias(() => inStock.Id)
                                                .SelectSubQuery(subqueryAdd).WithAlias(() => inStock.Added)
                                                .SelectSubQuery(subqueryRemove).WithAlias(() => inStock.Removed)
                                                ).TransformUsing(Transformers.AliasToBean <ItemInStock>()).List <ItemInStock>();
            var result = new Dictionary <int, decimal>();

            foreach (var nomenclatureInStock in stocklist)
            {
                result.Add(nomenclatureInStock.Id, nomenclatureInStock.Amount);
            }

            return(result);
        }
示例#3
0
        public static int GetStockForNomenclature(IUnitOfWork uow, int nomenclatureId)
        {
            Nomenclature nomenclatureAlias = null;
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;

            var subqueryAdd = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                              .Where(() => operationAddAlias.Nomenclature.Id == nomenclatureAlias.Id)
                              .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));


            var subqueryRemove = QueryOver.Of <WarehouseMovementOperation>(() => operationRemoveAlias)
                                 .Where(() => operationRemoveAlias.Nomenclature.Id == nomenclatureAlias.Id)
                                 .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            var amountProjection = Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Int32, "( ?1 - ?2 )"),
                                                           NHibernateUtil.Int32, new IProjection[] {
                Projections.SubQuery(subqueryAdd),
                Projections.SubQuery(subqueryRemove)
            }
                                                           );

            ItemInStock inStock     = null;
            var         queryResult = uow.Session.QueryOver <Nomenclature>(() => nomenclatureAlias)
                                      .Where(() => nomenclatureAlias.Id == nomenclatureId)
                                      .SelectList(list => list
                                                  .SelectGroup(() => nomenclatureAlias.Id)
                                                  .Select(amountProjection)
                                                  ).SingleOrDefault <object[]>();

            return((int)queryResult[1]);
        }
示例#4
0
        public Dictionary <int, decimal> NomenclatureInStock(IUnitOfWork uow, int[] nomenclatureIds, int?warehouseId = null, DateTime?onDate = null)
        {
            Nomenclature nomenclatureAlias = null;
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;

            var subqueryAdd = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                              .Where(() => operationAddAlias.Nomenclature.Id == nomenclatureAlias.Id);

            if (onDate.HasValue)
            {
                subqueryAdd.Where(x => x.OperationTime < onDate.Value);
            }

            if (warehouseId.HasValue)
            {
                subqueryAdd.And(() => operationAddAlias.IncomingWarehouse.Id == warehouseId);
            }
            else
            {
                subqueryAdd.And(() => operationAddAlias.IncomingWarehouse != null);
            }
            subqueryAdd.Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            var subqueryRemove = QueryOver.Of <WarehouseMovementOperation>(() => operationRemoveAlias)
                                 .Where(() => operationRemoveAlias.Nomenclature.Id == nomenclatureAlias.Id);

            if (onDate.HasValue)
            {
                subqueryRemove.Where(x => x.OperationTime < onDate.Value);
            }

            if (warehouseId.HasValue)
            {
                subqueryRemove.And(() => operationRemoveAlias.WriteoffWarehouse.Id == warehouseId);
            }
            else
            {
                subqueryRemove.And(() => operationRemoveAlias.WriteoffWarehouse != null);
            }
            subqueryRemove.Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            ItemInStock inStock   = null;
            var         stocklist = uow.Session.QueryOver <Nomenclature>(() => nomenclatureAlias)
                                    .Where(() => nomenclatureAlias.Id.IsIn(nomenclatureIds))
                                    .SelectList(list => list
                                                .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => inStock.Id)
                                                .SelectSubQuery(subqueryAdd).WithAlias(() => inStock.Added)
                                                .SelectSubQuery(subqueryRemove).WithAlias(() => inStock.Removed)
                                                ).TransformUsing(Transformers.AliasToBean <ItemInStock>()).List <ItemInStock>();
            var result = new Dictionary <int, decimal>();

            foreach (var nomenclatureInStock in stocklist)
            {
                result.Add(nomenclatureInStock.Id, nomenclatureInStock.Amount);
            }

            return(result);
        }
示例#5
0
        /// <summary>
        /// Запрос выбирающий количество добавленное на склад, отгруженное со склада
        /// и зарезервированное в заказах каждой номенклатуры по выбранному типу оборудования
        /// </summary>
        public static QueryOver <Nomenclature, Nomenclature> QueryAvailableNonSerialEquipmentForRent(EquipmentType type)
        {
            Nomenclature nomenclatureAlias = null;
            WarehouseMovementOperation operationAddAlias = null;

            //Подзапрос выбирающий по номенклатуре количество добавленное на склад
            var subqueryAdded = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                                .Where(() => operationAddAlias.Nomenclature.Id == nomenclatureAlias.Id)
                                .Where(Restrictions.IsNotNull(Projections.Property <WarehouseMovementOperation>(o => o.IncomingWarehouse)))
                                .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            //Подзапрос выбирающий по номенклатуре количество отгруженное со склада
            var subqueryRemoved = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                                  .Where(() => operationAddAlias.Nomenclature.Id == nomenclatureAlias.Id)
                                  .Where(Restrictions.IsNotNull(Projections.Property <WarehouseMovementOperation>(o => o.WriteoffWarehouse)))
                                  .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            //Подзапрос выбирающий по номенклатуре количество зарезервированное в заказах до отгрузки со склада
            Vodovoz.Domain.Orders.Order localOrderAlias = null;
            OrderEquipment localOrderEquipmentAlias     = null;
            Equipment      localEquipmentAlias          = null;
            var            subqueryReserved             = QueryOver.Of <Vodovoz.Domain.Orders.Order>(() => localOrderAlias)
                                                          .JoinAlias(() => localOrderAlias.OrderEquipments, () => localOrderEquipmentAlias)
                                                          .JoinAlias(() => localOrderEquipmentAlias.Equipment, () => localEquipmentAlias)
                                                          .Where(() => localEquipmentAlias.Nomenclature.Id == nomenclatureAlias.Id)
                                                          .Where(() => localOrderEquipmentAlias.Direction == Direction.Deliver)
                                                          .Where(() => localOrderAlias.OrderStatus == OrderStatus.Accepted ||
                                                                 localOrderAlias.OrderStatus == OrderStatus.InTravelList ||
                                                                 localOrderAlias.OrderStatus == OrderStatus.OnLoading)
                                                          .Select(Projections.Sum(() => localOrderEquipmentAlias.Count));

            NomenclatureForRentVMNode resultAlias   = null;
            MeasurementUnits          unitAlias     = null;
            EquipmentType             equipmentType = null;

            //Запрос выбирающий количество добавленное на склад, отгруженное со склада
            //и зарезервированное в заказах каждой номенклатуры по выбранному типу оборудования
            var query = QueryOver.Of <Nomenclature>(() => nomenclatureAlias)
                        .JoinAlias(() => nomenclatureAlias.Unit, () => unitAlias)
                        .JoinAlias(() => nomenclatureAlias.Type, () => equipmentType);

            if (type != null)
            {
                query = query.Where(() => nomenclatureAlias.Type.Id == type.Id);
            }

            query = query.SelectList(list => list
                                     .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.Id)
                                     .Select(() => equipmentType.Id).WithAlias(() => resultAlias.TypeId)
                                     .Select(() => unitAlias.Name).WithAlias(() => resultAlias.UnitName)
                                     .Select(() => unitAlias.Digits).WithAlias(() => resultAlias.UnitDigits)
                                     .SelectSubQuery(subqueryAdded).WithAlias(() => resultAlias.Added)
                                     .SelectSubQuery(subqueryRemoved).WithAlias(() => resultAlias.Removed)
                                     .SelectSubQuery(subqueryReserved).WithAlias(() => resultAlias.Reserved)
                                     )
                    .TransformUsing(Transformers.AliasToBean <NomenclatureForRentVMNode>());
            return(query);
        }
 public virtual void CreateOperation(Warehouse warehouseSrc, DateTime time)
 {
     ConsumptionMaterialOperation = new WarehouseMovementOperation {
         WriteoffWarehouse = warehouseSrc,
         Amount            = Amount,
         OperationTime     = time,
         Nomenclature      = Nomenclature
     };
 }
示例#7
0
 public virtual void CreateOperation(Warehouse warehouse, DateTime time)
 {
     WarehouseMovementOperation = new WarehouseMovementOperation
     {
         WriteoffWarehouse = warehouse,
         Amount            = Amount,
         OperationTime     = time,
         Nomenclature      = Nomenclature,
         Equipment         = Equipment
     };
 }
示例#8
0
        public int BottlesUnloadedByCarUnloadedDocuments(IUnitOfWork uow, int emptyBottleId, int routeListId, params int[] exceptDocumentIds)
        {
            WarehouseMovementOperation movementOperationAlias = null;

            var returnableQuery = OrderItemsReturnedToAllWarehouses(uow, routeListId, emptyBottleId).GetExecutableQueryOver(uow.Session);
            var result          = returnableQuery.WhereNot(x => x.Id.IsIn(exceptDocumentIds))
                                  .SelectList(list => list.SelectSum(() => movementOperationAlias.Amount))
                                  .SingleOrDefault <decimal>()
            ;

            return((int)result);
        }
示例#9
0
        public static IList <Equipment> GetEquipmentUnloadedTo(IUnitOfWork uow, RouteList routeList)
        {
            CarUnloadDocumentItem      unloadItemAlias = null;
            WarehouseMovementOperation operationAlias  = null;
            Equipment equipmentAlias            = null;
            var       unloadedEquipmentIdsQuery = QueryOver.Of <CarUnloadDocument>().Where(doc => doc.RouteList.Id == routeList.Id)
                                                  .JoinAlias(doc => doc.Items, () => unloadItemAlias)
                                                  .JoinAlias(() => unloadItemAlias.WarehouseMovementOperation, () => operationAlias)
                                                  .JoinAlias(() => operationAlias.Equipment, () => equipmentAlias)
                                                  .Select(op => equipmentAlias.Id);

            return(uow.Session.QueryOver <Equipment>(() => equipmentAlias).WithSubquery.WhereProperty(() => equipmentAlias.Id).In(unloadedEquipmentIdsQuery).List());
        }
示例#10
0
        public override void UpdateNodes()
        {
            Nomenclature               nomenclatureAlias    = null;
            EquipmentType              equipmentTypeAlias   = null;
            NomenclatureForSaleVMNode  resultAlias          = null;
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;

            Vodovoz.Domain.Orders.Order orderAlias = null;
            OrderEquipment orderEquipmentAlias     = null;
            Equipment      equipmentAlias          = null;

            var subqueryAdded = QueryOver.Of <WarehouseMovementOperation> (() => operationAddAlias)
                                .JoinAlias(() => operationAddAlias.Nomenclature, () => nomenclatureAlias)
                                .Where(() => nomenclatureAlias.Type.Id == equipmentTypeAlias.Id)
                                .Where(Restrictions.IsNotNull(Projections.Property <WarehouseMovementOperation> (o => o.IncomingWarehouse)))
                                .Select(Projections.Sum <WarehouseMovementOperation> (o => o.Amount));

            var subqueryRemoved = QueryOver.Of <WarehouseMovementOperation>(() => operationRemoveAlias)
                                  .JoinAlias(() => operationRemoveAlias.Nomenclature, () => nomenclatureAlias)
                                  .Where(() => nomenclatureAlias.Type.Id == equipmentTypeAlias.Id)
                                  .Where(Restrictions.IsNotNull(Projections.Property <WarehouseMovementOperation> (o => o.WriteoffWarehouse)))
                                  .Select(Projections.Sum <WarehouseMovementOperation> (o => o.Amount));

            var subqueryReserved = QueryOver.Of <Vodovoz.Domain.Orders.Order> (() => orderAlias)
                                   .JoinAlias(() => orderAlias.OrderEquipments, () => orderEquipmentAlias)
                                   .JoinAlias(() => orderEquipmentAlias.Equipment, () => equipmentAlias)
                                   .JoinAlias(() => equipmentAlias.Nomenclature, () => nomenclatureAlias)
                                   .Where(() => nomenclatureAlias.Type.Id == equipmentTypeAlias.Id)
                                   .Where(() => orderEquipmentAlias.Direction == Direction.Deliver)
                                   .Where(() => orderAlias.OrderStatus == OrderStatus.Accepted ||
                                          orderAlias.OrderStatus == OrderStatus.InTravelList ||
                                          orderAlias.OrderStatus == OrderStatus.OnLoading)
                                   .Select(Projections.Count(() => orderEquipmentAlias.Id));

            var equipment = UoW.Session.QueryOver <EquipmentType>(() => equipmentTypeAlias)
                            .SelectList(list => list
                                        .SelectGroup(() => equipmentTypeAlias.Id).WithAlias(() => resultAlias.Id)
                                        .Select(() => equipmentTypeAlias.Name).WithAlias(() => resultAlias.Name)
                                        .SelectSubQuery(subqueryAdded).WithAlias(() => resultAlias.Added)
                                        .SelectSubQuery(subqueryRemoved).WithAlias(() => resultAlias.Removed)
                                        .SelectSubQuery(subqueryReserved).WithAlias(() => resultAlias.Reserved)
                                        )
                            .TransformUsing(Transformers.AliasToBean <EquipmentTypesForRentVMNode>())
                            .List <EquipmentTypesForRentVMNode>();

            SetItemsSource(equipment);
        }
示例#11
0
        public decimal UnloadedTerminalAmount(IUnitOfWork uow, int routelistId, int terminalId)
        {
            CarUnloadDocument          docAlias      = null;
            CarUnloadDocumentItem      docItemsAlias = null;
            WarehouseMovementOperation warehouseMovementOperationAlias = null;

            var query = uow.Session.QueryOver(() => docAlias)
                        .JoinAlias(d => d.Items, () => docItemsAlias)
                        .JoinAlias(() => docItemsAlias.WarehouseMovementOperation, () => warehouseMovementOperationAlias)
                        .Where(() => docAlias.RouteList.Id == routelistId)
                        .And(() => warehouseMovementOperationAlias.Nomenclature.Id == terminalId)
                        .Select(Projections.Sum(() => warehouseMovementOperationAlias.Amount))
                        .SingleOrDefault <decimal>();

            return(query);
        }
 public virtual void CreateOperation(Warehouse warehouse, DateTime time)
 {
     WarehouseWriteOffOperation = new WarehouseMovementOperation
     {
         WriteoffWarehouse = warehouse,
         Amount            = Amount,
         OperationTime     = time,
         Nomenclature      = NomenclatureOld
     };
     WarehouseIncomeOperation = new WarehouseMovementOperation
     {
         IncomingWarehouse = warehouse,
         Amount            = Amount,
         OperationTime     = time,
         Nomenclature      = NomenclatureNew
     };
 }
示例#13
0
        public Dictionary <int, decimal> NomenclatureUnloaded(IUnitOfWork UoW, RouteList routeList, Warehouse warehouse, CarUnloadDocument excludeDoc)
        {
            CarUnloadDocument          docAlias               = null;
            CarUnloadDocumentItem      docItemsAlias          = null;
            WarehouseMovementOperation movementOperationAlias = null;

            var unloadedlist = UoW.Session.QueryOver <CarUnloadDocument>(() => docAlias)
                               .Where(d => d.RouteList.Id == routeList.Id)
                               .Where(d => d.Warehouse.Id == warehouse.Id)
                               .Where(d => d.Id != excludeDoc.Id)
                               .JoinAlias(d => d.Items, () => docItemsAlias)
                               .JoinAlias(() => docItemsAlias.WarehouseMovementOperation, () => movementOperationAlias)
                               .SelectList(list => list
                                           .SelectGroup(() => movementOperationAlias.Nomenclature.Id)
                                           .SelectSum(() => movementOperationAlias.Amount)
                                           ).List <object[]>();

            return(unloadedlist.ToDictionary(r => (int)r[0], r => (decimal)r[1]));
        }
示例#14
0
        public bool CanAddFlyerToOrder(
            IUnitOfWork uow, IRouteListParametersProvider routeListParametersProvider, int flyerId, int geographicGroupId)
        {
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;
            VodovozOrder   orderAlias          = null;
            DeliveryPoint  deliveryPointAlias  = null;
            District       districtAlias       = null;
            OrderEquipment orderEquipmentAlias = null;

            var warehouseId = geographicGroupId == routeListParametersProvider.SouthGeographicGroupId
                                ? routeListParametersProvider.WarehouseSofiiskayaId
                                : routeListParametersProvider.WarehouseParnasId;

            var subqueryAdded = uow.Session.QueryOver(() => operationAddAlias)
                                .Where(() => operationAddAlias.Nomenclature.Id == flyerId)
                                .Where(Restrictions.IsNotNull(Projections.Property <WarehouseMovementOperation>(o => o.IncomingWarehouse)))
                                .Where(o => o.IncomingWarehouse.Id == warehouseId)
                                .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount))
                                .SingleOrDefault <decimal>();

            var subqueryRemoved = uow.Session.QueryOver(() => operationRemoveAlias)
                                  .Where(() => operationRemoveAlias.Nomenclature.Id == flyerId)
                                  .Where(Restrictions.IsNotNull(Projections.Property <WarehouseMovementOperation>(o => o.WriteoffWarehouse)))
                                  .Where(o => o.WriteoffWarehouse.Id == warehouseId)
                                  .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount))
                                  .SingleOrDefault <decimal>();

            var subqueryReserved = uow.Session.QueryOver(() => orderAlias)
                                   .JoinAlias(() => orderAlias.OrderEquipments, () => orderEquipmentAlias)
                                   .JoinAlias(() => orderAlias.DeliveryPoint, () => deliveryPointAlias)
                                   .JoinAlias(() => deliveryPointAlias.District, () => districtAlias)
                                   .Where(() => orderEquipmentAlias.Nomenclature.Id == flyerId)
                                   .Where(() => districtAlias.GeographicGroup.Id == geographicGroupId)
                                   .Where(() => orderAlias.OrderStatus == OrderStatus.NewOrder ||
                                          orderAlias.OrderStatus == OrderStatus.Accepted ||
                                          orderAlias.OrderStatus == OrderStatus.InTravelList ||
                                          orderAlias.OrderStatus == OrderStatus.OnLoading)
                                   .Select(Projections.Sum(() => orderEquipmentAlias.Count))
                                   .SingleOrDefault <int>();

            return(subqueryAdded - subqueryRemoved - subqueryReserved > 0);
        }
示例#15
0
        public override void CreateMovementOperations(Warehouse writeoffWarehouse, Nomenclature terminal)
        {
            WarehouseMovementOperation = new WarehouseMovementOperation
            {
                WriteoffWarehouse = writeoffWarehouse,
                IncomingWarehouse = null,
                Amount            = 1,
                Equipment         = null,
                Nomenclature      = terminal,
                OperationTime     = CreationDate
            };

            EmployeeNomenclatureMovementOperation = new EmployeeNomenclatureMovementOperation
            {
                Amount        = 1,
                Employee      = Driver,
                Nomenclature  = terminal,
                OperationTime = CreationDate
            };
        }
示例#16
0
        public QueryOver <CarUnloadDocument> OrderItemsReturnedToAllWarehouses(IUnitOfWork uow, int routeListId, params int[] nomenclatureIds)
        {
            List <ReturnsNode>         result                 = new List <ReturnsNode>();
            Nomenclature               nomenclatureAlias      = null;
            CarUnloadDocumentItem      carUnloadItemsAlias    = null;
            WarehouseMovementOperation movementOperationAlias = null;
            CarUnloadDocument          carUnloadAlias         = null;



            var returnableQuery = QueryOver.Of <CarUnloadDocument>()
                                  .Where(doc => doc.RouteList.Id == routeListId)
                                  .JoinAlias(doc => doc.Items, () => carUnloadItemsAlias)
                                  .JoinAlias(() => carUnloadItemsAlias.WarehouseMovementOperation, () => movementOperationAlias)
                                  .Where(Restrictions.IsNotNull(Projections.Property(() => movementOperationAlias.IncomingWarehouse)))
                                  .JoinAlias(() => movementOperationAlias.Nomenclature, () => nomenclatureAlias)
                                  .Where(() => !nomenclatureAlias.IsSerial)
                                  .Where(() => nomenclatureAlias.Id.IsIn(nomenclatureIds));

            return(returnableQuery);
        }
示例#17
0
        public IEnumerable <NomanclatureStockNode> GetWarehouseNomenclatureStock(IUnitOfWork uow, int warehouseId, IEnumerable <int> nomenclatureIds)
        {
            NomanclatureStockNode      resultAlias        = null;
            Nomenclature               nomenclatureAlias  = null;
            WarehouseMovementOperation warehouseOperation = null;

            IProjection incomeAmount = Projections.Sum(
                Projections.Conditional(
                    Restrictions.Eq(Projections.Property(() => warehouseOperation.IncomingWarehouse.Id), warehouseId),
                    Projections.Property(() => warehouseOperation.Amount),
                    Projections.Constant(0M)
                    )
                );

            IProjection writeoffAmount = Projections.Sum(
                Projections.Conditional(
                    Restrictions.Eq(Projections.Property(() => warehouseOperation.WriteoffWarehouse.Id), warehouseId),
                    Projections.Property(() => warehouseOperation.Amount),
                    Projections.Constant(0M)
                    )
                );

            IProjection stockProjection = Projections.SqlFunction(new SQLFunctionTemplate(NHibernateUtil.Decimal, "( IFNULL(?1, 0) - IFNULL(?2, 0) )"),
                                                                  NHibernateUtil.Int32,
                                                                  incomeAmount,
                                                                  writeoffAmount
                                                                  );

            return(uow.Session.QueryOver(() => warehouseOperation)
                   .Left.JoinAlias(() => warehouseOperation.Nomenclature, () => nomenclatureAlias)
                   .Where(Restrictions.In(Projections.Property(() => warehouseOperation.Nomenclature.Id), nomenclatureIds.ToArray()))
                   .SelectList(list => list
                               .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.NomenclatureId)
                               .Select(stockProjection).WithAlias(() => resultAlias.Stock)
                               )
                   .TransformUsing(Transformers.AliasToBean <NomanclatureStockNode>())
                   .List <NomanclatureStockNode>());
        }
示例#18
0
 public virtual void CreateOperation(Warehouse warehouse, DateTime time)
 {
     if (Difference < 0)
     {
         WarehouseChangeOperation = new WarehouseMovementOperation
         {
             WriteoffWarehouse = warehouse,
             Amount            = Math.Abs(Difference),
             OperationTime     = time,
             Nomenclature      = Nomenclature
         };
     }
     if (Difference > 0)
     {
         WarehouseChangeOperation = new WarehouseMovementOperation
         {
             IncomingWarehouse = warehouse,
             Amount            = Math.Abs(Difference),
             OperationTime     = time,
             Nomenclature      = Nomenclature
         };
     }
 }
示例#19
0
        public List <ReturnsNode> GetReturnsToWarehouse(IUnitOfWork uow, int routeListId, NomenclatureCategory[] categories = null, int[] excludeNomenclatureIds = null)
        {
            Nomenclature               nomenclatureAlias      = null;
            ReturnsNode                resultAlias            = null;
            CarUnloadDocumentItem      carUnloadItemsAlias    = null;
            WarehouseMovementOperation movementOperationAlias = null;

            var returnableQuery = uow.Session.QueryOver <CarUnloadDocument>().Where(doc => doc.RouteList.Id == routeListId)
                                  .JoinAlias(doc => doc.Items, () => carUnloadItemsAlias)
                                  .JoinAlias(() => carUnloadItemsAlias.WarehouseMovementOperation, () => movementOperationAlias)
                                  .Where(Restrictions.IsNotNull(Projections.Property(() => movementOperationAlias.IncomingWarehouse)))
                                  .JoinAlias(() => movementOperationAlias.Nomenclature, () => nomenclatureAlias)
                                  .Where(() => !nomenclatureAlias.IsSerial);

            if (categories != null)
            {
                returnableQuery.Where(() => nomenclatureAlias.Category.IsIn(categories));
            }

            if (excludeNomenclatureIds != null)
            {
                returnableQuery.Where(() => !nomenclatureAlias.Id.IsIn(excludeNomenclatureIds));
            }

            var result = returnableQuery.SelectList(list => list
                                                    .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.NomenclatureId)
                                                    .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.Name)
                                                    .Select(() => false).WithAlias(() => resultAlias.Trackable)
                                                    .Select(() => nomenclatureAlias.Category).WithAlias(() => resultAlias.NomenclatureCategory)
                                                    .SelectSum(() => movementOperationAlias.Amount).WithAlias(() => resultAlias.Amount))
                         .TransformUsing(Transformers.AliasToBean <ReturnsNode>())
                         .List <ReturnsNode>();

            DomainHelper.FillPropertyByEntity <ReturnsNode, Nomenclature>(uow, result, x => x.NomenclatureId, (node, nom) => node.Nomenclature = nom);
            return(result.ToList());
        }
示例#20
0
        public static IList <MovementWagon> UsedWagonsByPeriod(IUnitOfWork uow, DateTime start, DateTime end, Warehouse warehouse)
        {
            WarehouseMovementOperation shipOpAlias    = null;
            WarehouseMovementOperation deliverOpAlias = null;
            MovementDocumentItem       itemAlias      = null;
            MovementDocument           docAlias       = null;
            MovementWagon wagonAlias = null;

            end = end.Date.AddDays(1);

            var docSubqery = QueryOver.Of <MovementDocument>(() => docAlias)
                             .JoinAlias(d => d.Items, () => itemAlias)
                             .JoinAlias(() => itemAlias.WarehouseWriteoffOperation, () => shipOpAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                             .JoinAlias(() => itemAlias.WarehouseIncomeOperation, () => deliverOpAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                             .Where(d => d.MovementWagon.Id == wagonAlias.Id)
                             .Where(() => ((shipOpAlias.IncomingWarehouse == warehouse || shipOpAlias.WriteoffWarehouse == warehouse) &&
                                           shipOpAlias.OperationTime >= start && shipOpAlias.OperationTime < end) ||
                                    ((deliverOpAlias.IncomingWarehouse == warehouse || deliverOpAlias.WriteoffWarehouse == warehouse) &&
                                     deliverOpAlias.OperationTime >= start && deliverOpAlias.OperationTime < end))
                             .Select(d => d.Id);

            return(uow.Session.QueryOver <MovementWagon>(() => wagonAlias)
                   .WithSubquery.WhereExists(docSubqery).List());
        }
 public virtual void CreateOperation(Warehouse warehouse, DateTime time)
 {
     if(Difference < 0)
     {
         WarehouseChangeOperation = new WarehouseMovementOperation
             {
                 WriteoffWarehouse = warehouse,
                 Amount = Math.Abs(Difference),
                 OperationTime = time,
                 Nomenclature = Nomenclature
             };
     }
     if(Difference > 0)
     {
         WarehouseChangeOperation = new WarehouseMovementOperation
             {
                 IncomingWarehouse = warehouse,
                 Amount = Math.Abs(Difference),
                 OperationTime = time,
                 Nomenclature = Nomenclature
             };
     }
 }
 public virtual void CreateOperation(Warehouse warehouseSrc, DateTime time)
 {
     ConsumptionMaterialOperation = new WarehouseMovementOperation
         {
             WriteoffWarehouse = warehouseSrc,
             Amount = Amount,
             OperationTime = time,
             Nomenclature = Nomenclature
         };
 }
 /// <summary>
 /// Создание операции доставки при транспортировке
 /// </summary>
 public virtual void CreateOperation(Warehouse warehouseDst, DateTime deliveredTime)
 {
     DeliveryMovementOperation = new WarehouseMovementOperation
         {
             IncomingWarehouse = warehouseDst,
             Amount = Amount,
             OperationTime = deliveredTime,
             Nomenclature = Nomenclature,
             Equipment = Equipment
         };
     WarehouseMovementOperation.IncomingWarehouse = null;
 }
 public virtual void CreateOperation(Warehouse warehouseSrc, Warehouse warehouseDst, DateTime time, TransportationStatus status)
 {
     CounterpartyMovementOperation = null;
     WarehouseMovementOperation = new WarehouseMovementOperation
         {
             WriteoffWarehouse = warehouseSrc,
             IncomingWarehouse = status == TransportationStatus.WithoutTransportation ?  warehouseDst : null,
             Amount = Amount,
             OperationTime = time,
             Nomenclature = Nomenclature,
             Equipment = Equipment
         };
     if (status == TransportationStatus.Delivered)
         CreateOperation(warehouseDst, Document.DeliveredTime.Value);
 }
 public virtual void CreateOperation(Counterparty counterpartySrc, DeliveryPoint pointSrc, Counterparty counterpartyDst, DeliveryPoint pointDst, DateTime time)
 {
     WarehouseMovementOperation = null;
     CounterpartyMovementOperation = new CounterpartyMovementOperation
         {
             IncomingCounterparty = counterpartyDst,
             IncomingDeliveryPoint = pointDst,
             WriteoffCounterparty = counterpartySrc,
             WriteoffDeliveryPoint = pointSrc,
             Amount = Amount,
             OperationTime = time,
             Nomenclature = Nomenclature,
             Equipment = Equipment
         };
 }
 public virtual void CreateOperation(Warehouse warehouse, DateTime time)
 {
     WarehouseMovementOperation = new WarehouseMovementOperation
         {
             IncomingWarehouse = warehouse,
             Amount = Amount,
             OperationTime = time,
             Nomenclature = Nomenclature,
             Equipment = Equipment
         };
 }
示例#27
0
        public static Dictionary <int, decimal> NomenclatureInStock(
            IUnitOfWork UoW, int warehouseId,
            int[] nomenclaturesToInclude,
            int[] nomenclaturesToExclude,
            string[] nomenclatureTypeToInclude,
            string[] nomenclatureTypeToExclude,
            int[] productGroupToInclude,
            int[] productGroupToExclude,
            DateTime?onDate = null)
        {
            Nomenclature nomenclatureAlias                  = null;
            Nomenclature nomenclatureAddOperationAlias      = null;
            Nomenclature nomenclatureRemoveOperationAlias   = null;
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;

            var subqueryAdd = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                              .JoinAlias(() => operationAddAlias.Nomenclature, () => nomenclatureAddOperationAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                              .Where(() => operationAddAlias.Nomenclature.Id == nomenclatureAlias.Id);

            if (nomenclatureTypeToInclude.Length > 0)
            {
                List <NomenclatureCategory> parsedCategories = new List <NomenclatureCategory>();
                foreach (var categoryName in nomenclatureTypeToInclude)
                {
                    parsedCategories.Add((NomenclatureCategory)Enum.Parse(typeof(NomenclatureCategory), categoryName));
                }
                subqueryAdd = subqueryAdd.Where(() => nomenclatureAddOperationAlias.Category.IsIn(parsedCategories));
            }
            if (productGroupToInclude != null && productGroupToInclude.Any())
            {
                subqueryAdd = subqueryAdd.Where(() => nomenclatureAddOperationAlias.ProductGroup.Id.IsIn(productGroupToInclude));
            }
            if (nomenclaturesToInclude != null && nomenclaturesToInclude.Any())
            {
                subqueryAdd = subqueryAdd.Where(() => nomenclatureAddOperationAlias.Id.IsIn(nomenclaturesToInclude));
            }
            if (nomenclatureTypeToExclude.Length > 0)
            {
                List <NomenclatureCategory> parsedCategories = new List <NomenclatureCategory>();
                foreach (var categoryName in nomenclatureTypeToExclude)
                {
                    parsedCategories.Add((NomenclatureCategory)Enum.Parse(typeof(NomenclatureCategory), categoryName));
                }
                subqueryAdd = subqueryAdd.Where(() => nomenclatureAddOperationAlias.Category.IsIn(parsedCategories));
            }
            if (productGroupToExclude != null && productGroupToExclude.Any())
            {
                subqueryAdd = subqueryAdd.Where(() => nomenclatureAddOperationAlias.ProductGroup.IsIn(productGroupToExclude));
            }
            if (nomenclaturesToExclude != null && nomenclaturesToExclude.Any())
            {
                subqueryAdd = subqueryAdd.Where(() => nomenclatureAddOperationAlias.Id.IsIn(nomenclaturesToExclude));
            }

            if (onDate.HasValue)
            {
                subqueryAdd = subqueryAdd.Where(x => x.OperationTime < onDate.Value);
            }
            subqueryAdd.And(Restrictions.Eq(Projections.Property <WarehouseMovementOperation>(o => o.IncomingWarehouse.Id), warehouseId))
            .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            var subqueryRemove = QueryOver.Of(() => operationRemoveAlias)
                                 .JoinAlias(() => operationRemoveAlias.Nomenclature, () => nomenclatureRemoveOperationAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                 .Where(() => operationRemoveAlias.Nomenclature.Id == nomenclatureAlias.Id);

            if (nomenclatureTypeToInclude.Length > 0)
            {
                List <NomenclatureCategory> parsedCategories = new List <NomenclatureCategory>();
                foreach (var categoryName in nomenclatureTypeToInclude)
                {
                    parsedCategories.Add((NomenclatureCategory)Enum.Parse(typeof(NomenclatureCategory), categoryName));
                }
                subqueryRemove = subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.Category.IsIn(parsedCategories));
            }
            if (productGroupToInclude != null && productGroupToInclude.Any())
            {
                subqueryRemove = subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.ProductGroup.Id.IsIn(productGroupToInclude));
            }
            if (nomenclaturesToInclude != null && nomenclaturesToInclude.Any())
            {
                subqueryRemove = subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.Id.IsIn(nomenclaturesToInclude));
            }
            if (nomenclatureTypeToExclude.Length > 0)
            {
                List <NomenclatureCategory> parsedCategories = new List <NomenclatureCategory>();
                foreach (var categoryName in nomenclatureTypeToExclude)
                {
                    parsedCategories.Add((NomenclatureCategory)Enum.Parse(typeof(NomenclatureCategory), categoryName));
                }
                subqueryRemove = subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.Category.IsIn(parsedCategories));
            }
            if (productGroupToExclude != null && productGroupToExclude.Any())
            {
                subqueryRemove = subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.ProductGroup.IsIn(productGroupToExclude));
            }
            if (nomenclaturesToExclude != null && nomenclaturesToExclude.Any())
            {
                subqueryRemove = subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.Id.IsIn(nomenclaturesToExclude));
            }

            if (onDate.HasValue)
            {
                subqueryRemove = subqueryRemove.Where(x => x.OperationTime < onDate.Value);
            }
            subqueryRemove.And(Restrictions.Eq(Projections.Property <WarehouseMovementOperation>(o => o.WriteoffWarehouse.Id), warehouseId))
            .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            ItemInStock inStock   = null;
            var         stocklist = UoW.Session.QueryOver <Nomenclature>(() => nomenclatureAlias)
                                    .SelectList(list => list
                                                .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => inStock.Id)
                                                .SelectSubQuery(subqueryAdd).WithAlias(() => inStock.Added)
                                                .SelectSubQuery(subqueryRemove).WithAlias(() => inStock.Removed)
                                                ).TransformUsing(Transformers.AliasToBean <ItemInStock>()).List <ItemInStock>();

            var result = new Dictionary <int, decimal>();

            foreach (var nomenclatureInStock in stocklist.Where(x => x.Amount != 0))
            {
                result.Add(nomenclatureInStock.Id, nomenclatureInStock.Amount);
            }

            return(result);
        }
示例#28
0
        public Dictionary <int, decimal> NomenclatureInStock(IUnitOfWork uow, int warehouseId, DateTime?onDate = null, NomenclatureCategory?nomenclatureCategory = null, ProductGroup nomenclatureType = null, Nomenclature nomenclature = null)
        {
            Nomenclature nomenclatureAlias                  = null;
            Nomenclature nomenclatureAddOperationAlias      = null;
            Nomenclature nomenclatureRemoveOperationAlias   = null;
            WarehouseMovementOperation operationAddAlias    = null;
            WarehouseMovementOperation operationRemoveAlias = null;

            var subqueryAdd = QueryOver.Of <WarehouseMovementOperation>(() => operationAddAlias)
                              .JoinAlias(() => operationAddAlias.Nomenclature, () => nomenclatureAddOperationAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                              .Where(() => operationAddAlias.Nomenclature.Id == nomenclatureAlias.Id);

            if (nomenclatureCategory != null)
            {
                subqueryAdd.Where(() => nomenclatureAddOperationAlias.Category == nomenclatureCategory.Value);
            }

            if (nomenclatureType != null)
            {
                subqueryAdd.Where(() => nomenclatureAddOperationAlias.ProductGroup.Id == nomenclatureType.Id);
            }

            if (nomenclature != null)
            {
                subqueryAdd.Where(() => nomenclatureAddOperationAlias.Id == nomenclature.Id);
            }

            if (onDate.HasValue)
            {
                subqueryAdd.Where(x => x.OperationTime < onDate.Value);
            }

            subqueryAdd.And(Restrictions.Eq(Projections.Property <WarehouseMovementOperation>(o => o.IncomingWarehouse.Id), warehouseId))
            .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            var subqueryRemove = QueryOver.Of(() => operationRemoveAlias)
                                 .JoinAlias(() => operationRemoveAlias.Nomenclature, () => nomenclatureRemoveOperationAlias, NHibernate.SqlCommand.JoinType.LeftOuterJoin)
                                 .Where(() => operationRemoveAlias.Nomenclature.Id == nomenclatureAlias.Id);

            if (nomenclatureCategory != null)
            {
                subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.Category == nomenclatureCategory.Value);
            }

            if (nomenclatureType != null)
            {
                subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.ProductGroup == nomenclatureType);
            }

            if (nomenclature != null)
            {
                subqueryRemove.Where(() => nomenclatureRemoveOperationAlias.Id == nomenclature.Id);
            }

            if (onDate.HasValue)
            {
                subqueryRemove.Where(x => x.OperationTime < onDate.Value);
            }

            subqueryRemove.And(Restrictions.Eq(Projections.Property <WarehouseMovementOperation>(o => o.WriteoffWarehouse.Id), warehouseId))
            .Select(Projections.Sum <WarehouseMovementOperation>(o => o.Amount));

            ItemInStock inStock = null;

            var stocklist = uow.Session.QueryOver <Nomenclature>(() => nomenclatureAlias)
                            .SelectList(list => list
                                        .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => inStock.Id)
                                        .SelectSubQuery(subqueryAdd).WithAlias(() => inStock.Added)
                                        .SelectSubQuery(subqueryRemove).WithAlias(() => inStock.Removed)
                                        ).TransformUsing(Transformers.AliasToBean <ItemInStock>()).List <ItemInStock>();

            var result = new Dictionary <int, decimal>();

            foreach (var nomenclatureInStock in stocklist.Where(x => x.Amount != 0))
            {
                result.Add(nomenclatureInStock.Id, nomenclatureInStock.Amount);
            }

            return(result);
        }
示例#29
0
        /// <summary>
        /// Возвращает список товаров возвращенного на склад по номенклатурам
        /// </summary>
        public List <ReturnsNode> GetReturnsToWarehouse(IUnitOfWork uow, int routeListId, params int[] nomenclatureIds)
        {
            List <ReturnsNode>         result                 = new List <ReturnsNode>();
            Nomenclature               nomenclatureAlias      = null;
            ReturnsNode                resultAlias            = null;
            Equipment                  equipmentAlias         = null;
            CarUnloadDocument          carUnloadAlias         = null;
            CarUnloadDocumentItem      carUnloadItemsAlias    = null;
            WarehouseMovementOperation movementOperationAlias = null;

            var returnableQuery = QueryOver.Of <CarUnloadDocument>(() => carUnloadAlias)
                                  .JoinAlias(() => carUnloadAlias.Items, () => carUnloadItemsAlias)
                                  .JoinAlias(() => carUnloadItemsAlias.WarehouseMovementOperation, () => movementOperationAlias)
                                  .JoinAlias(() => movementOperationAlias.Nomenclature, () => nomenclatureAlias)
                                  .Where(Restrictions.IsNotNull(Projections.Property(() => movementOperationAlias.IncomingWarehouse)))
                                  .Where(() => !nomenclatureAlias.IsSerial)
                                  .Where(() => carUnloadAlias.RouteList.Id == routeListId)
                                  .Where(() => nomenclatureAlias.Id.IsIn(nomenclatureIds))
                                  .GetExecutableQueryOver(uow.Session);

            var returnableItems = returnableQuery.SelectList
                                  (
                list => list.SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.NomenclatureId)
                .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.Name)
                .Select(() => false).WithAlias(() => resultAlias.Trackable)
                .Select(() => nomenclatureAlias.Category).WithAlias(() => resultAlias.NomenclatureCategory)
                .Select(() => carUnloadItemsAlias.DefectSource).WithAlias(() => resultAlias.DefectSource)
                .SelectSum(() => movementOperationAlias.Amount).WithAlias(() => resultAlias.Amount)
                                  )
                                  .TransformUsing(Transformers.AliasToBean <ReturnsNode>())
                                  .List <ReturnsNode>();

            var returnableQueryEquipment = uow.Session.QueryOver <CarUnloadDocument>(() => carUnloadAlias)
                                           .JoinAlias(() => carUnloadAlias.Items, () => carUnloadItemsAlias)
                                           .JoinAlias(() => carUnloadItemsAlias.WarehouseMovementOperation, () => movementOperationAlias)
                                           .JoinAlias(() => movementOperationAlias.Equipment, () => equipmentAlias)
                                           .JoinAlias(() => equipmentAlias.Nomenclature, () => nomenclatureAlias)
                                           .Where(Restrictions.IsNotNull(Projections.Property(() => movementOperationAlias.IncomingWarehouse)))
                                           .Where(() => carUnloadAlias.RouteList.Id == routeListId)
                                           .Where(() => nomenclatureAlias.Id.IsIn(nomenclatureIds))
            ;


            var returnableEquipment =
                returnableQueryEquipment.SelectList(list => list
                                                    .Select(() => equipmentAlias.Id).WithAlias(() => resultAlias.Id)
                                                    .SelectGroup(() => nomenclatureAlias.Id).WithAlias(() => resultAlias.NomenclatureId)
                                                    .Select(() => nomenclatureAlias.Name).WithAlias(() => resultAlias.Name)
                                                    .Select(() => nomenclatureAlias.IsSerial).WithAlias(() => resultAlias.Trackable)
                                                    .Select(() => nomenclatureAlias.Category).WithAlias(() => resultAlias.NomenclatureCategory)
                                                    .SelectSum(() => movementOperationAlias.Amount).WithAlias(() => resultAlias.Amount)
                                                    .Select(() => nomenclatureAlias.Type).WithAlias(() => resultAlias.EquipmentType)
                                                    .Select(() => carUnloadItemsAlias.DefectSource).WithAlias(() => resultAlias.DefectSource)
                                                    )
                .TransformUsing(Transformers.AliasToBean <ReturnsNode>())
                .List <ReturnsNode>();

            result.AddRange(returnableItems);
            result.AddRange(returnableEquipment);
            DomainHelper.FillPropertyByEntity <ReturnsNode, Nomenclature>(uow, result, x => x.NomenclatureId, (node, nom) => node.Nomenclature = nom);
            return(result);
        }