import 'dart:io'; import 'package:flutter/material.dart'; import 'package:share_plus/share_plus.dart'; import 'package:sqflite/sqflite.dart'; import 'package:path/path.dart' as p; import '../models/invoice_models.dart'; import '../services/invoice_repository.dart'; import '../services/customer_repository.dart'; class ManagementScreen extends StatelessWidget { const ManagementScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text("マスター管理・同期"), backgroundColor: Colors.blueGrey, ), body: ListView( children: [ _buildSectionHeader("データ入出力"), _buildMenuTile( context, Icons.upload_file, "伝票マスター・エクスポート", "全データをCSV形式で出力します", () => _exportAllInvoicesCsv(context), ), _buildMenuTile( context, Icons.download, "伝票マスター・インポート", "外部ファイルからデータを取り込みます", () => _showComingSoon(context), ), const Divider(), _buildSectionHeader("バックアップ & セキュリティ"), _buildMenuTile( context, Icons.backup, "データベース・バックアップ", "SQLiteファイルを外部へ保存・シェアします", () => _backupDatabase(context), ), _buildMenuTile( context, Icons.settings_backup_restore, "データベース・リストア", "バックアップから全てのデータを復元します", () => _showComingSoon(context), ), const Divider(), _buildSectionHeader("外部同期 (将来のOdoo連携)"), _buildMenuTile( context, Icons.sync, "クラウド同期を実行", "未同期の伝票をクラウドマスターへ送信します", () => _showComingSoon(context), ), ], ), ); } Widget _buildSectionHeader(String title) { return Padding( padding: const EdgeInsets.all(16.0), child: Text( title, style: const TextStyle(fontSize: 14, fontWeight: FontWeight.bold, color: Colors.blueGrey), ), ); } Widget _buildMenuTile(BuildContext context, IconData icon, String title, String subtitle, VoidCallback onTap) { return ListTile( leading: Icon(icon, color: Colors.blueGrey), title: Text(title), subtitle: Text(subtitle, style: const TextStyle(fontSize: 12)), trailing: const Icon(Icons.chevron_right), onTap: onTap, ); } void _showComingSoon(BuildContext context) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("この機能は次期バージョンで実装予定です。同期フラグ等の基盤は準備済みです。")), ); } Future _exportAllInvoicesCsv(BuildContext context) async { final invoiceRepo = InvoiceRepository(); final customerRepo = CustomerRepository(); final customers = await customerRepo.getAllCustomers(); final invoices = await invoiceRepo.getAllInvoices(customers); if (invoices.isEmpty) { if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("エクスポートするデータがありません"))); return; } StringBuffer buffer = StringBuffer(); buffer.writeln("日付,請求番号,取引先,合計金額,備考"); for (var inv in invoices) { buffer.writeln("${inv.date},$inv.invoiceNumber,${inv.customer.formalName},${inv.totalAmount},${inv.notes ?? ""}"); } await Share.share(buffer.toString(), subject: '販売アシスト1号_全伝票マスター'); } Future _backupDatabase(BuildContext context) async { final dbPath = p.join(await getDatabasesPath(), 'gemi_invoice.db'); final file = File(dbPath); if (await file.exists()) { await Share.shareXFiles([XFile(dbPath)], text: '販売アシスト1号_DBバックアップ'); } else { if (!context.mounted) return; ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("データベースファイルが見つかりません"))); } } }