コード例 #1
0
        public async Task <bool> DeleteFile([FromBody] int fileId)
        {
            using (var context = new DB_A12601_bielkaContext())
            {
                DocumentFiles fileEntity = context.DocumentFiles.FirstOrDefault(d => d.DcfId == fileId);


                if (fileEntity == null)
                {
                    return(true);
                }

                string filePath = _env.WebRootPath + fileEntity.DcfUrl;
                if (System.IO.File.Exists(filePath))
                {
                    System.IO.File.Delete(filePath);
                }


                context.DocumentFiles.Remove(fileEntity);
                await context.SaveChangesAsync();

                return(true);
            }
        }
コード例 #2
0
        public IEnumerable <EmployeeDto> GetAllEmployees()
        {
            var user = _userManager.FindByIdAsync(User.GetUserId());

            var roles  = _userManager.GetRolesAsync(user.Result);
            var ffdsfd = roles.Result;

            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                var employees = context.Employees.Where(e => e.EmpAuditRd == null)
                                .GroupJoin(context.IdentityDocuments.Where(d => d.IdcAuditRd == null), e => e.EmpId, d => d.IdcEmpId,
                                           (e, d) => new { employee = e, documents = d })

                                .ToList()
                                .Select(e => new EmployeeDto(e.employee, e.documents, new List <DocumentFiles>())
                {
                    CreateDate = e.employee.EmpAuditCd ?? DateTime.Now
                })
                                .ToList();

                var employeesIds      = employees.Select(e => e.Id).ToArray();
                var emploeesPositions = context.EmploymentRequests.Where(
                    r => r.EtrAuditRd == null && r.EtrStatus == 1 && employeesIds.Contains(r.EtrEmpId))
                                        .LeftJoin(context.Offers, r => r.EtrOfrId, o => o.OfrId, (r, o) => new { r.EtrEmpId, o.OfrPosition })
                                        .ToLookup(e => e.EtrEmpId, e => e.OfrPosition);

                foreach (var employee in employees)
                {
                    employee.Position = emploeesPositions.FirstOrDefault(p => p.Key == employee.Id)?.FirstOrDefault();
                }

                return(employees);
            }
        }
コード例 #3
0
        public bool DeleteEmploymentRequest([FromBody] EmploymentRequestDto employmentRequestDto)
        {
            try
            {
                using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
                {
                    EmploymentRequests employmentRequest =
                        context.EmploymentRequests.FirstOrDefault(e => e.EtrOfrId == employmentRequestDto.OfferId && e.EtrEmpId == employmentRequestDto.EmployeeId && e.EtrAuditRd == null);

                    if (employmentRequest == null)
                    {
                        return(false);
                    }

                    employmentRequest.EtrAuditRd = DateTime.UtcNow;
                    employmentRequest.EtrAuditRu = User.GetUserId();

                    context.SaveChanges();
                }

                return(true);
            }
            catch (Exception)
            {
                //todo: add logging
                return(false);
            }
        }
コード例 #4
0
        public EventDetailsDto SaveEvent([FromBody] EventDto eventdto)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Notes eventEntity = context.Notes.FirstOrDefault(n => n.NotId == eventdto.Id);
                if (eventEntity == null)
                {
                    eventEntity = new Notes()
                    {
                        NotAuditCd = DateTime.Now,
                        NotAuditCu = User.GetUserId(),
                        NotId      = eventdto.Id
                    };

                    context.Notes.Add(eventEntity);
                }

                eventEntity.NotAuditMd = DateTime.Now;
                eventEntity.NotAuditMu = User.GetUserId();

                eventEntity.NotCltId      = eventdto.ClientId;
                eventEntity.NotCtgId      = eventdto.ContragentId;
                eventEntity.NotEmp        = eventdto.EmployeeId;
                eventEntity.NotEndDate    = eventdto.EndDate;
                eventEntity.NotRemindDate = eventdto.RemindDate;
                eventEntity.NotStartDate  = eventdto.StartDate;
                eventEntity.NotSubject    = eventdto.Subject;
                eventEntity.NotTargetUser = eventdto.TargetUser;
                eventEntity.NotText       = eventdto.NoteText;

                context.SaveChanges();
            }

            return(GetEvent(eventdto));
        }
コード例 #5
0
        private void TimerCallBack(object state)
        {
            try
            {
                using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
                {
                    var eventsToRemind = context.Notes.Where(n =>
                                                             n.NotAuditRd == null && n.NotReminded != true && n.NotRemindDate != null &&
                                                             n.NotRemindDate < DateTime.Now).ToList();

                    var userEmails = context.AspNetUsers.Where(u => !u.Deleted).ToDictionary(u => u.Id, u => u.Email);

                    foreach (Notes @event in eventsToRemind)
                    {
                        var emails = userEmails.Where(u => u.Key == @event.NotTargetUser || u.Key == @event.NotAuditCu)
                                     .Select(u => u.Value)
                                     .ToList();

                        SendNotification(@event, emails);
                        @event.NotReminded = true;
                    }

                    context.SaveChangesAsync();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
コード例 #6
0
        public List <UserDto> GetResponsibleUsersList()
        {
            using (var context = new DB_A12601_bielkaContext())
            {
                var users = context.AspNetUserRoles.Where(r => r.Role.Name != SUPER_ADMIN_ROLE_NAME && r.Role.Name != ACCOUNTING_ROLE_NAME && r.Role.Name != CONTAGENT_ROLE_NAME).
                            Join(context.AspNetUsers.Where(u => !u.Deleted),
                                 r => r.UserId,
                                 u => u.Id,
                                 (role, user) => new
                {
                    RoleName = role.Role.Name,
                    User     = user,
                }).ToList().
                            Select(us => new UserDto
                {
                    Id       = us.User.Id,
                    UserName = us.User.UserName,
                    Email    = us.User.Email,
                    CtgId    = us.User.ContragentId,
                    Name     = us.User.FullName,
                    UserRole = us.RoleName
                }).ToList();

                return(users);
            }
        }
コード例 #7
0
 public List <EventDto> GetEvents()
 {
     using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
     {
         var eventsEntities = context.Notes.Where(n => n.NotAuditRd == null).ToList();
         return(eventsEntities.Select(e => new EventDto(e)).ToList());
     }
 }
コード例 #8
0
        public DocumentFilesDto UploadFiles(IFormFile file, string name, string description, int ownerId, string ownerType)
        {
            try
            {
                if (file == null)
                {
                    return(new DocumentFilesDto
                    {
                        Success = false,
                        ErrorMessage = "File is not selected"
                    });
                }

                string fileName = SaveFile(file);

                using (var context = new DB_A12601_bielkaContext())
                {
                    DocumentFiles fileEntity = new DocumentFiles
                    {
                        DcfUrl         = fileName,
                        DcfAuditCd     = DateTime.UtcNow,
                        DcfAuditCu     = User.GetUserId(),
                        DcfAuditMd     = DateTime.UtcNow,
                        DcfAuditMu     = User.GetUserId(),
                        DcfName        = name ?? string.Empty,
                        DcfDescription = description ?? string.Empty,
                    };

                    switch (ownerType)
                    {
                    case "contragent":
                        fileEntity.DcfCntId = ownerId;
                        break;

                    case "client":
                        fileEntity.DcfCliId = ownerId;
                        break;

                    case "offer":
                        fileEntity.DcfOfrId = ownerId;
                        break;
                    }

                    context.Add(fileEntity);
                    context.SaveChanges();
                    return(new DocumentFilesDto(fileEntity));
                }
            }
            catch (Exception ex)
            {
                return(new DocumentFilesDto
                {
                    Success = false,
                    ErrorMessage = ex.Message
                });
            }
        }
コード例 #9
0
        public IEnumerable <EmployeeDto> GetAllEmployeesLite()
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                var employees = context.Employees.Where(e => e.EmpAuditRd == null)
                                .ToList()
                                .Select(e => new EmployeeDto(e))
                                .ToList();

                return(employees);
            }
        }
コード例 #10
0
        public IEnumerable <OfferDto> GetClientOffers(int clientId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                List <OfferDto> offers = context.Offers.Where(o => o.OfrCltId == clientId &&
                                                              o.OfrAuditRd == null)
                                         .Select(o => new OfferDto(o))
                                         .ToList();

                return(offers);
            }
        }
コード例 #11
0
        public IEnumerable <ClientDto> GetClientsListLite()
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                List <ClientDto> clients = context.Clients
                                           .Where(c => c.CltAuditRd == null)
                                           .ToList()
                                           .Select(c => new ClientDto(c))
                                           .ToList();

                return(clients);
            }
        }
コード例 #12
0
        public bool ChangeUserLanguage([FromBody] UsersToContragentsDto utc)
        {
            using (var context = new DB_A12601_bielkaContext())
            {
                var data = context.AspNetUsers.FirstOrDefault(u => u.Id == utc.UsrId);

                data.LanguageCode = utc.PrefLng;

                context.SaveChanges();
            }

            return(true);
        }
コード例 #13
0
        public IEnumerable <OfferDto> GetOffersList()
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                List <OfferDto> offers = context.Offers.Where(o => o.OfrAuditRd == null).ToList()
                                         .Select(o => new OfferDto(o))
                                         .ToList();

                foreach (var offer in offers)
                {
                    offer.AcceptedCount = context.EmploymentRequests.Count(er => er.EtrOfrId == offer.Id && er.EtrAuditRd == null && er.EtrStatus == 1);
                }

                return(offers);
            }
        }
コード例 #14
0
        public List <EventDto> GetMyEvents()
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                string userId = User.GetUserId();

                DateTime from = DateTime.Today;
                DateTime to   = DateTime.Today.AddDays(1);

                var latestEvents = context.Notes.Where(n => n.NotAuditRd == null && (n.NotAuditCu == userId || n.NotTargetUser == userId) &&
                                                       (n.NotRemindDate >= from && n.NotRemindDate <= to ||
                                                        n.NotStartDate >= from && n.NotStartDate <= to)).ToList();

                return(latestEvents.Select(e => new EventDto(e)).ToList());
            }
        }
コード例 #15
0
        public List <IdentityDocumentsDto> GetIdentityDocuments([FromBody] int employeeId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                List <IdentityDocumentsDto> documents =
                    context.IdentityDocuments
                    .Where(i => i.IdcAuditRd == null && i.IdcEmpId == employeeId)
                    .GroupJoin(context.DocumentFiles, d => d.IdcId, f => f.DcfIdcId,
                               (d, f) => new { doc = d, files = f })
                    .ToList()
                    .Select(d => new IdentityDocumentsDto(d.doc, d.files))
                    .ToList();

                return(documents);
            }
        }
コード例 #16
0
        private Contragent CreateContragent(string name)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Contragent contragent = new Contragent
                {
                    CgtAuditCu       = User.GetUserId(),
                    CgtName          = name,
                    CgtStatus        = "a",
                    CgtLicenseNumber = string.Empty
                };

                IRepository <Contragent> contragentsRepository = new ContragentsRepository();
                contragentsRepository.Save(contragent);
                return(contragent);
            }
        }
コード例 #17
0
        public bool DeleteEvent([FromBody] EventDto eventdto)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Notes eventEntity = context.Notes.FirstOrDefault(n => n.NotId == eventdto.Id);
                if (eventEntity == null)
                {
                    return(false);
                }

                eventEntity.NotAuditRd = DateTime.Now;
                eventEntity.NotAuditRu = User.GetUserId();

                context.SaveChanges();
                return(true);
            }
        }
コード例 #18
0
        public ContactPersonDto SaveContactPerson([FromBody] ContactPersonDto contactPerson)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                ContactPersons ctp;
                if (contactPerson.Id != 0)
                {
                    ctp = context.ContactPersons.FirstOrDefault(c => c.CtpId == contactPerson.Id);
                }
                else
                {
                    ctp = new ContactPersons
                    {
                        CtpAuditCd = DateTime.UtcNow,
                        CtpAuditCu = User.GetUserId()
                    };
                    context.ContactPersons.Add(ctp);
                }

                if (ctp == null)
                {
                    return(null);
                }


                ctp.CtpCgtId         = contactPerson.ContragentId;
                ctp.CtpCltId         = contactPerson.ClientId;
                ctp.CtpEmail         = contactPerson.Email;
                ctp.CtpMessanger     = contactPerson.Messanger;
                ctp.CtpName          = contactPerson.Name;
                ctp.CtpPhoneNumber   = contactPerson.PhoneNumber;
                ctp.CtpPosition      = contactPerson.Position;
                ctp.CtpSurname       = contactPerson.Surname;
                ctp.CtpSkype         = contactPerson.Skype;
                ctp.CtpAuditMd       = DateTime.UtcNow;
                ctp.CtpAuditMu       = User.GetUserId();
                ctp.CtpMessangerType = contactPerson.MessangerType;


                context.SaveChanges();
                contactPerson.Id = ctp.CtpId;

                return(contactPerson);
            }
        }
コード例 #19
0
        public bool DeleteIdDocumentFile([FromBody] int fileId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                DocumentFiles docFile = context.DocumentFiles.FirstOrDefault(c => c.DcfId == fileId);

                if (docFile == null)
                {
                    return(false);
                }

                docFile.DcfAuditRd = DateTime.UtcNow;
                docFile.DcfAuditRu = User.GetUserId();
                context.SaveChanges();

                return(true);
            }
        }
コード例 #20
0
        public bool DeleteIdentityDocument([FromBody] int documentId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                IdentityDocuments doc = context.IdentityDocuments.FirstOrDefault(c => c.IdcId == documentId);

                if (doc == null)
                {
                    return(false);
                }

                doc.IdcAuditRd = DateTime.UtcNow;
                doc.IdcAuditRu = User.GetUserId();
                context.SaveChanges();

                return(true);
            }
        }
コード例 #21
0
        public bool DeleteEmployee([FromBody] int employeeId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Employees emp = context.Employees.FirstOrDefault(c => c.EmpId == employeeId);

                if (emp == null)
                {
                    return(false);
                }

                emp.EmpAuditRd = DateTime.UtcNow;
                emp.EmpAuditRu = User.GetUserId();
                context.SaveChanges();

                return(true);
            }
        }
コード例 #22
0
        public bool DeleteAddress([FromBody] int addressId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Addresses adr = context.Addresses.FirstOrDefault(c => c.AdrId == addressId);

                if (adr == null)
                {
                    return(false);
                }

                adr.AdrAuditRd = DateTime.UtcNow;
                adr.AdrAduitRu = User.GetUserId();
                context.SaveChanges();

                return(true);
            }
        }
コード例 #23
0
        public IEnumerable <EmployeeDto> GetEmployeesByCtg([FromBody] string ctgId)
        {
            var user = _userManager.FindByIdAsync(User.GetUserId());

            var roles  = _userManager.GetRolesAsync(user.Result);
            var ffdsfd = roles.Result;

            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                var employees = context.Employees.Where(e => e.EmpAuditRd == null && e.EmpCtgId == Int32.Parse(ctgId))
                                .GroupJoin(context.IdentityDocuments.Where(d => d.IdcAuditRd == null), e => e.EmpId, d => d.IdcEmpId,
                                           (e, d) => new { employee = e, documents = d })
                                .ToList()
                                .Select(e => new EmployeeDto(e.employee, e.documents, new List <DocumentFiles>()))
                                .ToList();

                return(employees);
            }
        }
コード例 #24
0
        public bool DeleteContactPerson([FromBody] int contactPersonId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                ContactPersons ctp = context.ContactPersons.FirstOrDefault(c => c.CtpId == contactPersonId);

                if (ctp == null)
                {
                    return(false);
                }

                ctp.CtpAuditRd = DateTime.UtcNow;
                ctp.CtpAuditRu = User.GetUserId();

                context.SaveChanges();

                return(true);
            }
        }
コード例 #25
0
        public ClientDto GetClient(int clientId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                var clientEntity      = context.Clients.FirstOrDefault(c => c.CltAuditRd == null && c.CltId == clientId);
                var addresses         = context.Addresses.Where(a => a.AdrAuditRd == null && clientId == a.ArdCltId).ToList();
                var contactPersons    = context.ContactPersons.Where(a => a.CtpAuditRd == null && clientId == a.CtpCltId).ToList();
                var offers            = context.Offers.Where(o => o.OfrAuditRd == null && clientId == o.OfrCltId).ToList();
                var acceptedEmployees = context.Employees.Where(e => e.EmpAuditRd == null && e.EmpCltId != null && clientId == e.EmpCltId).ToList();
                var files             = context.DocumentFiles.Where(f => f.DcfAuditRd == null && clientId == f.DcfCliId).ToList();
                var notes             = context.Notes.Where(n => n.NotAuditRd == null && n.NotCltId == clientId).LeftJoin(context.AspNetUsers,
                                                                                                                          n => n.NotAuditCu, u => u.Id, (n, u) => new
                {
                    Note = n, UserData = u
                }).ToList();

                ClientDto client = new ClientDto(clientEntity, addresses, contactPersons, offers,
                                                 acceptedEmployees, files)
                {
                    FreeVacancies     = 0,
                    AwaitingVacancies = 0,
                    BusyVacancies     = 0,
                    Notes             = notes.Select(n => new EventDetailsDto(n.Note)
                    {
                        TargetUserName = n.UserData.FullName,
                        TargetUser     = n.UserData.Id
                    }).ToList()
                };

                foreach (var offer in client.Offers)
                {
                    offer.AcceptedCount       = context.EmploymentRequests.Count(er => er.EtrOfrId == offer.Id && er.EtrAuditRd == null && er.EtrStatus == 1);
                    offer.AwaitingCount       = context.EmploymentRequests.Count(er => er.EtrOfrId == offer.Id && er.EtrAuditRd == null && er.EtrStatus == 0);
                    client.FreeVacancies     += offer.VacanciesNumber - offer.AcceptedCount;
                    client.AwaitingVacancies += offer.AwaitingCount;
                    client.BusyVacancies     += offer.AcceptedCount;
                }


                return(client);
            }
        }
コード例 #26
0
        public bool DeleteOffer([FromBody] int offerId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Offer ofr = context.Offers.FirstOrDefault(c => c.OfrId == offerId);


                if (ofr == null)
                {
                    return(false);
                }

                ofr.OfrAuditRd = DateTime.UtcNow;
                ofr.OfrAuditRu = User.GetUserId();

                context.SaveChanges();

                return(true);
            }
        }
コード例 #27
0
        public bool DeleteClient([FromBody] int clientId)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Clients clt = context.Clients.FirstOrDefault(c => c.CltId == clientId);


                if (clt == null)
                {
                    return(false);
                }

                clt.CltAuditRd = DateTime.UtcNow;
                clt.CltAuditRu = User.GetUserId();

                context.SaveChanges();

                return(true);
            }
        }
コード例 #28
0
        public IEnumerable <ClientDto> GetClientsList()
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                List <ClientDto> clients = context.Clients
                                           .Where(c => c.CltAuditRd == null)
                                           .GroupJoin(context.Addresses.Where(a => a.AdrAuditRd == null), c => c.CltId, a => a.ArdCltId,
                                                      (c, a) => new { Client = c, Addresses = a })
                                           .GroupJoin(context.Offers.Where(o => o.OfrAuditRd == null), c => c.Client.CltId, o => o.OfrCltId,
                                                      (c, o) => new { c.Client, c.Addresses, Offers = o })
                                           .GroupJoin(context.Employees.Where(e => e.EmpAuditRd == null && e.EmpCltId != null),
                                                      c => c.Client.CltId, e => e.EmpCltId,
                                                      (c, e) => new { c.Client, c.Addresses, c.Offers, AcceptedEmployees = e })
                                           .ToList()
                                           .Select(
                    c =>
                    new ClientDto(c.Client, c.Addresses, null, c.Offers, c.AcceptedEmployees, null))
                                           .ToList();

                var offerIds = clients.SelectMany(c => c.Offers.Select(o => o.Id).ToArray()).Distinct().ToList();
                var requests = context.EmploymentRequests.Where(e => offerIds.Contains(e.EtrOfrId)).ToList();

                foreach (var client in clients)
                {
                    client.FreeVacancies     = 0;
                    client.AwaitingVacancies = 0;
                    client.BusyVacancies     = 0;

                    foreach (var offer in client.Offers)
                    {
                        offer.AcceptedCount       = requests.Count(er => er.EtrOfrId == offer.Id && er.EtrAuditRd == null && er.EtrStatus == 1);
                        offer.AwaitingCount       = requests.Count(er => er.EtrOfrId == offer.Id && er.EtrAuditRd == null && er.EtrStatus == 0);
                        client.FreeVacancies     += offer.VacanciesNumber - offer.AcceptedCount;
                        client.AwaitingVacancies += offer.AwaitingCount;
                        client.BusyVacancies     += offer.AcceptedCount;
                    }
                }

                return(clients);
            }
        }
コード例 #29
0
        public EmployeeDto SaveEmployee([FromBody] EmployeeDto employee)
        {
            using (DB_A12601_bielkaContext context = new DB_A12601_bielkaContext())
            {
                Employees emp;
                if (employee.Id != 0)
                {
                    emp = context.Employees.FirstOrDefault(c => c.EmpId == employee.Id);
                }
                else
                {
                    emp = new Employees
                    {
                        EmpAuditCd = DateTime.UtcNow,
                        EmpAuditCu = User.GetUserId()
                    };
                    context.Employees.Add(emp);
                }

                if (emp == null)
                {
                    return(null);
                }

                emp.EmpBirthDate       = employee.BirthDate.Date.AddDays(1);
                emp.EmpCtgId           = employee.ContragentId;
                emp.EmpDescription     = employee.Description;
                emp.EmpFirstName       = employee.FirstName;
                emp.EmpLastName        = employee.LastName ?? string.Empty;
                emp.EmpMiddleName      = employee.MiddleName;
                emp.EmpResponsibleUser = employee.ResponsibleUser;
                emp.EmpAuditMu         = User.GetUserId();
                emp.EmpAuditMd         = DateTime.UtcNow;
                emp.EmpStatus          = employee.Status;

                context.SaveChanges();
                employee.Id = emp.EmpId;

                return(employee);
            }
        }
コード例 #30
0
        public async Task <DataTransferObjectBase> DeleteUser([FromBody] UserDto user)
        {
            using (var context = new DB_A12601_bielkaContext())
            {
                var userEntity = context.AspNetUsers.FirstOrDefault(u => u.Id == user.Id);

                if (userEntity == null)
                {
                    return(new DataTransferObjectBase
                    {
                        Success = false,
                        ErrorMessage = "User is not found"
                    });
                }

                userEntity.Deleted = true;
                await context.SaveChangesAsync();

                return(new DataTransferObjectBase());
            }
        }