cashumit/lib/services/account_dialog_service.dart

195 lines
7.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'account_mirror_service.dart';
import '../models/firefly_account.dart';
class AccountDialogService {
/// Menampilkan dialog untuk memilih akun sumber (revenue) dengan akses ke semua akun yang di-mirror
static Future<Map<String, dynamic>?> showSourceAccountDialog(
BuildContext context,
List<Map<String, dynamic>> accounts,
) async {
// Ambil semua akun revenue yang telah di-mirror
final mirroredRevenueAccounts =
await AccountMirrorService.getMirroredAccountsByType('revenue');
// Jika tidak ada akun yang di-mirror, coba dari parameter accounts
List<FireflyAccount> availableAccounts = mirroredRevenueAccounts;
if (availableAccounts.isEmpty && accounts.isNotEmpty) {
// Konversi dari Map ke FireflyAccount
availableAccounts = accounts
.where((account) =>
(account['attributes'] as Map<String, dynamic>?)?['type'] ==
'revenue' ||
account['type'] == 'revenue')
.map((account) => FireflyAccount(
id: account['id'].toString(),
name: (account['attributes'] as Map<String, dynamic>?)?['name']
?.toString() ??
account['name']?.toString() ??
'',
type: (account['attributes'] as Map<String, dynamic>?)?['type']
?.toString() ??
account['type']?.toString() ??
'',
))
.toList();
}
if (availableAccounts.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Tidak ada akun sumber (revenue) yang tersedia. Pastikan akun telah disinkronkan dari server Firefly III.')),
);
return null;
}
return await showDialog<Map<String, dynamic>?>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Pilih Akun Sumber'),
content: SizedBox(
width: double.maxFinite,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Tidak lagi menampilkan default account karena fitur telah dihapus
const SizedBox(height: 8),
// List akun yang tersedia
SizedBox(
height: 300,
child: ListView.builder(
shrinkWrap: true,
itemCount: availableAccounts.length,
itemBuilder: (context, index) {
final account = availableAccounts[index];
return ListTile(
title: Text(account.name),
subtitle: Text('ID: ${account.id}'),
onTap: () {
// Simpan sebagai default account
_saveDefaultAccountId(
'source', account.id, account.name);
final accountAsMap = {
'id': account.id,
'name': account.name,
'type': account.type,
};
Navigator.of(context).pop(accountAsMap);
},
);
},
),
),
],
),
),
);
},
);
}
/// Menampilkan dialog untuk memilih akun tujuan (asset) dengan akses ke semua akun yang di-mirror
static Future<Map<String, dynamic>?> showDestinationAccountDialog(
BuildContext context,
List<Map<String, dynamic>> accounts,
) async {
// Ambil semua akun asset yang telah di-mirror
final mirroredAssetAccounts =
await AccountMirrorService.getMirroredAccountsByType('asset');
// Jika tidak ada akun yang di-mirror, coba dari parameter accounts
List<FireflyAccount> availableAccounts = mirroredAssetAccounts;
if (availableAccounts.isEmpty && accounts.isNotEmpty) {
// Konversi dari Map ke FireflyAccount
availableAccounts = accounts
.where((account) =>
(account['attributes'] as Map<String, dynamic>?)?['type'] ==
'asset' ||
account['type'] == 'asset')
.map((account) => FireflyAccount(
id: account['id'].toString(),
name: (account['attributes'] as Map<String, dynamic>?)?['name']
?.toString() ??
account['name']?.toString() ??
'',
type: (account['attributes'] as Map<String, dynamic>?)?['type']
?.toString() ??
account['type']?.toString() ??
'',
))
.toList();
}
if (availableAccounts.isEmpty) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text(
'Tidak ada akun tujuan (asset) yang tersedia. Pastikan akun telah disinkronkan dari server Firefly III.')),
);
return null;
}
// Tidak lagi menggunakan default account karena fitur telah dihapus
return await showDialog<Map<String, dynamic>?>(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Pilih Akun Tujuan'),
content: SizedBox(
width: double.maxFinite,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Tidak menampilkan default account karena fitur telah dihapus
const SizedBox(height: 8),
// List akun yang tersedia
SizedBox(
height: 300,
child: ListView.builder(
shrinkWrap: true,
itemCount: availableAccounts.length,
itemBuilder: (context, index) {
final account = availableAccounts[index];
return ListTile(
title: Text(account.name),
subtitle: Text('ID: ${account.id}'),
onTap: () {
// Tidak lagi menyimpan default account mapping
final accountAsMap = {
'id': account.id,
'name': account.name,
'type': account.type,
};
Navigator.of(context).pop(accountAsMap);
},
);
},
),
),
],
),
),
);
},
);
}
// Fungsi bantu untuk menyimpan default account ID
static Future<void> _saveDefaultAccountId(
String type, String id, String name) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString('default_${type}_account_id', id);
await prefs.setString('default_${type}_account_name', name);
}
// Fungsi bantu untuk mendapatkan default account ID
static Future<String?> _getDefaultAccountId(String type) async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString('default_${type}_account_id');
}
}