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,119 @@
import 'package:superport_v2/features/inventory/transactions/domain/entities/stock_transaction.dart';
/// 입고 화면에서 사용하는 UI 전용 레코드 모델.
class InboundRecord {
InboundRecord({
this.id,
required this.number,
required this.transactionNumber,
required this.transactionType,
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.items,
this.expectedReturnDate,
this.isActive = true,
this.raw,
});
factory InboundRecord.fromTransaction(StockTransaction transaction) {
return InboundRecord(
id: transaction.id,
number: transaction.transactionNo,
transactionNumber: transaction.transactionNo,
transactionType: 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 ?? '-',
items: transaction.lines
.map(InboundLineItem.fromLine)
.toList(growable: false),
expectedReturnDate: transaction.expectedReturnDate,
isActive: transaction.isActive,
raw: transaction,
);
}
final int? id;
final String number;
final String transactionNumber;
final String transactionType;
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 List<InboundLineItem> items;
final DateTime? expectedReturnDate;
final bool isActive;
final StockTransaction? raw;
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 InboundLineItem {
InboundLineItem({
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 InboundLineItem.fromLine(StockTransactionLine line) {
final product = line.product;
return InboundLineItem(
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;
}