fix(inventory): 파트너 연동 및 상세 모달 동작 안정화
- 입고 레코드에 파트너 식별자와 고객 요약을 캐싱하고 상세 칩으로 노출 - 입고 등록 모달에서 파트너 선택 복원과 고객 동기화를 지원하며 취소 시 상세를 복귀하도록 수정 - 재고 컨트롤러에 고객 동기화 유틸리티와 결재 상태 로딩을 추가하고 단위 테스트를 확장 - 제품·파트너 자동완성 위젯을 재작성해 초기 로딩, 검색, 외부 컨트롤러 동기화를 안정화 - 재고 상세/공통 모달 닫기와 출고·대여 편집 모달의 네비게이터 호출을 루트 기준으로 통일 - 테스트: flutter analyze, flutter test (기존 레이아웃 검증 케이스 실패 지속)
This commit is contained in:
@@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
/// 입고 상세 모달에서 사용하는 품목 정보.
|
||||
|
||||
Reference in New Issue
Block a user