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

@@ -22,10 +22,18 @@ class InboundRecord {
required this.items,
this.expectedReturnDate,
this.isActive = true,
this.partnerLinkId,
this.partnerId,
this.partnerCode,
this.partnerName,
this.raw,
});
factory InboundRecord.fromTransaction(StockTransaction transaction) {
final partnerLink = transaction.customers.isNotEmpty
? transaction.customers.first
: null;
final partnerSummary = partnerLink?.customer;
return InboundRecord(
id: transaction.id,
number: transaction.transactionNo,
@@ -48,6 +56,10 @@ class InboundRecord {
.toList(growable: false),
expectedReturnDate: transaction.expectedReturnDate,
isActive: transaction.isActive,
partnerLinkId: partnerLink?.id,
partnerId: partnerSummary?.id,
partnerCode: partnerSummary?.code,
partnerName: partnerSummary?.name,
raw: transaction,
);
}
@@ -71,6 +83,10 @@ class InboundRecord {
final List<InboundLineItem> items;
final DateTime? expectedReturnDate;
final bool isActive;
final int? partnerLinkId;
final int? partnerId;
final String? partnerCode;
final String? partnerName;
final StockTransaction? raw;
int get itemCount => items.length;
@@ -80,6 +96,42 @@ class InboundRecord {
double get totalAmount =>
items.fold<double>(0, (sum, item) => sum + (item.price * item.quantity));
/// 파트너사 정보가 존재하는지 여부를 반환한다.
bool get hasPartner =>
partnerId != null && (partnerName?.trim().isNotEmpty ?? false);
/// 현재 레코드에 연결된 파트너사 고객 정보를 반환한다.
StockTransactionCustomer? get primaryCustomer {
final rawCustomers = raw?.customers;
if (rawCustomers != null && rawCustomers.isNotEmpty) {
return rawCustomers.first;
}
if (!hasPartner) {
return null;
}
return StockTransactionCustomer(
id: partnerLinkId,
customer: StockTransactionCustomerSummary(
id: partnerId!,
code: partnerCode ?? '',
name: partnerName ?? '',
),
);
}
/// 현재 파트너사 고객 목록을 반환한다. `raw` 정보가 없을 경우 보조 필드를 활용한다.
List<StockTransactionCustomer> get customers {
final rawCustomers = raw?.customers;
if (rawCustomers != null && rawCustomers.isNotEmpty) {
return rawCustomers;
}
final fallback = primaryCustomer;
if (fallback == null) {
return const [];
}
return [fallback];
}
}
/// 입고 상세 모달에서 사용하는 품목 정보.