Commit Graph

82 Commits

Author SHA1 Message Date
273ac6caf6 fix(mng): Role 모델 withTrashed() 호출 제거
- Role 모델에 SoftDeletes 트레이트가 없어 에러 발생
- 테넌트 아카이브 시 역할 조회 로직 수정

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 22:43:39 +09:00
5e1d4380d9 fix: 메뉴 드래그 시각적 피드백 및 순서변경 버그 수정
- forceFallback: true 추가 (네이티브 드래그 → 자체 구현)
  → mousemove 이벤트 정상 발생, 인디케이터/하이라이트 작동
- 드래그 중 텍스트 선택 방지 (body.is-dragging + user-select: none)
- 순서변경(reorder) 시 원래 부모 유지 (계층 변경 버그 수정)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 22:19:53 +09:00
2f73a1f4e6 fix: 메뉴 드래그 인덴트/아웃덴트 시각적 피드백 개선
- Notion 스타일 좌우 드래그로 계층 이동 방식 변경
  - → 오른쪽 드래그: 상위 메뉴의 하위로 이동 (파란색 하이라이트)
  - ← 왼쪽 드래그: 상위 레벨로 이동 (주황색 하이라이트)
- 드래그 인디케이터 툴팁 추가 (인덴트/아웃덴트/순서변경)
- CSS 펄스 애니메이션으로 타겟 행 강조
- updateRowHighlight 함수 수정: 아웃덴트 시 드래그 중인 행 하이라이트
2025-12-01 21:14:19 +09:00
d8bae36efd feat: 메뉴 계층 이동 기능 추가
- MenuService.moveMenu() 메서드 추가 (부모 변경 + 하위 메뉴 유지)
- POST /api/admin/menus/move API 엔드포인트 추가
- 순환 참조 방지 로직 구현
- Shift+드래그로 위 메뉴의 하위로 이동 가능
- 사용법 안내 UI 추가
2025-12-01 15:35:49 +09:00
302b9d73aa feat: 메뉴 드래그 앤 드롭 정렬 기능 추가
- MenuService.reorderMenus() 메서드 추가
- MenuController.reorder() API 엔드포인트 추가
- POST /api/admin/menus/reorder 라우트 추가
- SortableJS 기반 드래그 앤 드롭 UI 구현
- 같은 부모 메뉴 내에서만 순서 변경 가능 (계층 구조 유지)
2025-12-01 15:24:49 +09:00
c8ddbfd130 테넌트 목록/모달 UI 개선
- 저장소 사용량 표시 추가 (테이블 + 모달)
- 이메일/전화번호 컬럼 병합 (연락처)
- 전화번호 하이픈 포맷 적용
- 생성일 yymmdd 형식 변경 및 ID 뒤로 이동
- 테이블 헤더 가운데 정렬
- 액션 컬럼을 관리(colspan)로 변경
2025-12-01 14:57:53 +09:00
a2477837d0 feat: [daily-logs] 일일 스크럼 기능 구현
주요 기능:
- 일일 로그 CRUD (생성, 조회, 수정, 삭제, 복원, 영구삭제)
- 로그 항목(Entry) 관리 (추가, 상태변경, 삭제, 순서변경)
- 주간 타임라인 (최근 7일 진행률 표시)
- 테이블 리스트 아코디언 상세보기
- 담당자 자동완성 (일반 사용자는 슈퍼관리자 목록 제외)
- HTMX 기반 동적 테이블 로딩 및 필터링
- Soft Delete 지원

파일 추가:
- Models: AdminPmDailyLog, AdminPmDailyLogEntry
- Controllers: DailyLogController (Web, API)
- Service: DailyLogService
- Requests: StoreDailyLogRequest, UpdateDailyLogRequest
- Views: index, show, table partial, modal-form partial

라우트 추가:
- Web: /daily-logs, /daily-logs/today, /daily-logs/{id}
- API: /api/admin/daily-logs/* (CRUD + 항목관리)
2025-12-01 14:07:55 +09:00
189376ffad feat: [flow-tester] 품목관리 API 테스트 JSON 예제 3개 추가
- items-crud.json: Faker 기반 CRUD 테스트 (5 steps)
- items-search.json: 목록/검색/통계 테스트 (5 steps)
- items-bom.json: BOM 관리 테스트 (8 steps)
2025-12-01 14:05:15 +09:00
4ede126518 feat: [flow-tester] Faker 변수 바인딩 및 품목관리 API 테스트 예제 추가
- VariableBinder에 Laravel Faker 기반 랜덤 데이터 생성 기능 추가
  - {{$faker.name}}, {{$faker.email}}, {{$faker.phone}} 등 텍스트 생성
  - {{$faker.number:MIN:MAX}}, {{$faker.price:MIN:MAX}} 숫자/가격 생성
  - {{$faker.itemCode:PREFIX}}, {{$faker.code:PREFIX:LENGTH}} 코드 생성
  - {{$faker.productName}}, {{$faker.unit}}, {{$faker.category}} 품목 관련
- 가이드 모달에 Faker 변수 문서 추가
- 품목관리 API 테스트 예제 3개 추가
  - items-crud: Faker 기반 CRUD 테스트 (6단계)
  - items-search: 검색/통계 API 테스트 (5단계)
  - items-bom: BOM 관리 테스트 (8단계)
2025-12-01 14:04:57 +09:00
3d91f438ba fix: 사이드바 미구현 메뉴 비활성화 처리
- 생산 관리: 제품/자재/BOM/카테고리 관리 비활성화
- 시스템: 시스템 설정/감사 로그 비활성화
- 클릭 불가 처리 (a태그 → span태그)
- 회색 텍스트 + 금지 커서 + "준비중" 라벨 추가
2025-12-01 14:04:36 +09:00
ea7498ae96 docs: 이메일 설정 가이드 및 작업 이력 업데이트
- SETUP_GUIDE.md: Gmail SMTP 설정 방법, Google Groups 발신자 설정 추가
- CURRENT_WORKS.md: 2025-12-01 비밀번호 자동 생성/이메일 발송 작업 이력
- INDEX.md: 작업 이력 및 최종 업데이트일 갱신
2025-12-01 11:07:58 +09:00
85cbe23782 feat: [users] 사용자 등록 시 비밀번호 자동 생성 및 이메일 발송
- 사용자 등록 시 비밀번호 입력 필드 제거
- 임의 비밀번호 자동 생성 후 이메일 발송
- 사용자 수정 페이지에 비밀번호 초기화 버튼 추가
- 사용자 모달에 비밀번호 초기화 버튼 추가
- 사용자 모달 프로필 이미지 없을 때 이름 첫글자 표시 (한글 지원)
- UserPasswordMail 클래스 및 이메일 템플릿 추가
2025-12-01 10:50:16 +09:00
4a454db0dc fix: 사용자 이름 첫 글자 한글 깨짐 수정
- substr() → mb_substr()로 변경하여 멀티바이트 문자 지원
- strtoupper() → mb_strtoupper()로 변경
- 헤더, 사이드바 사용자 아바타에 적용
2025-12-01 10:43:41 +09:00
6b40362392 feat: [archived-records] 아카이브 복원 기능 및 테넌트 필터링 구현
Phase 1 - 아카이브 복원 기능:
- ArchiveService: 모델별 아카이브 로직 통합 (326줄)
- RestoreService: 복원 로직 및 충돌 검사 (319줄)
- ArchivedRecordController: restore, checkRestore 메서드 추가
- record_type enum→varchar 마이그레이션
- 복원 버튼 및 충돌 체크 UI (restore-check.blade.php)

Phase 2 - 테넌트 필터링:
- ArchivedRecord 모델: tenant_id fillable, tenant 관계 추가
- ArchiveService: tenant_id 저장 로직 (determineTenantId)
- ArchivedRecordService: 테넌트별 필터링 쿼리
- 목록 UI: ID 컬럼, 대상 테넌트 컬럼 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:43:58 +09:00
023b199313 fix: [roles] 역할 수정 페이지 guard_name null 에러 및 테넌트 필터링 수정
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:42:15 +09:00
b39e8b5f2c fix: [users] 슈퍼관리자 보호 기능 복원 라우트 수정
- routes/api.php: 8개 엔티티의 restore 라우트를 super.admin 미들웨어 밖으로 이동
  - tenants, departments, users, menus, boards
  - pm/projects, pm/tasks, pm/issues
- UserService.canAccessUser(): withTrashed() 적용하여 soft-deleted 사용자 권한 체크 가능
- UserPermissionService.canModifyUser(): withTrashed() 적용 (일관성 유지)

권한 정책:
- 복원 (Restore): 일반관리자 가능
- 영구삭제 (Force Delete): 슈퍼관리자 전용

버그 수정:
- 302 Found 에러 해결 (미들웨어 블로킹)
- soft-deleted 사용자 복원 시 권한 체크 실패 해결

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:13:12 +09:00
bbf34e9f3f fix: [archived-records] 페이지네이션 오류 수정
- GROUP BY + paginate() 조합 시 total count 오류 해결 (서브쿼리 방식)
- DB::table() 사용 시 page 파라미터 명시적 전달
- 커스텀 페이지네이션을 공용 컴포넌트(partials.pagination)로 교체

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 23:11:38 +09:00
049fa7ed61 feat: [users] 슈퍼관리자 보호 기능 구현
- 일반관리자가 슈퍼관리자 수정/삭제 불가
- API Controller: update/destroy에서 403 반환
- Web Controller: edit에서 403 abort
- FormRequest: is_super_admin 필드 강제/유지 처리
- View: 테이블, 모달, 생성/수정 폼에서 버튼/체크박스 숨김

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 23:10:07 +09:00
6be0a219c3 refactor(mng): 프로젝트 관리 페이지 이모지를 SVG 아이콘으로 변경
- 대시보드 페이지: 통계 카드, 섹션 제목, JS 동적 렌더링 이모지 → Heroicons SVG
- 프로젝트 목록 페이지: 페이지 제목 이모지 → folder SVG
- mng 시스템 기존 아이콘 스타일과 일관성 유지

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 22:50:26 +09:00
11ba6a4c9b docs: CURRENT_WORKS.md 업데이트 2025-11-30 21:05:18 +09:00
695e3873d9 chore: 관리 페이지 뷰 및 라우트 정비
- ArchivedRecordController 수정
- 각종 테이블 뷰 개선 (archived-records, boards, departments, menus, tenants)
- web.php 라우트 정비
2025-11-30 21:05:13 +09:00
d9030bd12b feat: [pm] 프로젝트 관리 기능 개선
- AdminPmProject 모델: 통계 관련 속성 추가
- ProjectService: 통계 조회 로직 개선
- 프로젝트 목록 뷰: 통계 표시 및 UI 개선
- 프로젝트 테이블 뷰: 진행률 표시 개선
2025-11-30 21:05:02 +09:00
5671cd0bee fix: FlowTester 컨트롤러 수정 2025-11-30 21:04:37 +09:00
127c2fe877 feat: 인증 및 권한 시스템 개선
- LoginController: 로그인 처리 개선
- UserPermissionController: 권한 관리 기능 개선
- User 모델: 권한 관련 메서드 추가
- AuthService: 인증 서비스 로직 개선
- Middleware 추가
- bootstrap/app.php: 미들웨어 등록
- 권한 관리 뷰 개선 (user-permissions, users)
2025-11-30 21:04:32 +09:00
76c8a94e4f docs: MNG 프로젝트 문서 정비
- 개발 단계별 문서 추가 (00_OVERVIEW ~ 06_PHASE)
- 기술 표준 문서 추가 (99_TECHNICAL_STANDARDS)
- 개발 프로세스 및 패턴 문서 추가
  - API_FLOW_TESTER_DESIGN, DEV_PROCESS
  - HTMX_API_PATTERN, LAYOUT_PATTERN
  - SETUP_GUIDE, MNG_PROJECT_PLAN
- 프로젝트 관리 문서 추가 (project-management/)
- INDEX.md, MNG_CRITICAL_RULES.md 업데이트
2025-11-30 21:04:19 +09:00
432ec2b1c1 feat: [pm] 작업/이슈 긴급(is_urgent) 토글 기능 추가
- Task, Issue 모델에 is_urgent 필드 추가
- TaskService, IssueService에 toggleUrgent() 메서드 추가
- TaskController, IssueController에 toggleUrgent 엔드포인트 추가
- API 라우트에 toggle-urgent 경로 추가
- 프로젝트 상세 페이지 UI 개선:
  - 작업/이슈 행에 긴급 토글 버튼(불꽃 아이콘) 추가
  - 서브 row(아코디언 내 이슈)에도 긴급 토글 추가
  - 서브 row 컬럼을 작업 row와 동일하게 8컬럼으로 정렬
  - 진행중 작업의 이슈 아코디언 자동 열기
  - 이슈 상태 버튼 항상 테두리 표시
2025-11-28 18:08:32 +09:00
58009e675d feat: [boards] MNG 게시판 관리 시스템 구현
- Models: Board, BoardSetting (커스텀 필드)
- Service: BoardService (CRUD, 필드 관리)
- Controllers: BoardController (Blade), Api/Admin/BoardController (API)
- Views: index, create, edit, table partial
- 커스텀 필드 다중 추가 모달 (한 줄 레이아웃, + 버튼 추가)
2025-11-28 08:50:47 +09:00
e2475d0d9f feat: [pm] 프로젝트 진행 관리 시스템 구현
- Models: AdminPmProject, AdminPmTask, AdminPmIssue
- Services: ProjectService, TaskService, IssueService, ImportService
- API Controllers: ProjectController, TaskController, IssueController, ImportController
- FormRequests: Store/Update/BulkAction 요청 검증
- Views: 대시보드, 프로젝트 CRUD, JSON Import 화면
- Routes: API 42개 + Web 6개 엔드포인트

주요 기능:
- 프로젝트/작업/이슈 계층 구조 관리
- 상태 변경, 우선순위, 마감일 추적
- 작업 순서 드래그앤드롭 (reorder API)
- JSON Import로 일괄 등록
- Soft Delete 및 복원
2025-11-28 08:49:30 +09:00
fe902472c1 feat: [flow-tester] 의존성 검사, Docker 지원, 인증 자동 주입 기능 추가
FlowExecutor 개선:
- 의존성 스텝 실패 시 후속 스텝 자동 스킵 로직 추가
- Docker 환경 자동 감지 및 내부 URL 변환 (api.sam.kr → nginx)
- SSL 검증 비활성화 및 Host 헤더 설정 지원
- .env에서 API Key/Bearer Token 자동 주입

VariableBinder 개선:
- 임의 stepId 패턴 지원 (page_create_1.tempPageId 등)
- {{$env.VAR_NAME}} 환경변수 플레이스홀더 추가
- {{$auth.token}}, {{$auth.apiKey}} 인증 플레이스홀더 추가

UI 개선:
- SKIPPED 상태 스타일링 (노란색 배경/테두리)
- 행 클릭 시 스텝 상세 확장 기능
- 실행 결과 실시간 표시 개선
2025-11-27 22:20:36 +09:00
28ca71a17e feat: [flow-tester] 플로우 실행 기능 완성
- FlowTesterController에 FlowExecutor 연결
- 실행 결과를 AdminApiFlowRun에 저장
- 실행 중 로딩 인디케이터 추가
- 결과 모달로 상세 실행 결과 표시
  - 상태, 소요 시간, 완료 스텝 표시
  - 각 스텝별 성공/실패 로그 표시
  - 상세 보기 링크 제공
2025-11-27 20:25:32 +09:00
3dcad4e00c fix: [flow-tester] AdminApiFlowRun 모델 수정
- created_at datetime 캐스팅 추가 (=false로 인한 문제)
- status_color DaisyUI → 순수 Tailwind CSS 클래스로 변경
2025-11-27 20:18:44 +09:00
ae980fff38 fix: [flow-tester] guide-modal Blade 이스케이핑 누락 수정 2025-11-27 20:16:44 +09:00
c9f2f780e0 feat: 권한/역할/헤더 페이지에 테넌트 컨텍스트 메뉴 추가
- permissions 테이블의 테넌트 컬럼에 우클릭 메뉴 추가
- roles 테이블의 테넌트 컬럼에 우클릭 메뉴 추가
- 헤더의 현재 테넌트 배지에 우클릭 메뉴 추가
2025-11-27 20:13:17 +09:00
30defc4b10 feat(flow-tester): AI 프롬프트 템플릿 개선 및 복사 기능 추가
- meta 필드 포함 안내 추가 (자동 추출 설명)
- 프롬프트 템플릿에 복사 버튼 추가
- 예시 프롬프트에 복사 버튼 추가
- 사용 흐름 안내 추가
2025-11-27 20:12:49 +09:00
b4ed386c72 refactor: 사용자 컨텍스트 메뉴에서 삭제 옵션 제거 2025-11-27 20:09:39 +09:00
39ed2ac3e3 feat(user-modal): 사용자 정보 모달 및 컨텍스트 메뉴 확장
사용자 모달 기능:
- 사용자 정보 모달 팝업 (조회/삭제/수정)
- 권한 요약 정보 (Web/API 권한 카운트)
- 2x2 그리드 레이아웃 (테넌트, 역할, 부서, 권한)
- 테이블 행 클릭으로 모달 열기
- 권한 관리 링크 클릭 시 해당 사용자 자동 선택

컨텍스트 메뉴 확장:
- permission-analyze 페이지 사용자 이름에 컨텍스트 메뉴
- user-permissions 페이지 사용자 버튼에 컨텍스트 메뉴
- 사용자 모달 내 테넌트 칩에 컨텍스트 메뉴
- 헤더 테넌트 배지에 컨텍스트 메뉴
- 테넌트 메뉴에 "이 테넌트로 전환" 기능 추가
2025-11-27 20:05:27 +09:00
9440742d84 fix(flow-tester): Blade 이스케이핑 오류 수정 (@verbatim 적용) 2025-11-27 20:00:35 +09:00
f292765035 feat(flow-tester): JSON 작성 가이드 모달 및 예제 플로우 추가
- guide-modal.blade.php: JSON 작성 가이드 (기본 구조, 변수 바인딩, 응답 검증, AI 프롬프트)
- example-flows.blade.php: Item Master 전체/기본 테스트, 인증 플로우 예제
- index.blade.php: 가이드/예제 버튼 추가
- 순수 Tailwind CSS 모달 패턴 적용 (DaisyUI 미사용)
2025-11-27 19:50:10 +09:00
367f2159d1 feat: API Flow Tester 핵심 서비스 클래스 구현 (Day 2)
- VariableBinder: 변수 바인딩 엔진 ({{...}} 패턴 처리)
- DependencyResolver: 의존성 정렬 (Topological Sort)
- ResponseValidator: HTTP 응답 검증 (JSONPath, 연산자)
- HttpClient: Laravel HTTP Client 래퍼
- FlowExecutor: 플로우 실행 엔진
2025-11-27 19:20:07 +09:00
b32f6cfcf0 feat: 테넌트 정보 모달 팝업 기능 추가
- 테넌트 row 클릭 시 모달 팝업 표시
- 컨텍스트 메뉴 (우클릭) 지원
- 탭 구조: 구독정보, 사용자, 부서, 역할, 메뉴
- 메뉴 탭 트리 구조 접기/펼치기 기능
- 삭제된 테넌트 경고 배너 (삭제일, 삭제자 표시)
- 복원 버튼으로 즉시 복원 및 모달 새로고침
- 액션 버튼 (수정/삭제) 클릭 시 모달 미표시
2025-11-27 19:11:32 +09:00
ff943ab728 feat: API Flow Tester 기능 기반 구조 추가
- 모델: AdminApiFlow, AdminApiFlowRun
- 컨트롤러: FlowTesterController
- 뷰: index, create, edit, history, run-detail
- 사이드바 메뉴에 "개발 도구" 그룹 추가
- 라우트 설정
2025-11-27 19:02:18 +09:00
604aa256f6 refactor: 메뉴 트리 스크립트 공통화 및 디자인 통일
- public/js/menu-tree.js 공통 스크립트 생성
  - 테이블(tr.menu-row) / div(.menu-item) 둘 다 지원
  - toggleChildren, hideChildren, showChildren 함수 통합

- 권한 관리 페이지들 메뉴 트리 디자인 통일
  - role-permissions, department-permissions, user-permissions
  - 폴더/파일 아이콘, 접기/펼치기 버튼, chevron 아이콘
  - menu-row 클래스 및 data 속성 추가

- permission-analyze 접기/펼치기 기능 추가
  - data-parent-id, data-depth 속성 추가
  - 폴더 버튼 클릭으로 하위 메뉴 토글

- menus 페이지 스크립트 공통화

- 각 페이지 중복 코드 제거 및 공통 menu-tree.js 로드
2025-11-27 10:25:02 +09:00
82c072d72e fix(mng): 아카이브 레코드 batch_id NULL 처리
- 기존 데이터(batch_id NULL)는 legacy_ 접두사로 가상 batch_id 생성
- legacy 데이터 조회 시 id 기반으로 단일 레코드 조회
- batch_description NULL인 경우 레코드 타입과 원본 ID로 자동 생성
2025-11-27 09:09:05 +09:00
d45ccfb325 feat(mng): 아카이브 레코드 batch 그룹핑 UI 구현
- ArchivedRecordService: batch_id 기준 그룹핑 쿼리 추가
- Controller: batchId 파라미터로 상세 조회 변경
- 목록: 작업 설명, 레코드 타입, 레코드 수 표시
- 상세: batch 내 모든 레코드를 카드 형태로 표시
- 한번의 삭제 작업이 하나의 행으로 표시됨
2025-11-26 23:16:39 +09:00
d0b843057e fix(mng): 권한 분석 - 명시적 DENY 표시 개선
- 권한이 없는 사용자는 목록에 표시하지 않음
- access_denied → explicit_deny로 명칭 변경
- DENY 목록은 명시적 개인 거부만 표시
2025-11-26 22:23:43 +09:00
6ad76239a9 feat(mng): 삭제된 데이터 백업 기능 추가
- ArchivedRecord, ArchivedRecordRelation 모델 추가
- ArchivedRecordService 추가 (읽기 전용)
- 목록/상세 컨트롤러 및 뷰 구현
- HTMX 기반 테이블 필터링 및 페이지네이션
- 사이드바 메뉴 연결
2025-11-26 22:23:37 +09:00
f82fd5ff1b fix(mng): 권한 분석에서 역할 기반 사용자가 표시되지 않는 버그 수정
- getUserRoles(): user_roles 테이블에서 model_has_roles(Spatie) 테이블로 변경
- roles 테이블의 display_name → description 컬럼으로 수정
- traceUsersWithPermission()에서도 동일한 컬럼명 수정
2025-11-26 22:01:27 +09:00
1fc530bca2 feat(mng): 권한 분석 페이지 구현
- 메뉴별 권한 분석 기능 (접근 가능/불가 사용자 목록)
- 사용자 역추적 기능 (역할/부서/개인별 권한 추적)
- CSV 내보내기 기능
- 트리 구조 시각화 (└─ 연결선, 폴더/문서 아이콘)
- 중복 메뉴 표시 문제 해결 (테넌트별 메뉴만 표시)
2025-11-26 21:42:51 +09:00
7546771ee5 feat(mng): 개인 권한 관리 통합 매트릭스 구현
- 역할/부서/개인 권한을 통합하여 최종 유효 권한 표시
- 권한 소스별 색상 구분 UI (보라=역할, 파랑=부서, 녹색=개인허용, 빨강=개인거부)
- 스마트 토글 로직 (상속된 권한 오버라이드 지원)
- UserPermissionService: getRolePermissions(), getDepartmentPermissions(), getPersonalOverrides()
- 사용자 ID 뱃지 스타일 개선
2025-11-26 20:40:54 +09:00
d4534f0d3f feat(mng): 사용자 역할/부서 매핑 및 부서관리 복구/영구삭제 기능 추가
사용자 관리:
- 사용자 등록/수정 시 테넌트별 역할/부서 선택 기능 추가
- Department, UserRole, DepartmentUser 모델 추가
- User 모델에 역할/부서 관계 및 헬퍼 메서드 추가
- syncRoles/syncDepartments 메서드 (forceDelete로 유니크 키 충돌 방지)
- 체크박스 UI로 다중 선택 지원

부서 관리:
- Soft Delete 필터 (정상만/전체/삭제된 항목만)
- 복구(restore) 및 영구삭제(forceDelete) 기능 추가
- Department 모델에 SoftDeletes 트레이트 추가
- 삭제된 항목 빨간 배경 + "삭제됨" 배지 표시
2025-11-26 20:28:07 +09:00