195 lines
7.3 KiB
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');
|
|
}
|
|
}
|