Files
sam-api/LOGICAL_RELATIONSHIPS.md

1127 lines
30 KiB
Markdown
Raw Normal View History

# 논리적 데이터베이스 관계 문서
> **자동 생성**: 2026-02-11 13:41:26
> **소스**: Eloquent 모델 관계 분석
## 📊 모델별 관계 현황
### bad_debts
**모델**: `App\Models\BadDebts\BadDebt`
- **client()**: belongsTo → `clients`
- **assignedUser()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **documents()**: hasMany → `bad_debt_documents`
- **memos()**: hasMany → `bad_debt_memos`
### bad_debt_documents
**모델**: `App\Models\BadDebts\BadDebtDocument`
- **badDebt()**: belongsTo → `bad_debts`
- **file()**: belongsTo → `files`
### bad_debt_memos
**모델**: `App\Models\BadDebts\BadDebtMemo`
- **badDebt()**: belongsTo → `bad_debts`
- **creator()**: belongsTo → `users`
### biddings
**모델**: `App\Models\Bidding\Bidding`
- **quote()**: belongsTo → `quotes`
- **client()**: belongsTo → `clients`
- **bidder()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### boards
**모델**: `App\Models\Boards\Board`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **customFields()**: hasMany → `board_settings`
- **posts()**: hasMany → `posts`
### board_comments
**모델**: `App\Models\Boards\BoardComment`
- **post()**: belongsTo → `posts`
- **user()**: belongsTo → `users`
- **parent()**: belongsTo → `board_comments`
- **children()**: hasMany → `board_comments`
### board_settings
**모델**: `App\Models\Boards\BoardSetting`
- **board()**: belongsTo → `boards`
### posts
**모델**: `App\Models\Boards\Post`
- **board()**: belongsTo → `boards`
- **files()**: hasMany → `files`
- **comments()**: hasMany → `board_comments`
### post_custom_field_values
**모델**: `App\Models\Boards\PostCustomFieldValue`
- **post()**: belongsTo → `posts`
- **field()**: belongsTo → `board_settings`
### category_groups
**모델**: `App\Models\CategoryGroup`
- **tenant()**: belongsTo → `tenants`
### categorys
**모델**: `App\Models\Commons\Category`
- **parent()**: belongsTo → `categories`
- **children()**: hasMany → `categories`
2026-01-20 20:51:42 +09:00
- **products()**: hasMany → `products`
- **categoryFields()**: hasMany → `category_fields`
### category_fields
**모델**: `App\Models\Commons\CategoryField`
- **category()**: belongsTo → `categories`
### category_logs
**모델**: `App\Models\Commons\CategoryLog`
- **category()**: belongsTo → `categories`
### category_templates
**모델**: `App\Models\Commons\CategoryTemplate`
- **category()**: belongsTo → `categories`
### files
**모델**: `App\Models\Commons\File`
- **tenant()**: belongsTo → `tenants`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
- **folder()**: belongsTo → `folders`
- **uploader()**: belongsTo → `users`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
- **shareLinks()**: hasMany → `file_share_links`
- **fileable()**: morphTo → `(Polymorphic)`
### global_menus
**모델**: `App\Models\Commons\GlobalMenu`
- **parent()**: belongsTo → `global_menus`
- **children()**: hasMany → `global_menus`
- **tenantMenus()**: hasMany → `menus`
### menus
**모델**: `App\Models\Commons\Menu`
- **parent()**: belongsTo → `menus`
- **globalMenu()**: belongsTo → `global_menus`
- **children()**: hasMany → `menus`
### tags
**모델**: `App\Models\Commons\Tag`
- **tenant()**: belongsTo → `tenants`
### company_requests
**모델**: `App\Models\CompanyRequest`
- **user()**: belongsTo → `users`
- **approver()**: belongsTo → `users`
- **createdTenant()**: belongsTo → `tenants`
### contracts
**모델**: `App\Models\Construction\Contract`
- **contractManager()**: belongsTo → `users`
- **constructionPm()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **handoverReport()**: hasOne → `handover_reports`
### handover_reports
**모델**: `App\Models\Construction\HandoverReport`
- **contract()**: belongsTo → `contracts`
- **contractManager()**: belongsTo → `users`
- **constructionPm()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **managers()**: hasMany → `handover_report_managers`
- **items()**: hasMany → `handover_report_items`
### handover_report_items
**모델**: `App\Models\Construction\HandoverReportItem`
- **handoverReport()**: belongsTo → `handover_reports`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### handover_report_managers
**모델**: `App\Models\Construction\HandoverReportManager`
- **handoverReport()**: belongsTo → `handover_reports`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### structure_reviews
**모델**: `App\Models\Construction\StructureReview`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### bom_templates
**모델**: `App\Models\Design\BomTemplate`
- **modelVersion()**: belongsTo → `model_versions`
- **items()**: hasMany → `bom_template_items`
### bom_template_items
**모델**: `App\Models\Design\BomTemplateItem`
- **template()**: belongsTo → `bom_templates`
### design_models
**모델**: `App\Models\Design\DesignModel`
- **versions()**: hasMany → `model_versions`
### model_versions
**모델**: `App\Models\Design\ModelVersion`
- **model()**: belongsTo → `models`
- **bomTemplates()**: hasMany → `bom_templates`
### documents
**모델**: `App\Models\Documents\Document`
- **template()**: belongsTo → `document_templates`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **approvals()**: hasMany → `document_approvals`
- **data()**: hasMany → `document_data`
- **attachments()**: hasMany → `document_attachments`
- **linkable()**: morphTo → `(Polymorphic)`
### document_approvals
**모델**: `App\Models\Documents\DocumentApproval`
- **document()**: belongsTo → `documents`
- **user()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
### document_attachments
**모델**: `App\Models\Documents\DocumentAttachment`
- **document()**: belongsTo → `documents`
- **file()**: belongsTo → `files`
- **creator()**: belongsTo → `users`
### document_datas
**모델**: `App\Models\Documents\DocumentData`
- **document()**: belongsTo → `documents`
### document_links
**모델**: `App\Models\Documents\DocumentLink`
- **document()**: belongsTo → `documents`
- **linkDefinition()**: belongsTo → `document_template_links`
### document_templates
**모델**: `App\Models\Documents\DocumentTemplate`
- **approvalLines()**: hasMany → `document_template_approval_lines`
- **basicFields()**: hasMany → `document_template_basic_fields`
- **sections()**: hasMany → `document_template_sections`
- **columns()**: hasMany → `document_template_columns`
- **sectionFields()**: hasMany → `document_template_section_fields`
- **links()**: hasMany → `document_template_links`
### document_template_approval_lines
**모델**: `App\Models\Documents\DocumentTemplateApprovalLine`
- **template()**: belongsTo → `document_templates`
### document_template_basic_fields
**모델**: `App\Models\Documents\DocumentTemplateBasicField`
- **template()**: belongsTo → `document_templates`
### document_template_columns
**모델**: `App\Models\Documents\DocumentTemplateColumn`
- **template()**: belongsTo → `document_templates`
### document_template_links
**모델**: `App\Models\Documents\DocumentTemplateLink`
- **template()**: belongsTo → `document_templates`
- **linkValues()**: hasMany → `document_template_link_values`
### document_template_link_values
**모델**: `App\Models\Documents\DocumentTemplateLinkValue`
- **template()**: belongsTo → `document_templates`
- **link()**: belongsTo → `document_template_links`
### document_template_sections
**모델**: `App\Models\Documents\DocumentTemplateSection`
- **template()**: belongsTo → `document_templates`
- **items()**: hasMany → `document_template_section_items`
### document_template_section_fields
**모델**: `App\Models\Documents\DocumentTemplateSectionField`
- **template()**: belongsTo → `document_templates`
### document_template_section_items
**모델**: `App\Models\Documents\DocumentTemplateSectionItem`
- **section()**: belongsTo → `document_template_sections`
### estimates
**모델**: `App\Models\Estimate\Estimate`
- **modelSet()**: belongsTo → `categories`
- **items()**: hasMany → `estimate_items`
### estimate_items
**모델**: `App\Models\Estimate\EstimateItem`
- **estimate()**: belongsTo → `estimates`
### fcm_send_logs
**모델**: `App\Models\FcmSendLog`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
### file_share_links
**모델**: `App\Models\FileShareLink`
- **file()**: belongsTo → `files`
- **tenant()**: belongsTo → `tenants`
feat: 파일 저장 시스템 DB 마이그레이션 - enhance_files_table: 이중 파일명 시스템 (display_name/stored_name), 폴더 관리, 문서 연결 지원 - create_folders_table: 동적 폴더 관리 시스템 (tenant별 커스터마이징 가능) - 5개 stub 마이그레이션 생성 (file_share_links, file_deletion_logs, storage_usage_history, add_storage_columns_to_tenants) - FolderSeeder stub 생성 - CURRENT_WORKS.md에 Phase 1 진행상황 문서화 fix: 파일 공유 및 삭제 기능 버그 수정 - ShareLinkRequest: PATH 파라미터 {id}를 file_id로 자동 병합 - routes/api.php: 공유 링크 다운로드를 auth.apikey 그룹 밖으로 이동 (인증 불필요) - FileShareLink: File, Tenant 클래스 import 추가 - File 모델: softDeleteFile()에서 SoftDeletes의 delete() 메서드 사용 - FileStorageService: getTrash(), restoreFile(), permanentDelete()에서 onlyTrashed() 사용 - File 모델: Tenant 네임스페이스 수정 (App\Models\Tenants\Tenant) refactor: Swagger 문서 정리 - File 태그를 Files로 통합 - FileApi.php의 모든 태그를 Files로 변경 - 구 파일 시스템 라우트 삭제 (prefix 'file') - 구 FileController.php 삭제 - 신규 파일 저장소 시스템으로 완전 통합 fix: 모든 legacy 파일 컬럼 nullable 일괄 처리 - 5개 legacy 컬럼을 한 번에 nullable로 변경 * original_name, file_name, file_name_old (string) * fileable_id, fileable_type (polymorphic) - foreach 루프로 반복 작업 자동화 - 신규/기존 시스템 간 완전한 하위 호환성 확보 fix: legacy 파일 컬럼 nullable 처리 완료 - file_name, file_name_old 컬럼도 nullable로 변경 - 기존 시스템과 신규 시스템 간 완전한 하위 호환성 확보 - Legacy: original_name, file_name, file_name_old (nullable) - New: display_name, stored_name (required) fix: original_name 컬럼 nullable 처리 - original_name을 nullable로 변경하여 하위 호환성 유지 - 새 시스템에서는 display_name 사용, 기존 시스템은 original_name 사용 가능 fix: 파일 업로드 DB 컬럼 누락 및 메시지 구조 개선 - files 테이블에 감사 컬럼 추가 (created_by, updated_by, uploaded_by) - ApiResponse::handle() 메시지 로직 개선 (접미사 제거) - 다국어 지원을 위한 완성된 문장 구조 유지 - FileUploadRequest 파일 검증 규칙 수정 fix: 파일 저장소 버그 수정 및 신규 테넌트 폴더 자동 생성 - FolderSeeder 네임스페이스 수정 (App\Models\Tenant → App\Models\Tenants\Tenant) - FileStorageController use 문 구문 오류 수정 (/ → \) - TenantObserver에 신규 테넌트 기본 폴더 자동 생성 로직 추가 - 5개 기본 폴더 (생산관리, 품질관리, 회계, 인사, 일반) - 에러 처리 및 로깅 - 회원가입 시 자동 실행
2025-11-10 19:08:56 +09:00
### folders
**모델**: `App\Models\Folder`
### interview_answers
**모델**: `App\Models\Interview\InterviewAnswer`
- **session()**: belongsTo → `interview_sessions`
- **question()**: belongsTo → `interview_questions`
- **template()**: belongsTo → `interview_templates`
### interview_categorys
**모델**: `App\Models\Interview\InterviewCategory`
- **templates()**: hasMany → `interview_templates`
- **sessions()**: hasMany → `interview_sessions`
### interview_questions
**모델**: `App\Models\Interview\InterviewQuestion`
- **template()**: belongsTo → `interview_templates`
### interview_sessions
**모델**: `App\Models\Interview\InterviewSession`
- **category()**: belongsTo → `interview_categories`
- **answers()**: hasMany → `interview_answers`
### interview_templates
**모델**: `App\Models\Interview\InterviewTemplate`
- **category()**: belongsTo → `interview_categories`
- **questions()**: hasMany → `interview_questions`
### custom_tabs
**모델**: `App\Models\ItemMaster\CustomTab`
- **columnSetting()**: hasOne → `tab_columns`
### entity_relationships
**모델**: `App\Models\ItemMaster\EntityRelationship`
- **parent()**: morphTo → `(Polymorphic)`
- **child()**: morphTo → `(Polymorphic)`
### item_pages
**모델**: `App\Models\ItemMaster\ItemPage`
- **sectionRelationships()**: hasMany → `entity_relationships`
- **fieldRelationships()**: hasMany → `entity_relationships`
- **allRelationships()**: hasMany → `entity_relationships`
### item_sections
**모델**: `App\Models\ItemMaster\ItemSection`
- **fieldRelationships()**: hasMany → `entity_relationships`
- **bomRelationships()**: hasMany → `entity_relationships`
- **allChildRelationships()**: hasMany → `entity_relationships`
### tab_columns
**모델**: `App\Models\ItemMaster\TabColumn`
- **tab()**: belongsTo → `custom_tabs`
### items
**모델**: `App\Models\Items\Item`
- **category()**: belongsTo → `categories`
- **files()**: hasMany → `files`
- **details()**: hasOne → `item_details`
- **stock()**: hasOne → `stocks`
### item_details
**모델**: `App\Models\Items\ItemDetail`
- **item()**: belongsTo → `items`
### item_receipts
**모델**: `App\Models\Items\ItemReceipt`
- **item()**: belongsTo → `items`
- **creator()**: belongsTo → `users`
### login_tokens
**모델**: `App\Models\LoginToken`
- **user()**: belongsTo → `users`
### main_requests
**모델**: `App\Models\MainRequest`
- **flows()**: hasMany → `main_request_flows`
### main_request_flows
**모델**: `App\Models\MainRequestFlow`
- **mainRequest()**: belongsTo → `main_requests`
- **flowable()**: morphTo → `(Polymorphic)`
2026-01-20 20:51:42 +09:00
### materials
**모델**: `App\Models\Materials\Material`
- **category()**: belongsTo → `categories`
- **receipts()**: hasMany → `material_receipts`
- **lots()**: hasMany → `lots`
- **files()**: morphMany → `files`
### material_inspections
**모델**: `App\Models\Materials\MaterialInspection`
- **receipt()**: belongsTo → `material_receipts`
- **items()**: hasMany → `material_inspection_items`
### material_inspection_items
**모델**: `App\Models\Materials\MaterialInspectionItem`
- **inspection()**: belongsTo → `material_inspections`
### material_receipts
**모델**: `App\Models\Materials\MaterialReceipt`
- **material()**: belongsTo → `materials`
- **inspections()**: hasMany → `material_inspections`
### users
**모델**: `App\Models\Members\User`
- **userTenants()**: hasMany → `user_tenants`
- **userRoles()**: hasMany → `user_roles`
- **tenantProfiles()**: hasMany → `tenant_user_profiles`
- **userTenant()**: hasOne → `user_tenants`
- **userTenantById()**: hasOne → `user_tenants`
- **tenantProfile()**: hasOne → `tenant_user_profiles`
- **tenantsMembership()**: belongsToMany → `tenants`
- **files()**: morphMany → `files`
### user_menu_permissions
**모델**: `App\Models\Members\UserMenuPermission`
- **user()**: belongsTo → `users`
- **menu()**: belongsTo → `menus`
### user_roles
**모델**: `App\Models\Members\UserRole`
- **user()**: belongsTo → `users`
- **tenant()**: belongsTo → `tenants`
- **role()**: belongsTo → `roles`
### user_tenants
**모델**: `App\Models\Members\UserTenant`
- **user()**: belongsTo → `users`
- **tenant()**: belongsTo → `tenants`
### notification_settings
**모델**: `App\Models\NotificationSetting`
### notification_setting_groups
**모델**: `App\Models\NotificationSettingGroup`
- **items()**: hasMany → `notification_setting_group_items`
### notification_setting_group_items
**모델**: `App\Models\NotificationSettingGroupItem`
- **group()**: belongsTo → `notification_setting_groups`
### notification_setting_group_states
**모델**: `App\Models\NotificationSettingGroupState`
### clients
**모델**: `App\Models\Orders\Client`
- **clientGroup()**: belongsTo → `client_groups`
- **orders()**: hasMany → `orders`
- **badDebts()**: hasMany → `bad_debts`
- **activeBadDebts()**: hasMany → `bad_debts`
### client_groups
**모델**: `App\Models\Orders\ClientGroup`
- **clients()**: hasMany → `clients`
### orders
**모델**: `App\Models\Orders\Order`
- **quote()**: belongsTo → `quotes`
- **client()**: belongsTo → `clients`
- **writer()**: belongsTo → `users`
- **item()**: belongsTo → `items`
- **sale()**: belongsTo → `sales`
- **items()**: hasMany → `order_items`
- **nodes()**: hasMany → `order_nodes`
- **rootNodes()**: hasMany → `order_nodes`
- **histories()**: hasMany → `order_histories`
- **versions()**: hasMany → `order_versions`
- **workOrders()**: hasMany → `work_orders`
- **shipments()**: hasMany → `shipments`
- **sales()**: hasMany → `sales`
### order_historys
**모델**: `App\Models\Orders\OrderHistory`
- **order()**: belongsTo → `orders`
### order_items
**모델**: `App\Models\Orders\OrderItem`
- **order()**: belongsTo → `orders`
- **node()**: belongsTo → `order_nodes`
- **item()**: belongsTo → `items`
- **quote()**: belongsTo → `quotes`
- **quoteItem()**: belongsTo → `quote_items`
- **components()**: hasMany → `order_item_components`
### order_item_components
**모델**: `App\Models\Orders\OrderItemComponent`
- **orderItem()**: belongsTo → `order_items`
### order_nodes
**모델**: `App\Models\Orders\OrderNode`
- **parent()**: belongsTo → `order_nodes`
- **order()**: belongsTo → `orders`
- **children()**: hasMany → `order_nodes`
- **items()**: hasMany → `order_items`
### order_versions
**모델**: `App\Models\Orders\OrderVersion`
- **order()**: belongsTo → `orders`
### permissions
**모델**: `App\Models\Permissions\Permission`
- **tenant()**: belongsTo → `tenants`
### permission_overrides
**모델**: `App\Models\Permissions\PermissionOverride`
- **permission()**: belongsTo → `permissions`
### roles
**모델**: `App\Models\Permissions\Role`
- **tenant()**: belongsTo → `tenants`
- **menuPermissions()**: hasMany → `role_menu_permissions`
- **userRoles()**: hasMany → `user_roles`
- **users()**: belongsToMany → `users`
- **permissions()**: belongsToMany → `permissions`
### role_menu_permissions
**모델**: `App\Models\Permissions\RoleMenuPermission`
- **role()**: belongsTo → `roles`
- **menu()**: belongsTo → `menus`
### popups
**모델**: `App\Models\Popups\Popup`
- **department()**: belongsTo → `departments`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### process
**모델**: `App\Models\Process`
- **classificationRules()**: hasMany → `process_classification_rules`
- **processItems()**: hasMany → `process_items`
- **steps()**: hasMany → `process_steps`
### process_classification_rules
**모델**: `App\Models\ProcessClassificationRule`
- **process()**: belongsTo → `processes`
### process_items
**모델**: `App\Models\ProcessItem`
- **process()**: belongsTo → `processes`
- **item()**: belongsTo → `items`
### process_steps
**모델**: `App\Models\ProcessStep`
- **process()**: belongsTo → `processes`
### work_orders
**모델**: `App\Models\Production\WorkOrder`
- **salesOrder()**: belongsTo → `orders`
- **process()**: belongsTo → `processes`
- **assignee()**: belongsTo → `users`
- **team()**: belongsTo → `departments`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **assignees()**: hasMany → `work_order_assignees`
- **primaryAssignee()**: hasMany → `work_order_assignees`
- **items()**: hasMany → `work_order_items`
- **issues()**: hasMany → `work_order_issues`
- **stepProgress()**: hasMany → `work_order_step_progress`
- **shipments()**: hasMany → `shipments`
- **bendingDetail()**: hasOne → `work_order_bending_details`
### work_order_assignees
**모델**: `App\Models\Production\WorkOrderAssignee`
- **workOrder()**: belongsTo → `work_orders`
- **user()**: belongsTo → `users`
### work_order_bending_details
**모델**: `App\Models\Production\WorkOrderBendingDetail`
- **workOrder()**: belongsTo → `work_orders`
### work_order_issues
**모델**: `App\Models\Production\WorkOrderIssue`
- **workOrder()**: belongsTo → `work_orders`
- **reporter()**: belongsTo → `users`
- **resolver()**: belongsTo → `users`
### work_order_items
**모델**: `App\Models\Production\WorkOrderItem`
- **workOrder()**: belongsTo → `work_orders`
- **item()**: belongsTo → `items`
- **sourceOrderItem()**: belongsTo → `order_items`
### work_order_step_progress
**모델**: `App\Models\Production\WorkOrderStepProgress`
- **workOrder()**: belongsTo → `work_orders`
- **processStep()**: belongsTo → `process_steps`
- **workOrderItem()**: belongsTo → `work_order_items`
- **completedByUser()**: belongsTo → `users`
### work_results
**모델**: `App\Models\Production\WorkResult`
- **workOrder()**: belongsTo → `work_orders`
- **workOrderItem()**: belongsTo → `work_order_items`
- **worker()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
2026-01-20 20:51:42 +09:00
### common_codes
**모델**: `App\Models\Products\CommonCode`
- **parent()**: belongsTo → `common_codes`
- **children()**: hasMany → `common_codes`
### parts
**모델**: `App\Models\Products\Part`
- **category()**: belongsTo → `common_codes`
- **partType()**: belongsTo → `common_codes`
### prices
**모델**: `App\Models\Products\Price`
- **clientGroup()**: belongsTo → `client_groups`
- **revisions()**: hasMany → `price_revisions`
### price_revisions
**모델**: `App\Models\Products\PriceRevision`
- **price()**: belongsTo → `prices`
2026-01-20 20:51:42 +09:00
### products
**모델**: `App\Models\Products\Product`
- **category()**: belongsTo → `categories`
- **componentLines()**: hasMany → `product_components`
- **parentLines()**: hasMany → `product_components`
- **children()**: belongsToMany → `products`
- **parents()**: belongsToMany → `products`
- **files()**: morphMany → `files`
### product_components
**모델**: `App\Models\Products\ProductComponent`
- **parentProduct()**: belongsTo → `products`
- **product()**: belongsTo → `products`
- **material()**: belongsTo → `materials`
### push_device_tokens
**모델**: `App\Models\PushDeviceToken`
### push_notification_settings
**모델**: `App\Models\PushNotificationSetting`
### inspections
**모델**: `App\Models\Qualitys\Inspection`
- **item()**: belongsTo → `items`
- **inspector()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
### lots
**모델**: `App\Models\Qualitys\Lot`
- **item()**: belongsTo → `items`
- **sales()**: hasMany → `lot_sales`
### lot_sales
**모델**: `App\Models\Qualitys\LotSale`
- **lot()**: belongsTo → `lots`
### quotes
**모델**: `App\Models\Quote\Quote`
- **client()**: belongsTo → `clients`
- **item()**: belongsTo → `items`
- **order()**: belongsTo → `orders`
- **siteBriefing()**: belongsTo → `site_briefings`
- **finalizer()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **items()**: hasMany → `quote_items`
- **revisions()**: hasMany → `quote_revisions`
- **orders()**: hasMany → `orders`
### quote_formulas
**모델**: `App\Models\Quote\QuoteFormula`
- **category()**: belongsTo → `quote_formula_categories`
- **ranges()**: hasMany → `quote_formula_ranges`
- **mappings()**: hasMany → `quote_formula_mappings`
- **items()**: hasMany → `quote_formula_items`
### quote_formula_categorys
**모델**: `App\Models\Quote\QuoteFormulaCategory`
- **formulas()**: hasMany → `quote_formulas`
### quote_formula_items
**모델**: `App\Models\Quote\QuoteFormulaItem`
- **formula()**: belongsTo → `quote_formulas`
### quote_formula_mappings
**모델**: `App\Models\Quote\QuoteFormulaMapping`
- **formula()**: belongsTo → `quote_formulas`
### quote_formula_ranges
**모델**: `App\Models\Quote\QuoteFormulaRange`
- **formula()**: belongsTo → `quote_formulas`
### quote_items
**모델**: `App\Models\Quote\QuoteItem`
- **quote()**: belongsTo → `quotes`
### quote_revisions
**모델**: `App\Models\Quote\QuoteRevision`
- **quote()**: belongsTo → `quotes`
- **reviser()**: belongsTo → `users`
### ai_reports
**모델**: `App\Models\Tenants\AiReport`
- **creator()**: belongsTo → `users`
### ai_token_usages
**모델**: `App\Models\Tenants\AiTokenUsage`
- **creator()**: belongsTo → `users`
### ai_voice_recordings
**모델**: `App\Models\Tenants\AiVoiceRecording`
- **user()**: belongsTo → `users`
### approvals
**모델**: `App\Models\Tenants\Approval`
- **form()**: belongsTo → `approval_forms`
- **drafter()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **steps()**: hasMany → `approval_steps`
- **approverSteps()**: hasMany → `approval_steps`
- **referenceSteps()**: hasMany → `approval_steps`
### approval_forms
**모델**: `App\Models\Tenants\ApprovalForm`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **approvals()**: hasMany → `approvals`
### approval_lines
**모델**: `App\Models\Tenants\ApprovalLine`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### approval_steps
**모델**: `App\Models\Tenants\ApprovalStep`
- **approval()**: belongsTo → `approvals`
- **approver()**: belongsTo → `users`
### attendances
**모델**: `App\Models\Tenants\Attendance`
- **user()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### bank_accounts
**모델**: `App\Models\Tenants\BankAccount`
- **assignedUser()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### barobill_settings
**모델**: `App\Models\Tenants\BarobillSetting`
- **tenant()**: belongsTo → `tenants`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### bills
**모델**: `App\Models\Tenants\Bill`
- **client()**: belongsTo → `clients`
- **bankAccount()**: belongsTo → `bank_accounts`
- **creator()**: belongsTo → `users`
- **installments()**: hasMany → `bill_installments`
### bill_installments
**모델**: `App\Models\Tenants\BillInstallment`
- **bill()**: belongsTo → `bills`
- **creator()**: belongsTo → `users`
### cards
**모델**: `App\Models\Tenants\Card`
- **assignedUser()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### data_exports
**모델**: `App\Models\Tenants\DataExport`
- **tenant()**: belongsTo → `tenants`
- **creator()**: belongsTo → `users`
### departments
**모델**: `App\Models\Tenants\Department`
- **parent()**: belongsTo → `departments`
- **children()**: hasMany → `departments`
- **departmentUsers()**: hasMany → `department_user`
- **users()**: belongsToMany → `users`
- **permissionOverrides()**: morphMany → `permission_overrides`
### deposits
**모델**: `App\Models\Tenants\Deposit`
- **client()**: belongsTo → `clients`
- **bankAccount()**: belongsTo → `bank_accounts`
- **creator()**: belongsTo → `users`
### expected_expenses
**모델**: `App\Models\Tenants\ExpectedExpense`
- **client()**: belongsTo → `clients`
- **bankAccount()**: belongsTo → `bank_accounts`
- **creator()**: belongsTo → `users`
- **source()**: morphTo → `(Polymorphic)`
### expense_accounts
**모델**: `App\Models\Tenants\ExpenseAccount`
- **vendor()**: belongsTo → `clients`
### leaves
**모델**: `App\Models\Tenants\Leave`
- **user()**: belongsTo → `users`
- **approver()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **userProfile()**: hasOne → `tenant_user_profiles`
### leave_balances
**모델**: `App\Models\Tenants\LeaveBalance`
- **user()**: belongsTo → `users`
### leave_grants
**모델**: `App\Models\Tenants\LeaveGrant`
- **user()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
### leave_policys
**모델**: `App\Models\Tenants\LeavePolicy`
- **tenant()**: belongsTo → `tenants`
### loans
**모델**: `App\Models\Tenants\Loan`
- **withdrawal()**: belongsTo → `withdrawals`
### payments
**모델**: `App\Models\Tenants\Payment`
- **subscription()**: belongsTo → `subscriptions`
### payrolls
**모델**: `App\Models\Tenants\Payroll`
- **user()**: belongsTo → `users`
- **confirmer()**: belongsTo → `users`
- **withdrawal()**: belongsTo → `withdrawals`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### payroll_settings
**모델**: `App\Models\Tenants\PayrollSetting`
- **tenant()**: belongsTo → `tenants`
### department_users
**모델**: `App\Models\Tenants\Pivots\DepartmentUser`
- **department()**: belongsTo → `departments`
- **user()**: belongsTo → `users`
### plans
**모델**: `App\Models\Tenants\Plan`
- **subscriptions()**: hasMany → `subscriptions`
### purchases
**모델**: `App\Models\Tenants\Purchase`
- **client()**: belongsTo → `clients`
- **withdrawal()**: belongsTo → `withdrawals`
- **approval()**: belongsTo → `approvals`
- **creator()**: belongsTo → `users`
### receivings
**모델**: `App\Models\Tenants\Receiving`
- **item()**: belongsTo → `items`
- **creator()**: belongsTo → `users`
### salarys
**모델**: `App\Models\Tenants\Salary`
- **employee()**: belongsTo → `users`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **employeeProfile()**: hasOne → `tenant_user_profiles`
### sales
**모델**: `App\Models\Tenants\Sale`
- **order()**: belongsTo → `orders`
- **shipment()**: belongsTo → `shipments`
- **client()**: belongsTo → `clients`
- **deposit()**: belongsTo → `deposits`
- **creator()**: belongsTo → `users`
### schedules
**모델**: `App\Models\Tenants\Schedule`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
### setting_field_defs
**모델**: `App\Models\Tenants\SettingFieldDef`
- **tenantSettings()**: hasMany → `tenant_field_settings`
### shipments
**모델**: `App\Models\Tenants\Shipment`
- **order()**: belongsTo → `orders`
- **workOrder()**: belongsTo → `work_orders`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **items()**: hasMany → `shipment_items`
### shipment_items
**모델**: `App\Models\Tenants\ShipmentItem`
- **shipment()**: belongsTo → `shipments`
- **stockLot()**: belongsTo → `stock_lots`
### sites
**모델**: `App\Models\Tenants\Site`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **client()**: belongsTo → `clients`
### site_briefings
**모델**: `App\Models\Tenants\SiteBriefing`
- **partner()**: belongsTo → `clients`
- **site()**: belongsTo → `sites`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **quotes()**: hasMany → `quotes`
### stocks
**모델**: `App\Models\Tenants\Stock`
- **item()**: belongsTo → `items`
- **creator()**: belongsTo → `users`
- **lots()**: hasMany → `stock_lots`
- **transactions()**: hasMany → `stock_transactions`
### stock_lots
**모델**: `App\Models\Tenants\StockLot`
- **stock()**: belongsTo → `stocks`
- **receiving()**: belongsTo → `receivings`
- **creator()**: belongsTo → `users`
### stock_transactions
**모델**: `App\Models\Tenants\StockTransaction`
- **stock()**: belongsTo → `stocks`
- **stockLot()**: belongsTo → `stock_lots`
- **creator()**: belongsTo → `users`
### subscriptions
**모델**: `App\Models\Tenants\Subscription`
- **tenant()**: belongsTo → `tenants`
- **plan()**: belongsTo → `plans`
- **payments()**: hasMany → `payments`
### tax_invoices
**모델**: `App\Models\Tenants\TaxInvoice`
- **creator()**: belongsTo → `users`
- **updater()**: belongsTo → `users`
- **reference()**: morphTo → `(Polymorphic)`
### tenants
**모델**: `App\Models\Tenants\Tenant`
- **plan()**: belongsTo → `plans`
- **subscription()**: belongsTo → `subscriptions`
- **userTenants()**: hasMany → `user_tenants`
- **roles()**: hasMany → `roles`
- **userRoles()**: hasMany → `user_roles`
- **users()**: belongsToMany → `users`
- **files()**: morphMany → `files`
### tenant_field_settings
**모델**: `App\Models\Tenants\TenantFieldSetting`
- **fieldDef()**: belongsTo → `setting_field_defs`
- **optionGroup()**: belongsTo → `tenant_option_groups`
### tenant_option_groups
**모델**: `App\Models\Tenants\TenantOptionGroup`
- **values()**: hasMany → `tenant_option_values`
### tenant_option_values
**모델**: `App\Models\Tenants\TenantOptionValue`
- **group()**: belongsTo → `tenant_option_groups`
### tenant_stat_fields
**모델**: `App\Models\Tenants\TenantStatField`
- **tenant()**: belongsTo → `tenants`
### tenant_user_profiles
**모델**: `App\Models\Tenants\TenantUserProfile`
- **user()**: belongsTo → `users`
- **department()**: belongsTo → `departments`
- **manager()**: belongsTo → `users`
- **rankPosition()**: belongsTo → `positions`
- **titlePosition()**: belongsTo → `positions`
### today_issues
**모델**: `App\Models\Tenants\TodayIssue`
### withdrawals
**모델**: `App\Models\Tenants\Withdrawal`
- **client()**: belongsTo → `clients`
- **bankAccount()**: belongsTo → `bank_accounts`
- **card()**: belongsTo → `cards`
- **creator()**: belongsTo → `users`
### user_invitations
**모델**: `App\Models\UserInvitation`
- **tenant()**: belongsTo → `tenants`
- **role()**: belongsTo → `roles`
- **inviter()**: belongsTo → `users`