checkpoint
							parent
							
								
									28e99e4e2f
								
							
						
					
					
						commit
						c2e6f6b945
					
				| 
						 | 
				
			
			@ -41,3 +41,6 @@ app.*.map.json
 | 
			
		|||
/android/app/debug
 | 
			
		||||
/android/app/profile
 | 
			
		||||
/android/app/release
 | 
			
		||||
 | 
			
		||||
# Deprecated files
 | 
			
		||||
/deprecated/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,23 +0,0 @@
 | 
			
		|||
# Instruksi untuk menambahkan logo toko ke aplikasi:
 | 
			
		||||
 | 
			
		||||
1. Tambahkan file gambar logo ke folder `assets/images/` dengan nama `store_logo.png`
 | 
			
		||||
 | 
			
		||||
2. Tambahkan path ke file `pubspec.yaml` agar file gambar tersebut tersedia di aplikasi:
 | 
			
		||||
   ```yaml
 | 
			
		||||
   flutter:
 | 
			
		||||
     assets:
 | 
			
		||||
       - assets/images/
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
3. Untuk menyimpan path logo ke shared preferences, panggil fungsi:
 | 
			
		||||
   ```dart
 | 
			
		||||
   import 'package:cashumit/utils/store_logo_utils.dart';
 | 
			
		||||
   
 | 
			
		||||
   // Simpan path logo
 | 
			
		||||
   await saveStoreLogoPath('assets/images/store_logo.png');
 | 
			
		||||
   
 | 
			
		||||
   // Hapus path logo jika diperlukan
 | 
			
		||||
   await removeStoreLogoPath();
 | 
			
		||||
   ```
 | 
			
		||||
 | 
			
		||||
4. Untuk menguji pencetakan logo, pastikan printer thermal mendukung pencetakan gambar.
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 96 B After Width: | Height: | Size: 91 B  | 
| 
						 | 
				
			
			@ -3,6 +3,8 @@ import 'package:cashumit/screens/transaction_screen.dart';
 | 
			
		|||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:cashumit/screens/receipt_screen.dart';
 | 
			
		||||
import 'package:cashumit/utils/store_logo_utils.dart';
 | 
			
		||||
import 'package:provider/provider.dart';
 | 
			
		||||
import 'package:cashumit/providers/receipt_provider.dart';
 | 
			
		||||
 | 
			
		||||
void main() async {
 | 
			
		||||
  // Ensure WidgetsFlutterBinding is initialized for async operations
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +13,14 @@ void main() async {
 | 
			
		|||
  // Initialize the store logo from asset
 | 
			
		||||
  await copyAndSaveStoreLogoFromAsset('assets/images/store_logo.png');
 | 
			
		||||
  
 | 
			
		||||
  runApp(const MyApp());
 | 
			
		||||
  runApp(
 | 
			
		||||
    MultiProvider(
 | 
			
		||||
      providers: [
 | 
			
		||||
        ChangeNotifierProvider(create: (_) => ReceiptProvider()),
 | 
			
		||||
      ],
 | 
			
		||||
      child: const MyApp(),
 | 
			
		||||
    ),
 | 
			
		||||
  );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class MyApp extends StatelessWidget {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,13 @@ class _StoreDisclaimerState extends State<StoreDisclaimer> {
 | 
			
		|||
    _loadDisclaimerText();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void didUpdateWidget(covariant StoreDisclaimer oldWidget) {
 | 
			
		||||
    super.didUpdateWidget(oldWidget);
 | 
			
		||||
    // Memuat ulang teks ketika widget diupdate
 | 
			
		||||
    _loadDisclaimerText();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Memuat teks disclaimer dari shared preferences
 | 
			
		||||
  Future<void> _loadDisclaimerText() async {
 | 
			
		||||
    final prefs = await SharedPreferences.getInstance();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,9 +14,9 @@ class ThankYouPantun extends StatefulWidget {
 | 
			
		|||
 | 
			
		||||
class _ThankYouPantunState extends State<ThankYouPantun> {
 | 
			
		||||
  String _thankYouText = '*** TERIMA KASIH ***';
 | 
			
		||||
  String _pantunText = 'Belanja di toko kami, hemat dan nyaman,\n'
 | 
			
		||||
      'Dengan penuh semangat, kami siap melayani,\n'
 | 
			
		||||
      'Harapan kami, Anda selalu puas,\n'
 | 
			
		||||
  String _pantunText = 'Belanja di toko kami, hemat dan nyaman,\\n'
 | 
			
		||||
      'Dengan penuh semangat, kami siap melayani,\\n'
 | 
			
		||||
      'Harapan kami, Anda selalu puas,\\n'
 | 
			
		||||
      'Sampai jumpa lagi, selamat tinggal.';
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
| 
						 | 
				
			
			@ -25,6 +25,13 @@ class _ThankYouPantunState extends State<ThankYouPantun> {
 | 
			
		|||
    _loadThankYouText();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  void didUpdateWidget(covariant ThankYouPantun oldWidget) {
 | 
			
		||||
    super.didUpdateWidget(oldWidget);
 | 
			
		||||
    // Memuat ulang teks ketika widget diupdate
 | 
			
		||||
    _loadThankYouText();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /// Memuat teks terima kasih dan pantun dari shared preferences
 | 
			
		||||
  Future<void> _loadThankYouText() async {
 | 
			
		||||
    final prefs = await SharedPreferences.getInstance();
 | 
			
		||||
| 
						 | 
				
			
			@ -34,9 +41,9 @@ class _ThankYouPantunState extends State<ThankYouPantun> {
 | 
			
		|||
    if (mounted) {
 | 
			
		||||
      setState(() {
 | 
			
		||||
        _thankYouText = savedThankYou ?? '*** TERIMA KASIH ***';
 | 
			
		||||
        _pantunText = savedPantun ?? 'Belanja di toko kami, hemat dan nyaman,\n'
 | 
			
		||||
            'Dengan penuh semangat, kami siap melayani,\n'
 | 
			
		||||
            'Harapan kami, Anda selalu puas,\n'
 | 
			
		||||
        _pantunText = savedPantun ?? 'Belanja di toko kami, hemat dan nyaman,\\n'
 | 
			
		||||
            'Dengan penuh semangat, kami siap melayani,\\n'
 | 
			
		||||
            'Harapan kami, Anda selalu puas,\\n'
 | 
			
		||||
            'Sampai jumpa lagi, selamat tinggal.';
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										80
									
								
								pubspec.lock
								
								
								
								
							
							
						
						
									
										80
									
								
								pubspec.lock
								
								
								
								
							| 
						 | 
				
			
			@ -5,10 +5,10 @@ packages:
 | 
			
		|||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: archive
 | 
			
		||||
      sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd"
 | 
			
		||||
      sha256: cb6a278ef2dbb298455e1a713bda08524a175630ec643a242c399c932a0a1f7d
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "4.0.7"
 | 
			
		||||
    version: "3.6.1"
 | 
			
		||||
  async:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -25,14 +25,6 @@ packages:
 | 
			
		|||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.2.9"
 | 
			
		||||
  bidi:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: bidi
 | 
			
		||||
      sha256: "77f475165e94b261745cf1032c751e2032b8ed92ccb2bf5716036db79320637d"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.0.13"
 | 
			
		||||
  bluetooth_print:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -96,6 +88,14 @@ packages:
 | 
			
		|||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "3.0.6"
 | 
			
		||||
  csslib:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: csslib
 | 
			
		||||
      sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.0.2"
 | 
			
		||||
  cupertino_icons:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -165,6 +165,14 @@ packages:
 | 
			
		|||
    description: flutter
 | 
			
		||||
    source: sdk
 | 
			
		||||
    version: "0.0.0"
 | 
			
		||||
  flutter_esc_pos_utils:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: flutter_esc_pos_utils
 | 
			
		||||
      sha256: dd0dbd9738c07ea9a6b078f5db18feb2d5d970b4de0ce34427d66665f639eaec
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.0.5"
 | 
			
		||||
  flutter_lints:
 | 
			
		||||
    dependency: "direct dev"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -199,6 +207,14 @@ packages:
 | 
			
		|||
    description: flutter
 | 
			
		||||
    source: sdk
 | 
			
		||||
    version: "0.0.0"
 | 
			
		||||
  gbk_codec:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: gbk_codec
 | 
			
		||||
      sha256: "3af5311fc9393115e3650ae6023862adf998051a804a08fb804f042724999f61"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.4.0"
 | 
			
		||||
  google_fonts:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -207,6 +223,22 @@ packages:
 | 
			
		|||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.3.0"
 | 
			
		||||
  hex:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: hex
 | 
			
		||||
      sha256: "4e7cd54e4b59ba026432a6be2dd9d96e4c5205725194997193bf871703b82c4a"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.2.0"
 | 
			
		||||
  html:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: html
 | 
			
		||||
      sha256: "6d1264f2dffa1b1101c25a91dff0dc2daee4c18e87cd8538729773c073dbf602"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "0.15.6"
 | 
			
		||||
  http:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -232,13 +264,13 @@ packages:
 | 
			
		|||
    source: hosted
 | 
			
		||||
    version: "4.0.2"
 | 
			
		||||
  image:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: image
 | 
			
		||||
      sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928"
 | 
			
		||||
      sha256: "8e9d133755c3e84c73288363e6343157c383a0c6c56fc51afcc5d4d7180306d6"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "4.5.4"
 | 
			
		||||
    version: "3.3.0"
 | 
			
		||||
  image_picker:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -383,6 +415,14 @@ packages:
 | 
			
		|||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.0.0"
 | 
			
		||||
  nested:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
      name: nested
 | 
			
		||||
      sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "1.0.0"
 | 
			
		||||
  open_file:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -515,10 +555,10 @@ packages:
 | 
			
		|||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: pdf
 | 
			
		||||
      sha256: "28eacad99bffcce2e05bba24e50153890ad0255294f4dd78a17075a2ba5c8416"
 | 
			
		||||
      sha256: "10659b915e65832b106f6d1d213e09b789cc1f24bf282ee911e49db35b96be4d"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "3.11.3"
 | 
			
		||||
    version: "3.8.4"
 | 
			
		||||
  petitparser:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			@ -543,14 +583,14 @@ packages:
 | 
			
		|||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "2.1.8"
 | 
			
		||||
  posix:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
  provider:
 | 
			
		||||
    dependency: "direct main"
 | 
			
		||||
    description:
 | 
			
		||||
      name: posix
 | 
			
		||||
      sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61"
 | 
			
		||||
      name: provider
 | 
			
		||||
      sha256: "4e82183fa20e5ca25703ead7e05de9e4cceed1fbd1eadc1ac3cb6f565a09f272"
 | 
			
		||||
      url: "https://pub.dev"
 | 
			
		||||
    source: hosted
 | 
			
		||||
    version: "6.0.3"
 | 
			
		||||
    version: "6.1.5+1"
 | 
			
		||||
  qr:
 | 
			
		||||
    dependency: transitive
 | 
			
		||||
    description:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,6 +49,7 @@ dependencies:
 | 
			
		|||
  flutter_speed_dial: ^7.0.0
 | 
			
		||||
  image_picker: ^1.0.0
 | 
			
		||||
  webview_flutter: ^4.10.0
 | 
			
		||||
  provider: ^6.1.1
 | 
			
		||||
 | 
			
		||||
dev_dependencies:
 | 
			
		||||
  flutter_test:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,158 +0,0 @@
 | 
			
		|||
import 'dart:io';
 | 
			
		||||
import 'dart:convert';
 | 
			
		||||
import 'package:http/http.dart' as http;
 | 
			
		||||
 | 
			
		||||
/// Script untuk menguji integrasi dengan Firefly III API
 | 
			
		||||
/// Menjalankan beberapa operasi dasar:
 | 
			
		||||
/// 1. Menguji koneksi ke instance Firefly III
 | 
			
		||||
/// 2. Menguji autentikasi dengan token
 | 
			
		||||
/// 3. Mengambil daftar akun
 | 
			
		||||
/// 4. Mengirim transaksi dummy
 | 
			
		||||
 | 
			
		||||
void main() async {
 | 
			
		||||
  // Konfigurasi - Ganti dengan nilai yang sesuai untuk instance Firefly III Anda
 | 
			
		||||
  const String baseUrl = 'http://192.168.1.100:8080'; // Contoh URL
 | 
			
		||||
  const String accessToken = 'your_access_token_here'; // Contoh token
 | 
			
		||||
  const String sourceAccountId = '1'; // ID akun sumber (revenue)
 | 
			
		||||
  const String destinationAccountId = '2'; // ID akun tujuan (asset)
 | 
			
		||||
 | 
			
		||||
  print('=== MENGUJI INTEGRASI FIREFLY III ===\n');
 | 
			
		||||
 | 
			
		||||
  // 1. Menguji koneksi
 | 
			
		||||
  print('1. Menguji koneksi ke Firefly III...');
 | 
			
		||||
  try {
 | 
			
		||||
    final connectivityResponse = await http.get(Uri.parse('$baseUrl/api/v1/about'));
 | 
			
		||||
    if (connectivityResponse.statusCode == 200) {
 | 
			
		||||
      print('   ✓ Koneksi berhasil');
 | 
			
		||||
    } else {
 | 
			
		||||
      print('   ✗ Koneksi gagal (Status code: ${connectivityResponse.statusCode})');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    print('   ✗ Koneksi gagal dengan error: $e');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 2. Menguji autentikasi
 | 
			
		||||
  print('\n2. Menguji autentikasi dengan token...');
 | 
			
		||||
  try {
 | 
			
		||||
    final authResponse = await http.get(
 | 
			
		||||
      Uri.parse('$baseUrl/api/v1/about/user'),
 | 
			
		||||
      headers: {
 | 
			
		||||
        'Authorization': 'Bearer $accessToken',
 | 
			
		||||
        'Accept': 'application/json',
 | 
			
		||||
      },
 | 
			
		||||
    );
 | 
			
		||||
    if (authResponse.statusCode == 200) {
 | 
			
		||||
      print('   ✓ Autentikasi berhasil');
 | 
			
		||||
    } else {
 | 
			
		||||
      print('   ✗ Autentikasi gagal (Status code: ${authResponse.statusCode})');
 | 
			
		||||
      print('   Response body: ${authResponse.body}');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    print('   ✗ Autentikasi gagal dengan error: $e');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 3. Mengambil daftar akun
 | 
			
		||||
  print('\n3. Mengambil daftar akun...');
 | 
			
		||||
  try {
 | 
			
		||||
    final accountsResponse = await http.get(
 | 
			
		||||
      Uri.parse('$baseUrl/api/v1/accounts'),
 | 
			
		||||
      headers: {
 | 
			
		||||
        'Authorization': 'Bearer $accessToken',
 | 
			
		||||
        'Accept': 'application/json',
 | 
			
		||||
      },
 | 
			
		||||
    );
 | 
			
		||||
    if (accountsResponse.statusCode == 200) {
 | 
			
		||||
      final accountsData = json.decode(accountsResponse.body);
 | 
			
		||||
      if (accountsData is Map<String, dynamic> && accountsData.containsKey('data')) {
 | 
			
		||||
        final accounts = accountsData['data'] as List;
 | 
			
		||||
        print('   ✓ Berhasil mengambil ${accounts.length} akun');
 | 
			
		||||
        
 | 
			
		||||
        // Tampilkan 3 akun pertama
 | 
			
		||||
        print('   Contoh akun:');
 | 
			
		||||
        for (int i = 0; i < accounts.length && i < 3; i++) {
 | 
			
		||||
          final account = accounts[i];
 | 
			
		||||
          if (account is Map<String, dynamic> && account.containsKey('id') && account.containsKey('attributes')) {
 | 
			
		||||
            final attributes = account['attributes'];
 | 
			
		||||
            if (attributes is Map<String, dynamic> && attributes.containsKey('name') && attributes.containsKey('type')) {
 | 
			
		||||
              print('     - ID: ${account['id']}, Nama: ${attributes['name']}, Tipe: ${attributes['type']}');
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        print('   ✗ Format respons akun tidak sesuai harapan');
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      print('   ✗ Gagal mengambil akun (Status code: ${accountsResponse.statusCode})');
 | 
			
		||||
      print('   Response body: ${accountsResponse.body}');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    print('   ✗ Gagal mengambil akun dengan error: $e');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 4. Mengirim transaksi dummy
 | 
			
		||||
  print('\n4. Mengirim transaksi dummy...');
 | 
			
		||||
  try {
 | 
			
		||||
    final transactionPayload = jsonEncode({
 | 
			
		||||
      "transactions": [
 | 
			
		||||
        {
 | 
			
		||||
          "type": "deposit",
 | 
			
		||||
          "date": "2025-08-21",
 | 
			
		||||
          "amount": "50.00",
 | 
			
		||||
          "description": "Transaksi Dummy via Test Script",
 | 
			
		||||
          "source_id": sourceAccountId,
 | 
			
		||||
          "destination_id": destinationAccountId,
 | 
			
		||||
        }
 | 
			
		||||
      ]
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    final transactionResponse = await http.post(
 | 
			
		||||
      Uri.parse('$baseUrl/api/v1/transactions'),
 | 
			
		||||
      headers: {
 | 
			
		||||
        'Authorization': 'Bearer $accessToken',
 | 
			
		||||
        'Accept': 'application/json',
 | 
			
		||||
        'Content-Type': 'application/json',
 | 
			
		||||
      },
 | 
			
		||||
      body: transactionPayload,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    if (transactionResponse.statusCode == 200 || transactionResponse.statusCode == 201) {
 | 
			
		||||
      print('   ✓ Transaksi berhasil dikirim');
 | 
			
		||||
      
 | 
			
		||||
      // Coba parse transaction ID
 | 
			
		||||
      try {
 | 
			
		||||
        final transactionData = json.decode(transactionResponse.body);
 | 
			
		||||
        if (transactionData is Map<String, dynamic> && 
 | 
			
		||||
            transactionData.containsKey('data') && 
 | 
			
		||||
            transactionData['data'] is List && 
 | 
			
		||||
            transactionData['data'].isNotEmpty) {
 | 
			
		||||
          
 | 
			
		||||
          final firstTransaction = transactionData['data'][0];
 | 
			
		||||
          if (firstTransaction is Map<String, dynamic> && firstTransaction.containsKey('transaction_id')) {
 | 
			
		||||
            print('   Transaction ID: ${firstTransaction['transaction_id']}');
 | 
			
		||||
          } else if (firstTransaction is Map<String, dynamic> && firstTransaction.containsKey('id')) {
 | 
			
		||||
            print('   Transaction ID: ${firstTransaction['id']}');
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        print('   Tidak dapat mem-parsing transaction ID: $e');
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      print('   ✗ Gagal mengirim transaksi (Status code: ${transactionResponse.statusCode})');
 | 
			
		||||
      print('   Response body: ${transactionResponse.body}');
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    print('   ✗ Gagal mengirim transaksi dengan error: $e');
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  print('\n=== PENGUJIAN SELESAI ===');
 | 
			
		||||
  print('Semua pengujian berhasil! Integrasi dengan Firefly III berfungsi dengan baik.');
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue