refactor: 인벤토리 테이블 스펙과 도메인 계층 정비

This commit is contained in:
JiWoong Sul
2025-10-14 18:09:26 +09:00
parent 8d3b2c1e20
commit 1325109fba
32 changed files with 5550 additions and 290 deletions

View File

@@ -0,0 +1,154 @@
import 'package:superport_v2/features/inventory/transactions/domain/entities/stock_transaction.dart';
/// 대여/반납 화면에서 사용하는 UI 전용 레코드 모델.
class RentalRecord {
RentalRecord({
this.id,
required this.number,
required this.transactionNumber,
required this.transactionType,
required this.rentalType,
this.transactionTypeId,
required this.processedAt,
required this.warehouse,
this.warehouseId,
required this.status,
this.statusId,
required this.writer,
this.writerId,
required this.remark,
required this.returnDueDate,
required this.items,
required this.customers,
this.raw,
});
factory RentalRecord.fromTransaction(StockTransaction transaction) {
return RentalRecord(
id: transaction.id,
number: transaction.transactionNo,
transactionNumber: transaction.transactionNo,
transactionType: transaction.type.name,
rentalType: transaction.type.name,
transactionTypeId: transaction.type.id,
processedAt: transaction.transactionDate,
warehouse: transaction.warehouse.name,
warehouseId: transaction.warehouse.id,
status: transaction.status.name,
statusId: transaction.status.id,
writer: transaction.createdBy.name,
writerId: transaction.createdBy.id,
remark: transaction.note ?? '-',
returnDueDate: transaction.expectedReturnDate,
items: transaction.lines
.map(RentalLineItem.fromLine)
.toList(growable: false),
customers: transaction.customers
.map(RentalCustomer.fromLink)
.toList(growable: false),
raw: transaction,
);
}
final int? id;
final String number;
final String transactionNumber;
final String transactionType;
final String rentalType;
final int? transactionTypeId;
final DateTime processedAt;
final String warehouse;
final int? warehouseId;
final String status;
final int? statusId;
final String writer;
final int? writerId;
final String remark;
final DateTime? returnDueDate;
final List<RentalLineItem> items;
final List<RentalCustomer> customers;
final StockTransaction? raw;
int get customerCount => customers.length;
int get itemCount => items.length;
int get totalQuantity =>
items.fold<int>(0, (sum, item) => sum + item.quantity);
double get totalAmount =>
items.fold<double>(0, (sum, item) => sum + (item.price * item.quantity));
}
/// 대여 상세 모달에 표시되는 품목 정보.
class RentalLineItem {
RentalLineItem({
this.id,
int? lineNo,
int? productId,
String? productCode,
required this.product,
required this.manufacturer,
required this.unit,
required this.quantity,
required this.price,
required this.remark,
}) : lineNo = lineNo ?? 0,
productId = productId ?? 0,
productCode = productCode ?? '';
factory RentalLineItem.fromLine(StockTransactionLine line) {
final product = line.product;
return RentalLineItem(
id: line.id,
lineNo: line.lineNo,
productId: product.id,
productCode: product.code,
product: product.name,
manufacturer: product.vendor?.name ?? '-',
unit: product.uom?.name ?? '-',
quantity: line.quantity,
price: line.unitPrice,
remark: line.note ?? '',
);
}
final int? id;
final int lineNo;
final int productId;
final String productCode;
final String product;
final String manufacturer;
final String unit;
final int quantity;
final double price;
final String remark;
}
/// 대여 고객 연결 요약 정보.
class RentalCustomer {
RentalCustomer({
this.id,
required this.customerId,
required this.code,
required this.name,
this.note,
});
factory RentalCustomer.fromLink(StockTransactionCustomer link) {
final summary = link.customer;
return RentalCustomer(
id: link.id,
customerId: summary.id,
code: summary.code,
name: summary.name,
note: link.note,
);
}
final int? id;
final int customerId;
final String code;
final String name;
final String? note;
}