import 'package:flutter/material.dart'; import '../../repositories/pengajuan_repository.dart'; import '../../repositories/lembur_repository.dart'; import '../../repositories/signature_repository.dart'; import '../../models/pengajuan_model.dart'; class PengajuanProvider extends ChangeNotifier { final PengajuanRepository _repository = PengajuanRepository(); final LemburRepository _lemburRepository = LemburRepository(); final SignatureRepository _signatureRepository = SignatureRepository(); List listPengajuan = []; bool isLoading = false; int selectedTabIndex = 0; bool hasSignature = false; Future checkSignatureStatus() async { final result = await _signatureRepository.getActiveSignature(); hasSignature = result['success'] == true; notifyListeners(); } void setTabIndex(int index) { selectedTabIndex = index; fetchPengajuan(); notifyListeners(); } Future fetchPengajuan() async { isLoading = true; notifyListeners(); try { String status = 'approved'; if (selectedTabIndex == 1) status = 'pending'; if (selectedTabIndex == 2) status = 'rejected'; final submissions = await _repository.getPengajuan(status: status); final lemburResult = await _lemburRepository.getLemburHistory(); List lemburList = []; if (lemburResult['success'] == true && lemburResult['data'] != null) { final dynamic lemburData = lemburResult['data']; List rawData = []; if (lemburData is List) { rawData = lemburData; } else if (lemburData is Map && lemburData['data'] != null) { rawData = lemburData['data']; } lemburList = rawData .map((json) => PengajuanModel.fromLemburJson(json)) .where((item) => item.status == status) .toList(); } listPengajuan = [...submissions, ...lemburList]; listPengajuan.sort((a, b) => b.tanggalPengajuan.compareTo(a.tanggalPengajuan)); } catch (e) { // Gagal fetch pengajuan — abaikan error silently } finally { isLoading = false; notifyListeners(); } } Future submitCuti(Map data) async { return await _submitGeneric('Cuti', data); } Future submitSakit(Map data) async { return await _submitGeneric('Sakit', data); } Future submitIzin(Map data) async { return await _submitGeneric('Izin', data); } Future submitLembur(Map data) async { isLoading = true; notifyListeners(); try { final dateParts = (data['date'] as String).split('/'); final tanggalLembur = '${dateParts[2]}-${dateParts[1].padLeft(2, '0')}-${dateParts[0].padLeft(2, '0')}'; final result = await _lemburRepository.submitLembur( tanggalLembur: tanggalLembur, jamMulai: _convertTo24Hour(data['start_time']), jamSelesai: _convertTo24Hour(data['end_time']), keterangan: data['reason'], idKompensasi: data['id_kompensasi'], ); return result['success'] == true; } catch(e) { print('Error submitting lembur: $e'); return false; } finally { isLoading = false; notifyListeners(); } } String _convertTo24Hour(String time12h) { if (!time12h.contains('AM') && !time12h.contains('PM')) { return time12h; } final parts = time12h.split(' '); final timeParts = parts[0].split(':'); int hour = int.parse(timeParts[0]); final minute = timeParts[1]; final period = parts[1]; if (period == 'PM' && hour != 12) hour += 12; if (period == 'AM' && hour == 12) hour = 0; return '${hour.toString().padLeft(2, '0')}:$minute'; } Future _submitGeneric(String type, Map data) async { isLoading = true; notifyListeners(); try { return await _repository.submitPengajuan(type, data); } catch(e) { rethrow; } finally { isLoading = false; notifyListeners(); } } }