import 'package:dartz/dartz.dart'; import '../../core/errors/failures.dart'; import '../../models/warehouse_location_model.dart'; import '../../data/models/common/paginated_response.dart'; /// 창고 위치 관리 Repository 인터페이스 /// 장비 입고지 및 창고 위치 정보 관리를 담당 abstract class WarehouseLocationRepository { /// 창고 위치 목록 조회 /// [page] 페이지 번호 (기본값: 1) /// [limit] 페이지당 항목 수 (기본값: 20) /// [search] 검색어 (창고명, 주소, 담당자명 등) /// [locationType] 위치 유형 필터 ('창고', '사무실', '출고지' 등) /// [isActive] 활성화 상태 필터 /// [hasEquipment] 장비 보유 여부 필터 /// [sortBy] 정렬 기준 ('name', 'createdAt', 'locationType' 등) /// [sortOrder] 정렬 순서 ('asc', 'desc') /// Returns: 페이지네이션된 창고 위치 목록 Future>> getWarehouseLocations({ int? page, int? limit, String? search, String? locationType, bool? isActive, bool? hasEquipment, String? sortBy, String? sortOrder, }); /// 창고 위치 상세 정보 조회 /// [id] 창고 위치 고유 식별자 /// Returns: 창고 위치 상세 정보 (보관 중인 장비 정보 포함) Future> getWarehouseLocationById(int id); /// 창고 위치 생성 /// [warehouseLocation] 생성할 창고 위치 정보 /// Returns: 생성된 창고 위치 정보 (ID 포함) Future> createWarehouseLocation(WarehouseLocation warehouseLocation); /// 창고 위치 정보 수정 /// [id] 수정할 창고 위치 고유 식별자 /// [warehouseLocation] 수정할 창고 위치 정보 /// Returns: 수정된 창고 위치 정보 Future> updateWarehouseLocation(int id, WarehouseLocation warehouseLocation); /// 창고 위치 삭제 /// [id] 삭제할 창고 위치 고유 식별자 /// Returns: 삭제 성공/실패 여부 Future> deleteWarehouseLocation(int id); /// 창고 위치 상태 토글 (활성화/비활성화) /// [id] 상태를 변경할 창고 위치 고유 식별자 /// Returns: 상태 변경된 창고 위치 정보 Future> toggleWarehouseLocationStatus(int id); /// 창고에 장비가 있는지 확인 /// [id] 확인할 창고 위치 ID /// Returns: 장비 보유 여부 (삭제 가능 여부 판단용) Future> hasEquipment(int id); /// 창고별 장비 수량 조회 /// [id] 창고 위치 ID /// Returns: 해당 창고에 보관 중인 장비 수량 Future> getEquipmentCount(int id); /// 창고별 장비 목록 조회 /// [warehouseId] 창고 위치 ID /// [page] 페이지 번호 /// [limit] 페이지당 항목 수 /// Returns: 해당 창고에 보관 중인 장비 목록 Future>> getEquipmentByWarehouse( int warehouseId, { int? page, int? limit, }); /// 창고 사용률 통계 /// Returns: 창고별 사용률 (전체 용량 대비 사용 중인 용량) Future>> getWarehouseUtilization(); /// 창고 유형별 통계 /// Returns: 창고 유형별 개수 ('창고', '사무실', '출고지' 등) Future>> getWarehouseCountByType(); /// 창고명 중복 체크 /// [name] 체크할 창고명 /// [excludeId] 체크에서 제외할 창고 ID (수정 시 현재 창고 제외용) /// Returns: 중복 여부 (true: 중복됨, false: 중복되지 않음) Future> isDuplicateWarehouseName(String name, {int? excludeId}); /// 창고 검색 (자동완성용) /// [query] 검색 쿼리 /// [limit] 결과 제한 수 (기본값: 10) /// Returns: 일치하는 창고 위치 목록 Future>> searchWarehouseLocations(String query, {int? limit}); /// 활성 창고 위치 목록 조회 (드롭다운용) /// 장비 등록 시 선택 가능한 활성 상태의 창고 위치만 조회 /// Returns: 활성화된 창고 위치 목록 Future>> getActiveWarehouseLocations(); /// 창고 용량 및 사용량 업데이트 /// [id] 창고 위치 ID /// [totalCapacity] 전체 용량 /// [usedCapacity] 사용 중인 용량 /// Returns: 업데이트된 창고 위치 정보 Future> updateWarehouseCapacity( int id, int totalCapacity, int usedCapacity, ); }