import 'package:dartz/dartz.dart'; import '../../../data/models/equipment_history_dto.dart'; import '../../../core/errors/failures.dart'; import '../equipment_history_usecase.dart'; import '../base_usecase.dart'; /// 장비 출고 파라미터 (백엔드 스키마 기반) class EquipmentOutParams { final int equipmentsId; final int warehousesId; final int quantity; final DateTime? transactedAt; final String? remark; const EquipmentOutParams({ required this.equipmentsId, required this.warehousesId, required this.quantity, this.transactedAt, this.remark, }); } /// 장비 출고 UseCase (백엔드 스키마 기반) /// 창고에서 장비 출고 처리 class EquipmentOutUseCase extends UseCase { final EquipmentHistoryUseCase _equipmentHistoryUseCase; EquipmentOutUseCase(this._equipmentHistoryUseCase); @override Future> call(EquipmentOutParams params) async { try { // 유효성 검증 final validationResult = _validateInput(params); if (validationResult != null) { return Left(validationResult); } // 백엔드 EquipmentHistoryUseCase를 통한 출고 처리 final response = await _equipmentHistoryUseCase.createStockOut( equipmentsId: params.equipmentsId, warehousesId: params.warehousesId, quantity: params.quantity, transactedAt: params.transactedAt, remark: params.remark, ); return Right(response); } catch (e) { if (e.toString().contains('재고')) { return Left(ValidationFailure( message: '출고 가능한 재고가 부족합니다.', code: 'INSUFFICIENT_STOCK', originalError: e, )); } else if (e.toString().contains('수량')) { return Left(ValidationFailure( message: '출고 수량을 확인해주세요.', code: 'INVALID_QUANTITY', originalError: e, )); } else if (e.toString().contains('권한')) { return Left(PermissionFailure( message: '장비 출고 권한이 없습니다.', code: 'PERMISSION_DENIED', originalError: e, )); } else { return Left(ServerFailure( message: '장비 출고 처리 중 오류가 발생했습니다.', originalError: e, )); } } } ValidationFailure? _validateInput(EquipmentOutParams params) { final errors = {}; // 수량 검증 if (params.quantity <= 0) { errors['quantity'] = '출고 수량은 1개 이상이어야 합니다.'; } if (params.quantity > 999) { errors['quantity'] = '한 번에 출고 가능한 최대 수량은 999개입니다.'; } // 날짜 검증 (선택사항) if (params.transactedAt != null && params.transactedAt!.isAfter(DateTime.now())) { errors['transactedAt'] = '출고 날짜는 미래 날짜일 수 없습니다.'; } if (errors.isNotEmpty) { return ValidationFailure( message: '입력값을 확인해주세요.', errors: errors, ); } return null; } }