MIF_E31230910_MP-HRIS-MOBILE/lib/repositories/home_repository.dart

116 lines
4.0 KiB
Dart

import '../services/api_client.dart';
import '../../models/user_model.dart';
import '../../models/presensi_model.dart';
import '../../models/announcement_model.dart';
import '../../models/schedule_model.dart';
class HomeRepository {
final ApiClient _apiClient = ApiClient();
Future<Map<String, dynamic>> getDashboardData() async {
try {
final response = await _apiClient.dio.get('/dashboard');
if (response.data['success'] == true) {
final data = response.data['data'];
final user = UserModel.fromJson(data['user']);
final statistik = data['statistik_absensi'];
final izinCount = statistik?['izin'] ?? 0;
final alphaCount = statistik?['alpha'] ?? 0;
PresensiModel? presensiToday;
if (data['jadwal_hari_ini'] != null) {
final jadwal = data['jadwal_hari_ini'];
final presensi = data['presensi_hari_ini'];
final bool sudahMasuk = presensi != null && presensi['jam_masuk'] != null;
final bool sudahPulang = presensi != null && presensi['jam_pulang'] != null;
presensiToday = PresensiModel(
tanggal: jadwal['hari'] ?? '-',
shift: jadwal['shift'] ?? '-',
jamMasuk: sudahMasuk ? presensi['jam_masuk'] : jadwal['jam_masuk'] ?? '-',
jamPulang: sudahPulang ? presensi['jam_pulang'] : jadwal['jam_pulang'] ?? '-',
lokasi: '-',
statusJadwal: jadwal['status_jadwal'],
isAdjusted: jadwal['is_adjusted'] ?? false,
adjustmentNote: jadwal['note'],
sudahAbsenMasuk: sudahMasuk,
sudahAbsenPulang: sudahPulang,
statusMasuk: presensi?['keterangan']?.toString(),
statusPulang: presensi?['keterangan_pulang']?.toString(),
jadwalJamMasuk: jadwal['jam_masuk']?.toString(),
jadwalJamPulang: jadwal['jam_pulang']?.toString(),
kantorNama: jadwal['kantor_nama']?.toString(),
kantorLat: (jadwal['kantor_lat'] is num) ? (jadwal['kantor_lat'] as num).toDouble() : null,
kantorLon: (jadwal['kantor_lon'] is num) ? (jadwal['kantor_lon'] as num).toDouble() : null,
kantorRadius: (jadwal['kantor_radius'] is num) ? (jadwal['kantor_radius'] as num).toDouble() : null,
);
}
final pengumumanList = await getPengumuman();
return {
'user': user,
'poin': data['poin'] ?? 0,
'presensi_today': presensiToday,
'pengumuman_list': pengumumanList,
'sisa_cuti': user.sisaCuti,
'izin_count': izinCount,
'alpha_count': alphaCount,
};
} else {
throw Exception(response.data['message'] ?? 'Failed to load dashboard');
}
} catch (e) {
print('Error fetching dashboard: $e');
return {
'user': null,
'poin': 0,
'presensi_today': null,
'pengumuman_list': <AnnouncementModel>[],
'sisa_cuti': 0,
'izin_count': 0,
'alpha_count': 0,
};
}
}
Future<List<AnnouncementModel>> getPengumuman() async {
try {
final response = await _apiClient.dio.get('/pengumuman');
if (response.data['success'] == true) {
final List data = response.data['data'];
return data.map((json) => AnnouncementModel.fromJson(json)).toList();
}
return [];
} catch (e) {
print('Error fetching pengumuman: $e');
return [];
}
}
Future<List<ScheduleModel>> getMonthlySchedule(int month, int year) async {
try {
final response = await _apiClient.dio.get(
'/schedule/monthly',
queryParameters: {'month': month.toString(), 'year': year.toString()},
);
if (response.statusCode == 200) {
final List data = response.data['data'];
print("Data Jadwal Diterima: ${data.length} item");
return data.map((json) => ScheduleModel.fromJson(json)).toList();
}
return [];
} catch (e) {
print("Error Repository: $e");
throw Exception('Gagal memuat jadwal bulanan');
}
}
}