fix(inventory): 파트너 연동 및 상세 모달 동작 안정화

- 입고 레코드에 파트너 식별자와 고객 요약을 캐싱하고 상세 칩으로 노출

- 입고 등록 모달에서 파트너 선택 복원과 고객 동기화를 지원하며 취소 시 상세를 복귀하도록 수정

- 재고 컨트롤러에 고객 동기화 유틸리티와 결재 상태 로딩을 추가하고 단위 테스트를 확장

- 제품·파트너 자동완성 위젯을 재작성해 초기 로딩, 검색, 외부 컨트롤러 동기화를 안정화

- 재고 상세/공통 모달 닫기와 출고·대여 편집 모달의 네비게이터 호출을 루트 기준으로 통일

- 테스트: flutter analyze, flutter test (기존 레이아웃 검증 케이스 실패 지속)
This commit is contained in:
JiWoong Sul
2025-10-27 20:02:21 +09:00
parent 14624c4165
commit 259b056072
14 changed files with 1054 additions and 155 deletions

View File

@@ -9,6 +9,7 @@ import 'package:superport_v2/features/inventory/transactions/domain/entities/sto
import 'package:superport_v2/features/inventory/transactions/domain/entities/stock_transaction_input.dart';
import 'package:superport_v2/features/inventory/transactions/domain/repositories/stock_transaction_repository.dart';
import 'package:superport_v2/features/inventory/lookups/domain/repositories/inventory_lookup_repository.dart';
import 'package:superport_v2/features/inventory/transactions/presentation/services/transaction_detail_sync_service.dart';
class _MockStockTransactionRepository extends Mock
implements StockTransactionRepository {}
@@ -19,6 +20,9 @@ class _MockInventoryLookupRepository extends Mock
class _MockTransactionLineRepository extends Mock
implements TransactionLineRepository {}
class _MockTransactionCustomerRepository extends Mock
implements TransactionCustomerRepository {}
class _FakeStockTransactionCreateInput extends Fake
implements StockTransactionCreateInput {}
@@ -28,26 +32,39 @@ class _FakeStockTransactionUpdateInput extends Fake
class _FakeStockTransactionListFilter extends Fake
implements StockTransactionListFilter {}
class _FakeTransactionCustomerCreateInput extends Fake
implements TransactionCustomerCreateInput {}
class _FakeTransactionCustomerUpdateInput extends Fake
implements TransactionCustomerUpdateInput {}
void main() {
group('InboundController', () {
late StockTransactionRepository transactionRepository;
late InventoryLookupRepository lookupRepository;
late TransactionLineRepository lineRepository;
late TransactionCustomerRepository customerRepository;
late InboundController controller;
setUpAll(() {
registerFallbackValue(_FakeStockTransactionCreateInput());
registerFallbackValue(_FakeStockTransactionUpdateInput());
registerFallbackValue(_FakeStockTransactionListFilter());
registerFallbackValue(_FakeTransactionCustomerCreateInput());
registerFallbackValue(_FakeTransactionCustomerUpdateInput());
registerFallbackValue(<TransactionCustomerCreateInput>[]);
registerFallbackValue(<TransactionCustomerUpdateInput>[]);
});
setUp(() {
transactionRepository = _MockStockTransactionRepository();
lookupRepository = _MockInventoryLookupRepository();
lineRepository = _MockTransactionLineRepository();
customerRepository = _MockTransactionCustomerRepository();
controller = InboundController(
transactionRepository: transactionRepository,
lineRepository: lineRepository,
customerRepository: customerRepository,
lookupRepository: lookupRepository,
);
});
@@ -156,6 +173,30 @@ void main() {
verify(() => transactionRepository.delete(transaction.id!)).called(1);
});
test('syncTransactionCustomers는 계획에 따라 저장소를 호출한다', () async {
when(
() => customerRepository.updateCustomers(any(), any()),
).thenAnswer((_) async {});
when(
() => customerRepository.deleteCustomer(any()),
).thenAnswer((_) async {});
when(
() => customerRepository.addCustomers(any(), any()),
).thenAnswer((_) async {});
final plan = TransactionCustomerSyncPlan(
createdCustomers: [TransactionCustomerCreateInput(customerId: 7)],
updatedCustomers: [TransactionCustomerUpdateInput(id: 2, note: '메모')],
deletedCustomerIds: const [5],
);
await controller.syncTransactionCustomers(42, plan);
verify(() => customerRepository.updateCustomers(42, any())).called(1);
verify(() => customerRepository.deleteCustomer(5)).called(1);
verify(() => customerRepository.addCustomers(42, any())).called(1);
});
test('submitTransaction은 refreshAfter가 true일 때 목록을 다시 불러온다', () async {
final filter = StockTransactionListFilter(transactionTypeId: 1);
final initial = _buildTransaction();