- addTTFfont()는 storage에 캐시만 생성하고 SetFont() 시 K_PATH_FONTS(vendor)에서 찾아 실패
- registerKoreanFont()로 분리: 캐시 생성 + $pdf->AddFont() 전체 경로 등록
- mergeSignatures(), generatePreview() 양쪽에 적용
- getKoreanFont()에서 폰트 캐시를 vendor/tcpdf/fonts/ 대신 storage/app/private/fonts/에 저장
- www-data가 vendor 디렉토리에 쓸 수 없는 운영 환경 권한 문제 해결
- 배포 시마다 vendor가 새로 생성되어도 폰트 캐시가 shared/storage에 유지됨
- EquipmentPhotoService: uploadPhotoFromPath() 추가, 압축 메서드 public 전환
- EquipmentImportService: Drawing 추출/임시파일 저장/사진 업로드 통합
- EquipmentController: Import 응답 메시지에 사진 업로드 결과 포함
- GD 라이브러리로 업로드 전 이미지 압축 처리
- 장축 2048px 초과 시 리사이즈 (비율 유지)
- JPEG 품질 85→40 점진적 감소로 1MB 이하 보장
- PNG(투명 없음)/GIF/BMP → JPEG 자동 변환
- PNG(투명 있음) → PNG 유지 (압축 레벨 9)
- 임시파일 자동 정리 (finally 블록)
- 모델 6개 (Equipment, InspectionTemplate, Inspection, InspectionDetail, Repair, Process)
- 서비스 3개 (Equipment, Inspection, Repair)
- API 컨트롤러 3개 + FormRequest 4개
- Blade 컨트롤러 + 라우트 등록
- 뷰: 대시보드, 등록대장(CRUD), 일상점검표(캘린더 그리드), 수리이력
- store(): GCS뿐 아니라 local_path 도장도 signer에 자동 적용
- getContract(): signer에 도장 없어도 tenant_settings에서 확인하여 has_stamp 반환
- submitSignature(): 기존 계약 creator도 tenant_settings에서 도장 가져와 적용
- SmsController (WEB): 카카오톡 패턴 동일한 HX-Redirect 처리
- BarobillSmsController (API): 발송, 발신번호 조회/확인, 전송상태 조회
- SMS 발송 테스트 블레이드 뷰: 발신번호 목록, 바이트 카운터, 발송 결과 표시
- web.php: barobill/sms/send 라우트 추가
- api.php: barobill/sms API 라우트 4개 추가
- /equipment/guide 라우트 및 컨트롤러 메서드 추가
- guide.blade.php 신규 생성 (히어로+TOC+5섹션+FAQ)
- academy-glossary에 equipment 도메인 용어 20개 추가
- 품질인정심사(ISO 9001) 대응 가이드, 보전 기초지식 포함
menu_sync_api_key를 config/app.php에 등록하여 config:cache 후에도
env() 값이 정상 반환되도록 수정. 컨트롤러에서 env() 직접 호출 제거.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 아카데미 하위에 경정청구 페이지 신규 생성
- sales 경정청구 자료를 MNG 아카데미 패턴으로 변환
- SAM 제안 형태: 청년 판정, 권역 판정, 데이터 통합 자동화
- Chart.js 차트 4종 포함 (소요시간, 비용절감, 오류유형, 이용자추이)
- 학습 가이드 (용어 해설 + 퀴즈 5문항)
- startDate 이전 누적 데이터로 이월잔액(priorBalance) 계산 추가
- 잔액 공식 변경: 이월잔액 + 당기발생 - 당기상계
- 이월잔액만 있고 당기 거래 없는 거래처도 목록에 포함
- 통계 카드에 이월잔액 표시 추가
- 거래처 테이블에 이월잔액 열 추가
- handleOpenJournalModal에 splits 데이터 전달
- getDefaultLines()에서 splits 기반 차변 라인 자동 생성
- 공제 항목: 비용계정 + 부가세대급금 분리, 불공제: 합산
- 분개 모달에 분리 데이터 기반 인디케이터 배지 표시
- storeJournal의 splits 자동삭제 코드 제거 (분리+분개 공존)
- 기존 '분개' 열을 '분리'(금액 나누기)와 '분개'(복식부기) 두 열로 분리
- SplitModal 텍스트를 '분개'에서 '분리'로 변경
- CSV 내보내기 텍스트도 '분리'로 통일
- 분리 열: 금액 분리 기능 (SplitModal)
- 분개 열: 복식부기 분개 기능 (CardJournalModal)
- EcardController에 storeJournal/getJournal/deleteJournal/getJournalStatuses 4개 메서드 추가
- journal_entries + journal_entry_lines 통합 (source_type='ecard_transaction')
- CardJournalModal 차변/대변 복식부기 UI 추가
- 거래 테이블에 분개완료/구버전/미분개 3단계 상태 표시
- 기존 splits 데이터 자동 전환 지원
- SenderID: 바로빌 계정 ID (barobill_id) 사용
- YellowId: 카카오톡 채널 ID 필수 전달 (기존에 빈값)
- SmsReply: 'N' (대체문자 미발송) 또는 'S' (발송) 명시
- 템플릿 본문: API에서 조회 후 변수 치환 (정확한 포맷 유지)
- getKakaotalkSenderId → getKakaotalkChannelId 이름 변경
- EsignPublicController: 잘못된 필드명(corp_num, is_test_mode) 수정
- EsignRequestMail, EsignOtpMail, EsignCompletedMail에 from 주소 명시
- config/mail.php에 contact_from_address 설정 추가
- .env의 CONTACT_MAIL_FROM_ADDRESS(contact@codebridge-x.com) 사용
- WSDL 스펙에 맞게 KakaotalkMessage 중첩 구조로 변경
- ReceiverName, ReceiverNum 등을 최상위에서 KakaotalkMessage 내부로 이동
- ReserveDT → SendDT로 파라미터명 수정
- SendATKakaotalkEx에 YellowId 파라미터 추가
- 버튼 배열을 KakaotalkButton 래핑 구조로 변경
- sendATKakaotalks 대량 발송도 WSDL 구조에 맞게 수정
- esign 알림톡 메시지 본문을 등록 템플릿에 맞게 조정