콘텐츠로 이동

safety_agreement 스키마 (무사고 동의서)

무사고 동의서는 별도 컬렉션이 없고, files 컬렉션의 메타데이터로만 존재합니다.

저장 위치 (파일 경로)

companies/{company_id}/sites/{site_id}/safety_agreements/{uid}/...   (Cloudflare 업로드 경로 prefix)

저장 위치 (Firestore 메타)

companies/{company_id}/sites/{site_id}/files/{file_doc_id}

조회는 항상 files 컬렉션에서 아래 조건으로 필터링:

related_doc_id == UID           # 본인 UID
doc_page == "safety-agreement"

본인의 무사고 동의서만 _get_safety_agreement로 조회되며, 다른 사용자의 동의서를 조회하는 엔드포인트는 없습니다.

files 문서 관련 필드 (무사고 동의서 식별용)

필드 타입 설명
related_doc_id string 서명한 사용자의 UID (= 업로드 주체)
doc_type string "site"
doc_page string "safety-agreement" (필수 식별 키)
tags.signed_date string 서명한 날짜 (YYYY-MM-DD 원본 문자열, coerce: False)
file_name string 파일명
file_size int 파일 크기
file_mime string MIME 타입

(files 컬렉션의 공통 필드는 documentation/docs/system/ 파일 메타 스키마 참고)

권한

업로드 토큰 발급 (_get_safety_agreement_upload_token) / 조회 (_get_safety_agreement) 모두 다음 중 하나 충족 필요:

  1. check_company_permission(UID, company_id, {"require_site_access": site_id}) — 관리자가 해당 현장 접근 권한이 있을 때
  2. 실패 시 check_site_permission(UID, company_id, site_id) — 현장 소속 근로자/장비

즉, 관리자라도 해당 현장에 배정되지 않았으면 업로드/조회 불가.

예시 files 메타 문서

{
  "related_doc_id": "uid_worker",
  "doc_type": "site",
  "doc_page": "safety-agreement",
  "file_name": "safety_agreement_홍길동.jpg",
  "file_size": 482912,
  "file_mime": "image/jpeg",
  "tags": {
    "signed_date": "2026-04-15"
  }
}