feat(inventory): 재고 현황 요약/상세 플로우를 릴리스

- lib/features/inventory/summary 계층과 warehouse select 위젯을 추가해 목록/상세, 자동 새로고침, 필터, 상세 시트를 구현

- PermissionBootstrapper, scope 파서, 라우트 가드로 inventory.view 기반 권한 부여와 메뉴 노출을 통합(lib/core, lib/main.dart 등)

- Inventory Summary API/QA/Audit 문서와 PR 템플릿, CHANGELOG를 신규 스펙과 검증 커맨드로 업데이트

- DTO 직렬화 의존성을 추가하고 Golden·Widget·단위 테스트를 작성했으며 flutter analyze / flutter test --coverage를 통과
This commit is contained in:
JiWoong Sul
2025-11-09 01:13:02 +09:00
parent 486ab8706f
commit 47cc62a33d
72 changed files with 5453 additions and 1021 deletions

View File

@@ -880,10 +880,7 @@ class _TemplateToolbar extends StatelessWidget {
);
if (!canApplyTemplate) {
applyButton = Tooltip(
message: '템플릿을 적용할 권한이 없습니다.',
child: applyButton,
);
applyButton = Tooltip(message: '템플릿을 적용할 권한이 없습니다.', child: applyButton);
}
return Column(

View File

@@ -29,11 +29,7 @@ class ApprovalFormInitializer {
controller.setRequester(defaultRequester);
}
if (draft != null) {
await _applyDraft(
controller,
draft,
repository ?? _resolveRepository(),
);
await _applyDraft(controller, draft, repository ?? _resolveRepository());
}
}

View File

@@ -508,7 +508,6 @@ class _ConfiguratorDialogBodyState extends State<_ConfiguratorDialogBody> {
}
idController.dispose();
}
}
class _InfoBadge extends StatelessWidget {

View File

@@ -27,12 +27,11 @@ class ApprovalApproverCandidateDto {
: null;
return ApprovalApproverCandidateDto(
id: json['id'] as int? ?? JsonUtils.readInt(json, 'user_id', fallback: 0),
employeeNo: json['employee_id'] as String? ??
employeeNo:
json['employee_id'] as String? ??
json['employee_no'] as String? ??
'-',
name: json['name'] as String? ??
json['employee_name'] as String? ??
'-',
name: json['name'] as String? ?? json['employee_name'] as String? ?? '-',
team: group?['group_name'] as String? ?? json['team'] as String?,
email: json['email'] as String?,
phone: json['phone'] as String? ?? json['mobile_no'] as String?,