// Version: 1.0.0 import 'dart:convert'; /// 見積(Estimate)モデル class Estimate { final int id; final String estimateNo; // 見積書 No. final int? customerId; final String customerName; final DateTime date; final List items; final double taxRate; final double totalAmount; Estimate({ required this.id, required this.estimateNo, this.customerId, required this.customerName, required this.date, required this.items, required this.taxRate, required this.totalAmount, }); /// 引数の ID が重複しているか確認する(null 許容) bool hasDuplicateId(int? id) { if (id == null) return false; // items に productId が重複していないか確認 final itemIds = items.map((item) => item.productId).toSet(); return !itemIds.contains(id); } Map toMap() { return { 'id': id, 'estimateNo': estimateNo, 'customerId': customerId, 'customerName': customerName, 'date': date.toIso8601String(), 'itemsJson': jsonEncode(items.map((e) => e.toMap()).toList()), 'taxRate': taxRate, 'totalAmount': totalAmount, }; } factory Estimate.fromMap(Map map) { final items = (map['itemsJson'] as String?) != null ? ((jsonDecode(map['itemsJson']) as List) .map((e) => EstimateItem.fromMap(e as Map)) .toList()) : []; return Estimate( id: map['id'] as int, estimateNo: map['estimateNo'] as String, customerId: map['customerId'] as int?, customerName: map['customerName'] as String, date: DateTime.parse(map['date'] as String), items: items, taxRate: (map['taxRate'] as num).toDouble(), totalAmount: (map['totalAmount'] as num).toDouble(), ); } String toJson() => jsonEncode(toMap()); } /// 見積行(EstimateItem)モデル class EstimateItem { final int id; final int? productId; final String productName; final int quantity; final double unitPrice; final double total; EstimateItem({ required this.id, this.productId, required this.productName, required this.quantity, required this.unitPrice, required this.total, }); Map toMap() { return { 'id': id, 'productId': productId, 'productName': productName, 'quantity': quantity, 'unitPrice': unitPrice, 'total': total, }; } factory EstimateItem.fromMap(Map map) { return EstimateItem( id: map['id'] as int, productId: map['productId'] as int?, productName: map['productName'] as String, quantity: map['quantity'] as int, unitPrice: (map['unitPrice'] as num).toDouble(), total: (map['total'] as num).toDouble(), ); } String toJson() => jsonEncode(toMap()); }