150 lines
5 KiB
Dart
150 lines
5 KiB
Dart
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import '../models/customer_model.dart';
|
|
import '../models/company_model.dart'; // Companyモデルをインポート
|
|
import '../data/product_master.dart';
|
|
|
|
/// 顧客マスター、商品マスター、自社情報のデータをローカルファイルに保存・管理するリポジトリ
|
|
class MasterRepository {
|
|
static const String _customerFileName = 'customers_master.json';
|
|
static const String _productFileName = 'products_master.json';
|
|
static const String _companyFileName = 'company_info.json'; // 自社情報ファイル名
|
|
|
|
/// 顧客マスターのファイルを取得
|
|
Future<File> _getCustomerFile() async {
|
|
final directory = await getApplicationDocumentsDirectory();
|
|
return File('${directory.path}/$_customerFileName');
|
|
}
|
|
|
|
/// 商品マスターのファイルを取得
|
|
Future<File> _getProductFile() async {
|
|
final directory = await getApplicationDocumentsDirectory();
|
|
return File('${directory.path}/$_productFileName');
|
|
}
|
|
|
|
/// 自社情報のファイルを取得
|
|
Future<File> _getCompanyFile() async {
|
|
final directory = await getApplicationDocumentsDirectory();
|
|
return File('${directory.path}/$_companyFileName');
|
|
}
|
|
|
|
// --- 顧客マスター操作 ---
|
|
|
|
/// 全ての顧客データを読み込む
|
|
Future<List<Customer>> loadCustomers() async {
|
|
try {
|
|
final file = await _getCustomerFile();
|
|
if (!await file.exists()) return [];
|
|
|
|
final String content = await file.readAsString();
|
|
final List<dynamic> jsonList = json.decode(content);
|
|
|
|
return jsonList.map((j) => Customer.fromJson(j)).toList();
|
|
} catch (e) {
|
|
debugPrint('Customer Master Loading Error: $e');
|
|
return [];
|
|
}
|
|
}
|
|
|
|
/// 顧客リストを保存する
|
|
Future<void> saveCustomers(List<Customer> customers) async {
|
|
try {
|
|
final file = await _getCustomerFile();
|
|
final String encoded = json.encode(customers.map((c) => c.toJson()).toList());
|
|
await file.writeAsString(encoded);
|
|
} catch (e) {
|
|
debugPrint('Customer Master Saving Error: $e');
|
|
}
|
|
}
|
|
|
|
/// 特定の顧客を追加または更新する簡易メソッド
|
|
Future<void> upsertCustomer(Customer customer) async {
|
|
final customers = await loadCustomers();
|
|
final index = customers.indexWhere((c) => c.id == customer.id);
|
|
if (index != -1) {
|
|
customers[index] = customer;
|
|
} else {
|
|
customers.add(customer);
|
|
}
|
|
await saveCustomers(customers);
|
|
}
|
|
|
|
// --- 商品マスター操作 ---
|
|
|
|
/// 全ての商品データを読み込む
|
|
/// ファイルがない場合は、ProductMasterに定義された初期データを返す
|
|
Future<List<Product>> loadProducts() async {
|
|
try {
|
|
final file = await _getProductFile();
|
|
if (!await file.exists()) {
|
|
// 初期データが存在しない場合は、ProductMasterのハードコードされたリストを返す
|
|
return List.from(ProductMaster.products);
|
|
}
|
|
|
|
final String content = await file.readAsString();
|
|
final List<dynamic> jsonList = json.decode(content);
|
|
|
|
return jsonList.map((j) => Product.fromJson(j)).toList();
|
|
} catch (e) {
|
|
debugPrint('Product Master Loading Error: $e');
|
|
return List.from(ProductMaster.products); // エラー時も初期データを返す
|
|
}
|
|
}
|
|
|
|
/// 商品リストを保存する
|
|
Future<void> saveProducts(List<Product> products) async {
|
|
try {
|
|
final file = await _getProductFile();
|
|
final String encoded = json.encode(products.map((p) => p.toJson()).toList());
|
|
await file.writeAsString(encoded);
|
|
} catch (e) {
|
|
debugPrint('Product Master Saving Error: $e');
|
|
}
|
|
}
|
|
|
|
/// 特定の商品を追加または更新する簡易メソッド
|
|
Future<void> upsertProduct(Product product) async {
|
|
final products = await loadProducts();
|
|
final index = products.indexWhere((p) => p.id == product.id);
|
|
if (index != -1) {
|
|
products[index] = product;
|
|
} else {
|
|
products.add(product);
|
|
}
|
|
await saveProducts(products);
|
|
}
|
|
|
|
// --- 自社情報操作 ---
|
|
|
|
/// 自社情報を読み込む
|
|
/// ファイルがない場合は、Company.defaultCompany を返す
|
|
Future<Company> loadCompany() async {
|
|
try {
|
|
final file = await _getCompanyFile();
|
|
if (!await file.exists()) {
|
|
return Company.defaultCompany;
|
|
}
|
|
|
|
final String content = await file.readAsString();
|
|
final Map<String, dynamic> jsonMap = json.decode(content);
|
|
|
|
return Company.fromJson(jsonMap);
|
|
} catch (e) {
|
|
debugPrint('Company Info Loading Error: $e');
|
|
return Company.defaultCompany; // エラー時もデフォルトを返す
|
|
}
|
|
}
|
|
|
|
/// 自社情報を保存する
|
|
Future<void> saveCompany(Company company) async {
|
|
try {
|
|
final file = await _getCompanyFile();
|
|
final String encoded = json.encode(company.toJson());
|
|
await file.writeAsString(encoded);
|
|
} catch (e) {
|
|
debugPrint('Company Info Saving Error: $e');
|
|
}
|
|
}
|
|
}
|