- 문서양식 섹션 이미지를 file_id 기반 R2 프록시 URL로 변경
- getSectionImageUrl, _previewImageUrl에 file_id 우선 처리 추가
- 서버사이드 Blade(print, show)도 file_id 기반 URL 생성
- DocumentTemplateSection 모델에 file_id fillable 추가
- 업로드 응답에 file_id 반환, 복제 시 file_id 복사
- 컨텍스트 메뉴 "이 테넌트로 전환" → "테넌트 설정" (보라색, 설정 아이콘)
- context-menu.js에서 직접 window.open 처리 (openTenantConsole 의존 제거)
- 테넌트 콘솔 사이드바 하드코딩 → DB 기반 메뉴 시스템 전환
- SidebarMenuService에 getTenantMenusBySection() 추가
- AppServiceProvider에 tenant-console-sidebar View Composer 추가
- 연봉계약 기간: salary_effective_date 없을 때 입사일 기념일 기준
현재 계약기간 산출 (직전 기념일~다음 기념일-1일)
- API 응답에 기본급, 고정연장근로수당, 식대, 월급여, 통상시급 추가
- labelMap에 기본급, 고정연장근로수당, 식대, 통상시급 패턴 추가
- 자료실 하위 3개 메뉴: 자료보관함, 매뉴얼, 공지사항
- 자료보관함: 폴더 트리 + 파일 업로드/다운로드/삭제
- 매뉴얼/공지사항: 게시판형 CRUD + 첨부파일
- 안전관리: 안전보건교육, TBM현황, 위험성평가, 재해예방조치
- 품질관리: 시정조치 UI 페이지
- 대시보드: 슈퍼관리자 전용 레거시 사이트 참고 카드
- 작업일보/출면일보 오류 수정 및 기능 개선
- 설비 사진 업로드, 근로계약서 종료일 수정
- 일별 출면일보 마스터 + 인원/장비 3테이블 마이그레이션
- 캘린더 스트립 (1~31일) 날짜 선택 및 상태 닷 표시
- 인원/장비 탭 CRUD (추가/수정/삭제/번개 랜덤데이터)
- 검토자 확인 모달 (조직도 + 검색 + 검토라인)
- 양식보기 모달 (출면일보/장비일보 인쇄 양식)
- 날씨/특이사항/상태 업데이트 API
- 고정연장근로수당 산정 계산 로직 구현 (기본급, 통상시급, 고정OT 자동 계산)
- 수정 모드에서 실시간 급여 산정 미리보기 테이블
- 조회 모드에서 요약/상세 급여 산정 내역 표시
- 식대, 월 고정연장근로시간 입력 필드 추가
- 계산 결과를 salary_info에 저장하여 급여관리에서 활용 가능
- PmisWorkforceController: 인원/직종 CRUD API
- PmisConstructionWorker, PmisJobType 모델 추가
- 인원등록 탭: 실제 DB CRUD, 페이지네이션, 필터, 모달
- 직종 44개 시드 데이터 등록
- API 라우트 추가 (workers, job-types)
- PMIS 전용 좌측 사이드바 (사용자 프로필 + 네비게이션 메뉴)
- 개인정보 관리 모달 (보기/수정 모드 전환)
- 연락처, 이메일, 성별 편집 및 서버 저장 기능
- 프로필 조회/수정 JSON API 엔드포인트 추가
- 3컬럼 레이아웃 (좌측 사이드바 + 대시보드 + 우측 퀵메뉴)
- 기존 대시보드 WeatherService를 활용한 JSON API 추가
- React 날씨 위젯에서 /juil/construction-pmis/weather 호출
- 기상청 API 기반 오늘/내일 날씨, 기온, 강수확률 표시
- Blade weather-icon과 동일한 SVG 아이콘 React 컴포넌트 구현
- 건설PMIS 메뉴 페이지 생성 (construction-pmis.blade.php)
- 업무 Flow 보기 버튼 → 모달창 4개 탭 구현
- KCC KOUP 업무 Flow 이미지 4장 포함
- PlanningController에 constructionPmis 메서드 추가
- TenantMailConfigController: 목록, 편집, 저장, SMTP 테스트 API
- TenantMailConfig, MailLog 모델 추가
- SmtpConnectionTester: SMTP 연결 테스트 서비스 (에러 코드, 트러블슈팅)
- TenantMailService: 테넌트 설정 기반 메일 발송 (쿼터, Fallback)
- config/mail-presets.php: Gmail/Naver/MS365 등 8개 SMTP 프리셋
- Blade 뷰: 테넌트 목록 현황 + 설정 폼 (프리셋 자동 채움, 연결 테스트)
- 라우트 추가: /system/tenant-mail/*
- API에서 approval_steps 테이블에 tenant_id, deleted_at 추가에 따른 동기화
- ApprovalStep 모델에 SoftDeletes 추가, tenant_id fillable 추가
- ApprovalStep::create() 시 tenant_id 포함 (2곳)
- K_PATH_FONTS 상수가 TCPDF vendor 경로로 선점되면 pretendard 폰트를 못 찾는 문제
- AddFont()으로 storage/fonts/tcpdf/ 경로를 직접 지정하여 확실하게 로드
- 폴백: resources/fonts/Pretendard-Regular.ttf → helvetica
- chroot에 storage_path('fonts') 추가 (symlink→shared 경로 허용)
- 폰트를 resources→storage로 복사 후 storage 경로로 등록 (릴리스 불변)
- 배포마다 .ufm 메트릭 재생성 방지
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- setOptions()가 config의 chroot(base_path)를 new Options()로 전체 교체 → vendor 기본값으로 리셋
- resource_path 폰트 경로가 chroot 밖으로 판정되어 registerFont() false 반환
- setOptions 제거 → config/dompdf.php 설정(font_dir, font_cache, chroot) 그대로 사용
- storage 수동 복사도 제거 → DomPDF가 내부적으로 font_dir에 복사 + .ufm 생성
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 기존: app()으로 별도 DomPDF 인스턴스에 폰트 등록 → Pdf::loadView()의 인스턴스에는 미적용
- 수정: $pdf->getDomPDF()로 동일 인스턴스에 폰트 등록 후 output() 호출
- Pretendard 폰트 사용, resources/fonts/에서 storage/fonts/로 복사 후 등록
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- setOptions()로 font_dir, font_cache, enable_font_subsetting 직접 전달
- ensureKoreanFont()에서도 DomPDF 옵션을 명시적으로 설정
- 캐시 유효성 검증 강화: TTF + .ufm 메트릭 파일 모두 확인
- config 캐시 상태와 무관하게 storage/fonts/ 사용 보장
- periodReport에서 데이터 조회 전 바로빌 API 자동 동기화 트리거
- BarobillBankSyncService 서비스 클래스 생성 (EaccountController 로직 분리)
- 현재 월 캐시 10분 만료, 과거 월 영구 캐시 정책 동일 적용
- 동기화 실패 시 기존 DB 캐시로 폴백 (서비스 중단 방지)