feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: 퇴사 근로자 안전 보관과 업무 차단 구현 - #199

Merged
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive
Aug 16, 2026
Merged

feat: 퇴사 근로자 안전 보관과 업무 차단 구현#199
hywznn merged 2 commits into
mainfrom
feat/193-worker-archive

Conversation

@hywznn

@hywznnhywznn commented Aug 16, 2026

Copy link
Copy Markdown
Member

왜 필요한가요?

체류기간 경과 확인과 실제 퇴사·고용종료는 서로 다른 판단입니다. 근로자를 자동 삭제하지 않으면서, HR이 고용종료와 남은 업무 정리를 확인한 뒤 운영 대상에서 안전하게 분리할 필요가 있습니다.

Depends on #198
Closes#193

무엇이 바뀌나요?

  • GET /api/v1/workers/{workerId}/archive-eligibility로 보관 차단 사유를 확인합니다.
  • POST /api/v1/workers/{workerId}/archive로 HR·ADMIN이 사유와 expected_version을 제출합니다.
  • ACTIVE·ON_LEAVE, 미완료 Task, 대기 승인, 유효 Worker Link가 있으면 보관을 거부합니다.
  • 보관 근로자는 기본 목록·AI 대상 탐색·신규 Task 대상에서 제외합니다.
  • 기존 상세·Task·문서·응답·감사로그는 삭제하지 않습니다.
  • 보관 시각·처리자·사유와 WORKER_ARCHIVED 감사로그를 저장합니다.
  • 동시 Task 생성과 보관이 엇갈리지 않도록 근로자 행 잠금으로 직렬화합니다.
  • V56에 보관 테이블, PostgreSQL V57에 RLS 정책을 준비합니다.

안전장치

  • 체류기간 만료만으로 퇴사·불법체류를 자동 판단하지 않습니다.
  • 자동 삭제·자동 보관·자동 개인정보 변경을 수행하지 않습니다.
  • 다른 사업장 근로자는 404로 숨기며 VIEWER는 조회·보관할 수 없습니다.
  • RLS 활성화는 공통 RLS PR에서 별도로 수행합니다.

검증

  • ./gradlew test --tests com.fowoco.server.worker.WorkerArchiveIntegrationTest
  • PostgreSQL 16 전체 테스트 688개 — 실패 0건
  • 제한된 Runtime DB Role의 HTTP·Repository 격리 테스트 통과
  • Flyway migrate·validate 및 보관 테이블·정책 계약 검증 통과
  • git diff --check

병합 순서

  1. 선행 PR 체류기간 만료 경과 긴급 확인 흐름 구현 #198 병합
  2. 이 PR의 base를 main으로 변경
  3. 최신 main 기준 CI·PostgreSQL 검증
  4. Squash Merge

@hywznn
hywznnforce-pushed the feat/193-worker-archive branch from 8f290ab to 08ba97aCompareAugust 16, 2026 23:25
@hywznn
hywznn marked this pull request as ready for review August 16, 2026 23:30
@hywznn
hywznn merged commit eafab84 into mainAug 16, 2026
4 checks passed
@hywznn
hywznn deleted the feat/193-worker-archive branch August 16, 2026 23:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Worker][P1] 체류만료·퇴사 근로자 안전 보관과 업무 차단 규칙 구현

1 participant

@hywznn