feat(B01,B07): 설계일자 사용자 지정 입력 + 도면번호 자동 부여

사용자 확정(2026-09-02): 설계일자는 확정일 자동이 아니라 **사용자가 넣는다**. 도면번호는
Claude 판단으로 목록 순번을 쓴다.

설계일자
- `013_company_assets.sql` 로 `projects.design_date DATE` 추가(같은 마이그레이션에
  로고·서명 공유 테이블 자리도 함께 만들었음 — 배선은 다음 커밋).
- B01 프로젝트 수정 모달에 날짜 칸. 공용 `createInputField` 가 `type="date"` 를 받게 넓힘.
- 표제란에는 도면 표기 관행대로 `2026. 09. 02.` 꼴로 적는다.

도면번호
- 단건 조회는 목록 순서를 모른다 — 알려면 횡단 장 계획을 다시 계산해야 하고 도면을 열
  때마다 그러면 비싸다. **목록이 매긴 번호를 manifest 에 적어 두고** 단건 조회가 읽는다.
  목록은 화면 진입 때 늘 먼저 뜨므로 성립하고, 목록이 바뀌면 다음 조회에서 다시 적힌다.
- `add_title_fields()` 신설 — 도면을 읽는 도중에 아는 값을 문맥에 얹는 창구.

검증: `pytest tmp/tests/ -q` 139 passed / 0 failed, 루트 `tsc --noEmit` 통과.
실사용자 경로(5174, wdw) — 대시보드 [수정] 모달 라벨 10개(설계일자 칸 추가 확인) →
`2026-09-02` 입력 → [확인] → 종단면도 표제란에 `2026. 09. 02.`.
도면번호는 목록 13건 기준 종단 1 · 유역도 6 · 용지도 13 이 도각에 그대로 실림
(표지는 도각을 두르지 않아 번호 칸이 없다).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-02 11:38:50 +09:00
co-authored by Claude Opus 5
parent 56aed2f2aa
commit 313a7dde43
9 changed files with 97 additions and 11 deletions
+34
View File
@@ -0,0 +1,34 @@
-- 013_company_assets.sql
-- 설계일자·도면 자산(로고·서명) 회사 공유 (2026-09-02 사용자 확정)
--
-- ① 설계일자는 확정일 자동이 아니라 **사용자가 지정 입력**한다.
-- ② 로고·서명은 **회사 안에서 공유하는 목록**으로 관리한다. 사용자 계정에 물릴 수도 있고
-- 아닐 수도 있다(회사 공용 직인 등). 회사 구성원과 회사 관리자가 작성·수정하고,
-- 시스템 관리자는 전체 권한을 가진다.
-- ③ 도면이 어느 로고·서명을 쓸지는 **프로젝트가 고른다** — 목록에서 골라 물린다.
--
-- 011 의 `companies.logo_path`·`users.signature_path` 는 이 표가 정본이 되면서 읽지 않는다.
-- 컬럼은 남겨 둔다(4환경 공유 DB 라 지우는 쪽이 위험하다).
USE aislo_db;
ALTER TABLE projects
ADD COLUMN IF NOT EXISTS design_date DATE NULL COMMENT '설계일자 (사용자 지정)' AFTER work_amount,
ADD COLUMN IF NOT EXISTS logo_asset_id INT NULL COMMENT '도면에 쓸 회사 로고 (company_assets.id)',
ADD COLUMN IF NOT EXISTS signature_asset_id INT NULL COMMENT '도면에 쓸 서명 (company_assets.id)';
-- 회사 안에서 공유하는 도면 자산. 그림은 파일로 두고 경로만 담는다.
CREATE TABLE IF NOT EXISTS company_assets (
id INT AUTO_INCREMENT PRIMARY KEY,
company_id INT NOT NULL,
kind ENUM('LOGO', 'SIGNATURE') NOT NULL,
label VARCHAR(100) NOT NULL COMMENT '목록에 보이는 이름',
file_path VARCHAR(500) NOT NULL COMMENT 'storage/ 기준 상대 경로',
user_id INT NULL COMMENT '이 자산의 주인 (없으면 회사 공용)',
created_by INT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted_at TIMESTAMP NULL DEFAULT NULL,
INDEX idx_company_assets_company (company_id, kind, deleted_at),
INDEX idx_company_assets_user (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;