/// <summary> /// 그룹 정보 조회를 위한 <see cref="QueryOver"/>를 빌드합니다. /// </summary> /// <param name="company"></param> /// <param name="code"></param> /// <param name="kind"></param> /// <param name="name"></param> /// <param name="isActive"></param> /// <returns></returns> public static QueryOver<Group, Group> BuildQueryOverOfGroup(Company company, string code = null, GroupKinds? kind = null, string name = null, bool? isActive = null) { if(IsDebugEnabled) log.Debug(@"그룹 정보 조회를 위한 QueryOver 를 빌드합니다... company={0}, code={1} kind={2}, name={3}, isActive={4}", company, code, kind, name, isActive); var query = QueryOver.Of<Group>(); if(company != null) query.AddWhere(g => g.Company == company); if(code.IsNotWhiteSpace()) query.AddWhere(g => g.Code == code); if(kind.HasValue) query.AddWhere(g => g.Kind == kind.Value); if(name.IsNotWhiteSpace()) query.AddWhere(g => g.Name == name); if(isActive.HasValue) query.AddNullAsTrue(g => g.IsActive, isActive); return query; }
/// <summary> /// 즐겨찾기를 위한 질의 객체 (<see cref="DetachedCriteria"/>)를 빌드합니다. /// </summary> /// <param name="product">지정된 제품, null이면 검색조건에서 제외합니다.</param> /// <param name="company">지정된 회사, null이면 검색조건에서 제외합니다.</param> /// <param name="ownerCode">소유자 코드, null이면 검색조건에서 제외합니다.</param> /// <param name="ownerKind">소유자 종류, <see cref="ActorKinds.Unknown"/>이면 검색조건에서 제외합니다.</param> /// <param name="registerCode">등록자 코드</param> /// <param name="registTimeRange">등록일 검색 범위</param> /// <returns></returns> public virtual QueryOver<Favorite, Favorite> BuildQueryOverOfFavorite(Product product, Company company, string ownerCode, ActorKinds? ownerKind = null, string registerCode = null, ITimePeriod registTimeRange = null) { if(IsDebugEnabled) log.Debug(@"즐겨찾기 조회를 위한 QueryOver를 생성합니다... " + @"company={0}, product={1}, ownerCode={2}, ownerKind={3}, registerCode={4}, registTimeRange={5}", company, product, ownerCode, ownerKind, registerCode, registTimeRange); var query = QueryOver.Of<Favorite>(); if(product != null) query.AddWhere(f => f.ProductCode == product.Code); if(company != null) query.AddWhere(f => f.CompanyCode == company.Code); if(ownerCode.IsNotWhiteSpace()) query.AddWhere(f => f.OwnerCode == ownerCode); if(ownerKind.HasValue) query.AddWhere(f => f.OwnerKind == ownerKind.Value); if(registerCode.IsNotWhiteSpace()) query.AddWhere(f => f.RegisterCode == registerCode); if(registTimeRange != null && registTimeRange.IsAnytime == false) query.AddBetween(f => f.RegistDate, registTimeRange.StartAsNullable, registTimeRange.EndAsNullable); return query; }
/// <summary> /// 그룹 정보 조회를 위한 <see cref="DetachedCriteria"/>를 빌드합니다. /// </summary> public static DetachedCriteria BuildCriteriaOfGroup(Company company, string code = null, GroupKinds? kind = null, string name = null, bool? isActive = null) { return BuildQueryOverOfGroup(company, code, kind, name, isActive).DetachedCriteria; }
/// <summary> /// 사원 직책 정보를 생성합니다. /// </summary> /// <param name="company"></param> /// <param name="code"></param> /// <param name="name"></param> /// <returns></returns> public EmployeeTitle CreateEmployeeTitle(Company company, string code, string name) { var title = new EmployeeTitle(company, code) {Name = name}; if(IsDebugEnabled) log.Debug("새로운 EmployeeTitle을 생성합니다... " + title); return Repository<EmployeeTitle>.SaveOrUpdate(title); }
/// <summary> /// 사원 직위 정보를 생성합니다. /// </summary> /// <param name="company"></param> /// <param name="code"></param> /// <param name="name"></param> /// <returns></returns> public EmployeePosition CreateEmployeePosition(Company company, string code, string name) { var position = new EmployeePosition(company, code) {Name = name}; if(IsDebugEnabled) log.Debug("새로운 EmployeePosition를 생성합니다... " + position); return Repository<EmployeePosition>.SaveOrUpdate(position); }
/// <summary> /// 새로운 직급 정보를 생성합니다. /// </summary> public EmployeeGrade CreateEmployeeGrade(Company company, string code, string name) { var grade = new EmployeeGrade(company, code) {Name = name}; if(IsDebugEnabled) log.Debug(@"새로운 직급 정보를 생성합니다... " + grade); return Repository<EmployeeGrade>.SaveOrUpdate(grade); }
/// <summary> /// 지정한 Company 정보를 삭제합니다. /// </summary> /// <param name="company"></param> public void DeleteCompany(Company company) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug(@"Company를 삭제합니다... company=" + company); DeleteEntityTransactional(company); if(log.IsInfoEnabled) log.Info(@"Company를 삭제했습니다!!! company=" + company); }
/// <summary> /// 사용자 로그인 계정 정보로 사용자를 인증합니다. /// </summary> /// <param name="company"></param> /// <param name="loginId"></param> /// <param name="password"></param> /// <returns></returns> public bool AuthenticateUser(Company company, string loginId, string password) { company.ShouldNotBeNull("company"); loginId.ShouldNotBeWhiteSpace("loginId"); // password.ShouldNotBeWhiteSpace("password"); if(log.IsDebugEnabled) log.Debug(@"사용자 인증을 실시합니다... companyId={0}, loginId={1}, password={2}", company.Id, loginId, password); return BuildQueryableOfUser(company, loginId, password).Any(); //return NAccessContext.Linq.Users.Any(u => u.Company == company && // u.LoginId == loginId && // u.Password == password); }
/// <summary> /// 사용자 (<see cref="User"/>) 정보를 조회하기 위한 IQueryable{User} 를 빌드합니다. /// </summary> public IQueryable<User> BuildQueryableOfUser(Company company, string loginId, string password = null) { var query = Repository<User>.Session.Query<User>(); if(company != null) query = query.AddWhere(u => u.Company == company); if(loginId.IsNotWhiteSpace()) query = query.AddWhere(u => u.LoginId == loginId); if(password.IsNotWhiteSpace()) query = query.AddWhere(u => u.Password == password); return query; }
/// <summary> /// 지정된 회사의 모든 사원 직급 정보를 가져옵니다. /// </summary> public IList<EmployeeGrade> FindAllEmployeeGradeByCompany(Company company, int? firstResult, int? maxResults, params INHOrder<EmployeeGrade>[] orders) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug(@"사원 직급 정보(EmployeeGrade)를 조회합니다. company=" + company); var query = QueryOver.Of<EmployeeGrade>() .AddWhere(g => g.Company == company) .AddOrders(orders); return Repository<EmployeeGrade>.FindAll(query, firstResult.GetValueOrDefault(), maxResults.GetValueOrDefault()); }
/// <summary> /// 사용자 (<see cref="User"/>) 정보를 조회하기 위한 IQueryable{User} 를 빌드합니다. /// </summary> public IQueryable<User> BuildQueryableOfUser(Company company, Department department = null, string code = null, string name = null, int? kind = null, string loginId = null, string password = null, string empNo = null) { var query = Repository<User>.Session.Query<User>(); if(company != null) query = query.AddWhere(u => u.Company == company); if(department != null) { var userInDepts = NAccessContext.Linq.DepartmentMembers .Where(m => m.Department == department) .Select(m => m.User.Id) .Distinct() .ToList(); query = query.AddWhere(u => userInDepts.Contains(u.Id)); } if(code.IsNotWhiteSpace()) query = query.AddWhere(u => u.Code == code); if(name.IsNotWhiteSpace()) query = query.AddWhere(u => u.Name == name); if(kind.HasValue) query = query.AddWhere(u => u.Kind == kind.Value); if(loginId.IsNotWhiteSpace()) query = query.AddWhere(u => u.LoginId == loginId); if(password.IsNotWhiteSpace()) query = query.AddWhere(u => u.Password == password); if(empNo.IsNotWhiteSpace()) query = query.AddWhere(u => u.EmpNo == empNo); return query; }
/// <summary> /// 로그인 정보를 가진 사용자 정보를 로드합니다. /// </summary> /// <param name="company"></param> /// <param name="loginId"></param> /// <param name="password"></param> /// <returns>반환되는 User 정보가 있다면, 로그인 성공, 없다면 비밀번호가 틀렸다는 의미이다.</returns> public User FindOneUserByLogin(Company company, string loginId, string password) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug("사용자 계정으로 검색을 실시합니다... company.Code={0}, loginId={1}, password={2}", company.Code, loginId, password); var query = QueryOver.Of<User>() .AddWhere(u => u.Company == company) .AddWhere(u => u.LoginId == loginId); if(password.IsNotEmpty()) query.AddWhere(u => u.Password == password); return Repository<User>.FindOne(query); }
/// <summary> /// 지정한 회사의 사원 정보를 로드합니다. 만약 없다면, 새로 생성해서 저장한 후 로드 합니다. (그냥 Load 시에는 <see cref="FindOneUserByCode"/>로 호출하시기 바랍니다. /// </summary> public User GetOrCreateUser(Company company, string code) { company.ShouldNotBeNull("company"); code.ShouldNotBeWhiteSpace("code"); var user = FindOneUserByCode(company, code); if(user != null) return user; if(IsDebugEnabled) log.Debug(@"지정된 회사[{0}]에 사용자[{1}]가 없습니다. 새로 생성합니다.", company.Code, code); lock(_syncLock) { using(UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork)) { Repository<User>.Save(new User(company, code)); UnitOfWork.CurrentSession.Flush(); } } user = FindOneUserByCode(company, code); user.AssertExists("user"); if(log.IsInfoEnabled) log.Info("새로운 User 정보를 생성했습니다!!! New User = " + user); return user; }
/// <summary> /// 사번으로 직원 찾기 /// </summary> /// <param name="company"></param> /// <param name="empNo"></param> /// <returns></returns> public User FindOneUserByEmpNo(Company company, string empNo) { company.ShouldNotBeNull("company"); empNo.ShouldNotBeWhiteSpace("empNo"); if(IsDebugEnabled) log.Debug("특정 사번의 사용자 정보를 조회합니다. Company={0}, empNo={1}", company, empNo); return NAccessContext.Linq.Users .Where(u => u.Company == company && u.EmpNo == empNo) .SingleOrDefault(); }
/// <summary> /// 로그인 계정을 가진 사용자 정보를 로드합니다. /// </summary> /// <param name="company"></param> /// <param name="loginId"></param> /// <returns></returns> public User FindOneUserByLogin(Company company, string loginId) { return FindOneUserByLogin(company, loginId, null); }
/// <summary> /// 지정한 코드 그룹의 코드 정보들을 조회합니다. /// </summary> /// <param name="company">회사</param> /// <param name="groupCode">그룹 코드</param> /// <returns></returns> public IList<Code> FindAllCodeByGroup(Company company, string groupCode) { return FindAllCodeByGroup(company, groupCode, null, null); }
/// <summary> /// 특정 회사의 모든 코드 정보를 조회합니다. /// </summary> /// <param name="company">회사</param> /// <param name="firstResult">첫번째 결과 셋의 인덱스 (0부터 시작. null이면 0으로 간주)</param> /// <param name="maxResults">결과 셋의 최대 레코드 수 (null 또는 0 이하의 값은 무시된다)</param> /// <param name="orders">정렬 순서</param> /// <returns></returns> public IList<Code> FindAllCodeByCompany(Company company, int? firstResult, int? maxResults, params INHOrder<Code>[] orders) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug(@"특정 회사의 모든 코드 정보를 조회합니다... " + @"companyCode={0}, firstResult={1}, maxResults={2}, orders={3}", company.Code, firstResult, maxResults, orders.CollectionToString()); var query = QueryOver.Of<Code>().AddWhere(c => c.Group.CompanyCode == company.Code).AddOrders(orders); return Repository<Code>.FindAll(query, firstResult.GetValueOrDefault(), maxResults.GetValueOrDefault()); }
/// <summary> /// 지정된 회사의 모든 사용자 정보를 조회합니다. /// </summary> /// <param name="company"></param> /// <returns></returns> public IList<User> FindAllUserByCompany(Company company) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug(@"지정된 회사의 모든 사용자 정보를 조회합니다... companyCode=" + company.Code); return NAccessContext.Linq.Users.Where(u => u.Company == company).ToList(); }
/// <summary> /// <see cref="Calendar"/> 조회를 위한 Criteria를 빌드합니다. /// </summary> /// <param name="code">Calendar 고유 코드</param> /// <param name="projectId">관련 Proejct의 고유 ID</param> /// <param name="resourceId">관련 리소스의 고유 ID</param> /// <param name="company">Calendar 적용 회사</param> /// <param name="name">Calendar 명</param> /// <returns></returns> public QueryOver<Calendar, Calendar> BuildQueryOverOfCalendar(string code, string projectId, string resourceId, Company company, string name) { if(log.IsDebugEnabled) log.Debug(@"Calendar 정보 검색을 위한 Criteria를 빌드합니다... " + @"code={0}, projectId={1}, resourceId={2}, company={3}, name={4}", code, projectId, resourceId, company, name); var query = QueryOver.Of<Calendar>(); if(code.IsNotWhiteSpace()) query.AddWhere(c => c.Code == code); if(projectId.IsNotWhiteSpace()) query.AddWhere(c => c.ProjectId == projectId); if(resourceId.IsNotWhiteSpace()) query.AddWhere(c => c.ResourceId == resourceId); if(company != null) query.AddWhere(c => c.CompanyCode == company.Code); if(name.IsNotWhiteSpace()) query.AddWhere(c => c.Name == name); return query; }
/// <summary> /// 사용자 (<see cref="User"/>) 정보를 조회하기 위한 QueryOver{User, User}를 빌드합니다. /// </summary> public QueryOver<User, User> BuildQueryOverOfUser(Company company, string loginId, string password = null) { var query = QueryOver.Of<User>(); if(company != null) query.AddWhere(u => u.Company == company); if(loginId.IsNotWhiteSpace()) query.AddWhere(u => u.LoginId == loginId); if(password.IsNotWhiteSpace()) query.AddWhere(u => u.Password == password); return query; }
/// <summary> /// 사용자 (<see cref="User"/>) 정보를 조회하기 위한 QueryOver{User, User}를 빌드합니다. /// </summary> public QueryOver<User, User> BuildQueryOverOfUser(Company company, Department department = null, string code = null, string name = null, int? kind = null, string loginId = null, string password = null, string empNo = null) { var query = QueryOver.Of<User>(); if(company != null) query.AddWhere(u => u.Company == company); if(department != null) { var userInDeptQuery = QueryOver.Of<DepartmentMember>() .AddWhere(m => m.Department == department) .Select(Projections.Group<DepartmentMember>(m => m.User.Id)); query.WithSubquery.WhereProperty(u => u.Id).In(userInDeptQuery); } if(code.IsNotWhiteSpace()) query.AddWhere(u => u.Code == code); if(name.IsNotWhiteSpace()) query.AddWhere(u => u.Name == name); if(kind.HasValue) query.AddWhere(u => u.Kind == kind.Value); if(loginId.IsNotWhiteSpace()) query.AddWhere(u => u.LoginId == loginId); if(password.IsNotWhiteSpace()) query.AddWhere(u => u.Password == password); if(empNo.IsNotWhiteSpace()) query.AddWhere(u => u.EmpNo == empNo); return query; }
/// <summary> /// 특정 회사의 모든 코드 정보를 조회합니다. /// </summary> /// <param name="company">회사</param> /// <returns></returns> public IList<Code> FindAllCodeByCompany(Company company) { return FindAllCodeByCompany(company, null, null); }
/// <summary> /// 코드 Identity 값으로부터 코드 정보를 조회합니다. /// </summary> /// <param name="company">회사</param> /// <param name="groupCode">그룹 코드</param> /// <param name="itemCode">아이템 코드</param> /// <returns></returns> public Code FindOneCodeByCode(Company company, string groupCode, string itemCode) { company.ShouldNotBeNull("company"); return FindOneCodeByCode(company.Code, groupCode, itemCode); }
/// <summary> /// 지정된 회사의 코드 그룹 정보를 가져온다. /// </summary> /// <param name="company">회사</param> /// <returns></returns> public IList<CodeGroup> FindAllCodeGroupByCompany(Company company) { company.ShouldNotBeNull("company"); return FindAllCodeGroupByCompany(company.Code); }
/// <summary> /// 지정된 회사의 모든 사용자 정보를 Paging 처리하여 로드합니다 /// </summary> /// <param name="company">회사</param> /// <param name="pageIndex">페이지 인덱스 (0부터 시작)</param> /// <param name="pageSize">페이지 크기 (0보다 커야 한다. 보통 10)</param> /// <param name="orders">정렬 순서</param> /// <returns></returns> public IPagingList<User> GetPageOfUserByCompany(Company company, int pageIndex, int pageSize, params INHOrder<User>[] orders) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug(@"지정된 회사의 모든 사용자 정보를 Paging 처리하여 로드합니다... company={0}, pageIndex={1}, pageSize={2}, orders={3}", company.Code, pageIndex, pageSize, orders.CollectionToString()); return Repository<User>.GetPage(pageIndex, pageSize, QueryOver.Of<User>().AddWhere(u => u.Company == company), orders); }
/// <summary> /// 지정된 회사에서, 지정된 이름과 매칭되는 (LIKE 검색) 사용자 정보를 조회합니다. /// </summary> /// <param name="company"></param> /// <param name="nameToMatch"></param> /// <param name="matchMode"></param> /// <returns></returns> public IList<User> FindAllUserByCompanyAndNameToMatch(Company company, string nameToMatch, MatchMode matchMode) { company.ShouldNotBeNull("company"); if(IsDebugEnabled) log.Debug("사용자 이름과 매칭 검색을 수행합니다. nameToMatch={0}, matchMode={1}", nameToMatch, matchMode); var query = QueryOver.Of<User>() .AddWhere(u => u.Company == company) .AddInsensitiveLike(u => u.Name, nameToMatch, matchMode ?? MatchMode.Anywhere); return Repository<User>.FindAll(query); }
/// <summary> /// 사용자 (<see cref="User"/>) 정보를 조회하기 위한 Criteria를 빌드합니다. /// </summary> public DetachedCriteria BuildCriteriaOfUser(Company company, Department department, string code, string name, int? kind, string loginId, string password, string empNo) { return BuildQueryOverOfUser(company, department, code, name, kind, loginId, password, empNo).DetachedCriteria; }
/// <summary> /// 특정 사용자 정보를 Load합니다. /// </summary> public User FindOneUserByCode(Company company, string code) { company.ShouldNotBeNull("company"); code.ShouldNotBeWhiteSpace("code"); if(IsDebugEnabled) log.Debug(@"사용자 정보를 조회합니다. Company={0}, code={1}", company.Id, code); return NAccessContext.Linq.Users .Where(u => u.Company == company && u.Code == code) .SingleOrDefault(); }
/// <summary> /// 지정된 코드를 조회한다. 없다면, 새로 생성하여 저장한 후, 반환한다. /// </summary> /// <param name="company">회사</param> /// <param name="groupCode">그룹 코드</param> /// <param name="itemCode">아이템 코드</param> /// <returns></returns> public Code GetOrCreateCode(Company company, string groupCode, string itemCode) { company.ShouldNotBeNull("company"); return GetOrCreateCode(company.Code, groupCode, itemCode); }
/// <summary> /// 지정한 코드 그룹의 코드 정보들을 조회합니다. /// </summary> /// <param name="company">회사</param> /// <param name="groupCode">그룹 코드</param> /// <param name="firstResult">첫번째 결과 셋의 인덱스 (0부터 시작. null이면 0으로 간주)</param> /// <param name="maxResults">결과 셋의 최대 레코드 수 (null 또는 0 이하의 값은 무시된다)</param> /// <param name="orders">정렬 순서</param> /// <returns></returns> public IList<Code> FindAllCodeByGroup(Company company, string groupCode, int? firstResult, int? maxResults, params INHOrder<Code>[] orders) { company.ShouldNotBeNull("company"); groupCode.ShouldNotBeWhiteSpace("groupCode"); if(IsDebugEnabled) log.Debug(@"지정한 코드 그룹의 코드 정보들을 조회합니다... " + @"companyCode={0}, groupCode={1}, firstResult={2}, maxResults={3}, orders={4}", company.Code, groupCode, firstResult, maxResults, orders.CollectionToString()); var query = BuildQueryOverOfCode(company.Code, groupCode, null, null, null, null).AddOrders(orders); return Repository<Code>.FindAll(query, firstResult.GetValueOrDefault(), maxResults.GetValueOrDefault()); }