Tambahkan properti tanggalWaktuSelesai pada model PenyaluranBantuanModel dan perbarui tampilan serta controller untuk mendukung rentang waktu penyaluran. Modifikasi logika di JadwalPenyaluranController untuk memperbarui status jadwal berdasarkan waktu mulai dan selesai. Perbarui tampilan TambahPenyaluranView untuk memungkinkan pemilihan waktu mulai dan selesai secara terpisah.
This commit is contained in:
@ -9,6 +9,7 @@ class PenyaluranBantuanModel {
|
|||||||
final String? status;
|
final String? status;
|
||||||
final String? alasanPenolakan;
|
final String? alasanPenolakan;
|
||||||
final DateTime? tanggalPenyaluran;
|
final DateTime? tanggalPenyaluran;
|
||||||
|
final DateTime? tanggalWaktuSelesai;
|
||||||
final String? kategoriBantuanId;
|
final String? kategoriBantuanId;
|
||||||
final DateTime? tanggalPermintaan;
|
final DateTime? tanggalPermintaan;
|
||||||
final int? jumlahPenerima;
|
final int? jumlahPenerima;
|
||||||
@ -25,6 +26,7 @@ class PenyaluranBantuanModel {
|
|||||||
this.status,
|
this.status,
|
||||||
this.alasanPenolakan,
|
this.alasanPenolakan,
|
||||||
this.tanggalPenyaluran,
|
this.tanggalPenyaluran,
|
||||||
|
this.tanggalWaktuSelesai,
|
||||||
this.kategoriBantuanId,
|
this.kategoriBantuanId,
|
||||||
this.tanggalPermintaan,
|
this.tanggalPermintaan,
|
||||||
this.jumlahPenerima,
|
this.jumlahPenerima,
|
||||||
@ -50,6 +52,9 @@ class PenyaluranBantuanModel {
|
|||||||
tanggalPenyaluran: json["tanggal_penyaluran"] != null
|
tanggalPenyaluran: json["tanggal_penyaluran"] != null
|
||||||
? DateTime.parse(json["tanggal_penyaluran"]).toUtc()
|
? DateTime.parse(json["tanggal_penyaluran"]).toUtc()
|
||||||
: null,
|
: null,
|
||||||
|
tanggalWaktuSelesai: json["tanggal_waktu_selesai"] != null
|
||||||
|
? DateTime.parse(json["tanggal_waktu_selesai"]).toUtc()
|
||||||
|
: null,
|
||||||
kategoriBantuanId: json["kategori_bantuan_id"],
|
kategoriBantuanId: json["kategori_bantuan_id"],
|
||||||
tanggalPermintaan: json["tanggal_permintaan"] != null
|
tanggalPermintaan: json["tanggal_permintaan"] != null
|
||||||
? DateTime.parse(json["tanggal_permintaan"]).toUtc()
|
? DateTime.parse(json["tanggal_permintaan"]).toUtc()
|
||||||
@ -73,6 +78,7 @@ class PenyaluranBantuanModel {
|
|||||||
"status": status,
|
"status": status,
|
||||||
"alasan_penolakan": alasanPenolakan,
|
"alasan_penolakan": alasanPenolakan,
|
||||||
"tanggal_penyaluran": tanggalPenyaluran?.toUtc().toIso8601String(),
|
"tanggal_penyaluran": tanggalPenyaluran?.toUtc().toIso8601String(),
|
||||||
|
"tanggal_waktu_selesai": tanggalWaktuSelesai?.toUtc().toIso8601String(),
|
||||||
"kategori_bantuan_id": kategoriBantuanId,
|
"kategori_bantuan_id": kategoriBantuanId,
|
||||||
"tanggal_permintaan": tanggalPermintaan?.toUtc().toIso8601String(),
|
"tanggal_permintaan": tanggalPermintaan?.toUtc().toIso8601String(),
|
||||||
"jumlah_penerima": jumlahPenerima,
|
"jumlah_penerima": jumlahPenerima,
|
||||||
|
@ -89,17 +89,14 @@ class JadwalPenyaluranController extends GetxController {
|
|||||||
// Memeriksa dan memperbarui status jadwal
|
// Memeriksa dan memperbarui status jadwal
|
||||||
Future<void> checkAndUpdateJadwalStatus() async {
|
Future<void> checkAndUpdateJadwalStatus() async {
|
||||||
try {
|
try {
|
||||||
// Dapatkan tanggal dan waktu saat ini dalam timezone lokal
|
|
||||||
final now = DateTime.now();
|
final now = DateTime.now();
|
||||||
final today = DateTime(now.year, now.month, now.day);
|
final today = DateTime(now.year, now.month, now.day);
|
||||||
|
|
||||||
// Periksa jadwal mendatang yang tanggalnya hari ini
|
|
||||||
List<PenyaluranBantuanModel> jadwalToUpdate = [];
|
List<PenyaluranBantuanModel> jadwalToUpdate = [];
|
||||||
List<PenyaluranBantuanModel> jadwalTerlewat = [];
|
List<PenyaluranBantuanModel> jadwalTerlewat = [];
|
||||||
|
|
||||||
for (var jadwal in jadwalHariIni) {
|
for (var jadwal in jadwalHariIni) {
|
||||||
if (jadwal.tanggalPenyaluran != null) {
|
if (jadwal.tanggalPenyaluran != null) {
|
||||||
// Konversi tanggal jadwal ke timezone lokal
|
|
||||||
final jadwalDateTime =
|
final jadwalDateTime =
|
||||||
DateTimeHelper.toLocalDateTime(jadwal.tanggalPenyaluran!);
|
DateTimeHelper.toLocalDateTime(jadwal.tanggalPenyaluran!);
|
||||||
final jadwalDate = DateTime(
|
final jadwalDate = DateTime(
|
||||||
@ -108,30 +105,35 @@ class JadwalPenyaluranController extends GetxController {
|
|||||||
jadwalDateTime.day,
|
jadwalDateTime.day,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Jika tanggal jadwal adalah hari ini
|
|
||||||
if (isSameDay(jadwalDate, today)) {
|
if (isSameDay(jadwalDate, today)) {
|
||||||
// Jika waktu jadwal sudah tiba atau lewat
|
|
||||||
if (now.isAfter(jadwalDateTime) ||
|
if (now.isAfter(jadwalDateTime) ||
|
||||||
now.isAtSameMomentAs(jadwalDateTime)) {
|
now.isAtSameMomentAs(jadwalDateTime)) {
|
||||||
if (jadwal.status == 'DIJADWALKAN') {
|
if (jadwal.status == 'DIJADWALKAN') {
|
||||||
// Jika status masih DIJADWALKAN, ubah menjadi BATALTERLAKSANA
|
if (now
|
||||||
|
.isBefore(jadwalDateTime.add(const Duration(hours: 2)))) {
|
||||||
|
await _supabaseService.updateJadwalStatus(
|
||||||
|
jadwal.id!, 'AKTIF');
|
||||||
|
jadwalToUpdate.add(jadwal);
|
||||||
|
} else {
|
||||||
await _supabaseService.updateJadwalStatus(
|
await _supabaseService.updateJadwalStatus(
|
||||||
jadwal.id!, 'BATALTERLAKSANA');
|
jadwal.id!, 'BATALTERLAKSANA');
|
||||||
jadwalTerlewat.add(jadwal);
|
jadwalTerlewat.add(jadwal);
|
||||||
|
}
|
||||||
} else if (jadwal.status == 'AKTIF') {
|
} else if (jadwal.status == 'AKTIF') {
|
||||||
// Jika status BERLANGSUNG, tambahkan ke daftar update
|
if (now.isAfter(jadwalDateTime.add(const Duration(hours: 2)))) {
|
||||||
jadwalToUpdate.add(jadwal);
|
await _supabaseService.updateJadwalStatus(
|
||||||
|
jadwal.id!, 'BATALTERLAKSANA');
|
||||||
|
jadwalTerlewat.add(jadwal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh data setelah pembaruan
|
|
||||||
if (jadwalToUpdate.isNotEmpty || jadwalTerlewat.isNotEmpty) {
|
if (jadwalToUpdate.isNotEmpty || jadwalTerlewat.isNotEmpty) {
|
||||||
await loadJadwalData();
|
await loadJadwalData();
|
||||||
|
|
||||||
// Tampilkan notifikasi jika ada jadwal yang dipindahkan
|
|
||||||
if (jadwalToUpdate.isNotEmpty) {
|
if (jadwalToUpdate.isNotEmpty) {
|
||||||
Get.snackbar(
|
Get.snackbar(
|
||||||
'Jadwal Diperbarui',
|
'Jadwal Diperbarui',
|
||||||
@ -143,7 +145,6 @@ class JadwalPenyaluranController extends GetxController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tampilkan notifikasi jika ada jadwal yang terlewat
|
|
||||||
if (jadwalTerlewat.isNotEmpty) {
|
if (jadwalTerlewat.isNotEmpty) {
|
||||||
Get.snackbar(
|
Get.snackbar(
|
||||||
'Jadwal Terlewat',
|
'Jadwal Terlewat',
|
||||||
@ -155,8 +156,9 @@ class JadwalPenyaluranController extends GetxController {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e, stackTrace) {
|
||||||
print('Error checking and updating jadwal status: $e');
|
print('Error checking and updating jadwal status: $e');
|
||||||
|
print('Stack trace: $stackTrace');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -375,9 +377,11 @@ class JadwalPenyaluranController extends GetxController {
|
|||||||
required String nama,
|
required String nama,
|
||||||
required String deskripsi,
|
required String deskripsi,
|
||||||
required String skemaId,
|
required String skemaId,
|
||||||
|
required String kategoriBantuanId,
|
||||||
required String lokasiPenyaluranId,
|
required String lokasiPenyaluranId,
|
||||||
required int jumlahPenerima,
|
required int jumlahPenerima,
|
||||||
required DateTime? tanggalPenyaluran,
|
required DateTime? tanggalPenyaluran,
|
||||||
|
DateTime? tanggalWaktuSelesai,
|
||||||
}) async {
|
}) async {
|
||||||
isLoading.value = true;
|
isLoading.value = true;
|
||||||
try {
|
try {
|
||||||
@ -395,7 +399,9 @@ class JadwalPenyaluranController extends GetxController {
|
|||||||
'petugas_id': user!.id,
|
'petugas_id': user!.id,
|
||||||
'jumlah_penerima': jumlahPenerima,
|
'jumlah_penerima': jumlahPenerima,
|
||||||
'tanggal_penyaluran': tanggalPenyaluran?.toUtc().toIso8601String(),
|
'tanggal_penyaluran': tanggalPenyaluran?.toUtc().toIso8601String(),
|
||||||
|
'tanggal_waktu_selesai': tanggalWaktuSelesai?.toUtc().toIso8601String(),
|
||||||
'status': 'DIJADWALKAN', // Status awal adalah terjadwal
|
'status': 'DIJADWALKAN', // Status awal adalah terjadwal
|
||||||
|
'kategori_bantuan_id': kategoriBantuanId,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Simpan ke database dan dapatkan ID penyaluran
|
// Simpan ke database dan dapatkan ID penyaluran
|
||||||
|
@ -4,7 +4,6 @@ import 'package:intl/intl.dart';
|
|||||||
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
|
import 'package:penyaluran_app/app/modules/petugas_desa/controllers/jadwal_penyaluran_controller.dart';
|
||||||
import 'package:penyaluran_app/app/theme/app_theme.dart';
|
import 'package:penyaluran_app/app/theme/app_theme.dart';
|
||||||
import 'package:penyaluran_app/app/data/models/skema_bantuan_model.dart';
|
import 'package:penyaluran_app/app/data/models/skema_bantuan_model.dart';
|
||||||
import 'package:penyaluran_app/app/data/models/pengajuan_kelayakan_bantuan_model.dart';
|
|
||||||
|
|
||||||
class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
||||||
const TambahPenyaluranView({super.key});
|
const TambahPenyaluranView({super.key});
|
||||||
@ -27,7 +26,8 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
final TextEditingController deskripsiController = TextEditingController();
|
final TextEditingController deskripsiController = TextEditingController();
|
||||||
final TextEditingController tanggalPenyaluranController =
|
final TextEditingController tanggalPenyaluranController =
|
||||||
TextEditingController();
|
TextEditingController();
|
||||||
final TextEditingController waktuPenyaluranController =
|
final TextEditingController waktuMulaiController = TextEditingController();
|
||||||
|
final TextEditingController waktuSelesaiController =
|
||||||
TextEditingController();
|
TextEditingController();
|
||||||
|
|
||||||
// Variabel untuk menyimpan nilai yang dipilih
|
// Variabel untuk menyimpan nilai yang dipilih
|
||||||
@ -39,7 +39,8 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
|
|
||||||
// Tanggal dan waktu penyaluran
|
// Tanggal dan waktu penyaluran
|
||||||
final Rx<DateTime?> selectedDate = Rx<DateTime?>(null);
|
final Rx<DateTime?> selectedDate = Rx<DateTime?>(null);
|
||||||
final Rx<TimeOfDay?> selectedTime = Rx<TimeOfDay?>(null);
|
final Rx<TimeOfDay?> selectedWaktuMulai = Rx<TimeOfDay?>(null);
|
||||||
|
final Rx<TimeOfDay?> selectedWaktuSelesai = Rx<TimeOfDay?>(null);
|
||||||
|
|
||||||
// Fungsi untuk memuat data pengajuan kelayakan bantuan
|
// Fungsi untuk memuat data pengajuan kelayakan bantuan
|
||||||
Future<void> loadPengajuanKelayakan(String skemaId) async {
|
Future<void> loadPengajuanKelayakan(String skemaId) async {
|
||||||
@ -200,6 +201,15 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
),
|
),
|
||||||
)),
|
)),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
Text(
|
||||||
|
'Info: Jumlah penerima diambil dari data pengajuan kelayakan bantuan yang telah terverifikasi untuk skema bantuan yang dipilih.',
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12,
|
||||||
|
color: Colors.grey[600],
|
||||||
|
fontStyle: FontStyle.italic,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(height: 16),
|
||||||
Obx(() => jumlahPenerima.value > 0
|
Obx(() => jumlahPenerima.value > 0
|
||||||
? TextButton.icon(
|
? TextButton.icon(
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
@ -312,10 +322,13 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
suffixIcon: const Icon(Icons.calendar_today),
|
suffixIcon: const Icon(Icons.calendar_today),
|
||||||
),
|
),
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
|
// Tanggal minimal adalah 1 hari setelah hari ini
|
||||||
|
final DateTime tomorrow =
|
||||||
|
DateTime.now().add(const Duration(days: 1));
|
||||||
final DateTime? pickedDate = await showDatePicker(
|
final DateTime? pickedDate = await showDatePicker(
|
||||||
context: context,
|
context: context,
|
||||||
initialDate: DateTime.now(),
|
initialDate: tomorrow,
|
||||||
firstDate: DateTime.now(),
|
firstDate: tomorrow,
|
||||||
lastDate: DateTime.now().add(const Duration(days: 365)),
|
lastDate: DateTime.now().add(const Duration(days: 365)),
|
||||||
);
|
);
|
||||||
if (pickedDate != null) {
|
if (pickedDate != null) {
|
||||||
@ -331,19 +344,59 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
const SizedBox(height: 10),
|
||||||
|
|
||||||
|
// Hint info tanggal minimal
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.all(8),
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: Colors.blue[50],
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
border: Border.all(color: Colors.blue[200]!),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
const Icon(
|
||||||
|
Icons.info_outline,
|
||||||
|
color: Colors.blue,
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
const SizedBox(width: 8),
|
||||||
|
Expanded(
|
||||||
|
child: Text(
|
||||||
|
'Tanggal pelaksanaan minimal 1 hari sebelum dijadwalkan',
|
||||||
|
style: TextStyle(
|
||||||
|
color: Colors.blue[900],
|
||||||
|
fontSize: 12,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
// Waktu Penyaluran
|
// Rentang Waktu Penyaluran
|
||||||
Text(
|
Text(
|
||||||
'Waktu Penyaluran',
|
'Rentang Waktu Penyaluran',
|
||||||
style: Theme.of(context).textTheme.titleSmall,
|
style: Theme.of(context).textTheme.titleSmall,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
|
||||||
|
// Waktu Mulai
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const Text('Waktu Mulai'),
|
||||||
|
const SizedBox(height: 4),
|
||||||
TextFormField(
|
TextFormField(
|
||||||
controller: waktuPenyaluranController,
|
controller: waktuMulaiController,
|
||||||
readOnly: true,
|
readOnly: true,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
hintText: 'Pilih waktu penyaluran',
|
hintText: 'Mulai',
|
||||||
border: OutlineInputBorder(
|
border: OutlineInputBorder(
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
),
|
),
|
||||||
@ -359,18 +412,119 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
initialTime: TimeOfDay.now(),
|
initialTime: TimeOfDay.now(),
|
||||||
);
|
);
|
||||||
if (pickedTime != null) {
|
if (pickedTime != null) {
|
||||||
selectedTime.value = pickedTime;
|
selectedWaktuMulai.value = pickedTime;
|
||||||
waktuPenyaluranController.text =
|
waktuMulaiController.text =
|
||||||
|
'${pickedTime.hour.toString().padLeft(2, '0')}:${pickedTime.minute.toString().padLeft(2, '0')}';
|
||||||
|
|
||||||
|
// Jika waktu selesai belum dipilih atau lebih awal dari waktu mulai
|
||||||
|
if (selectedWaktuSelesai.value == null ||
|
||||||
|
(selectedWaktuSelesai.value != null &&
|
||||||
|
(pickedTime.hour >
|
||||||
|
selectedWaktuSelesai
|
||||||
|
.value!.hour ||
|
||||||
|
(pickedTime.hour ==
|
||||||
|
selectedWaktuSelesai
|
||||||
|
.value!.hour &&
|
||||||
|
pickedTime.minute >=
|
||||||
|
selectedWaktuSelesai
|
||||||
|
.value!.minute)))) {
|
||||||
|
// Set waktu selesai 1 jam setelah waktu mulai
|
||||||
|
final TimeOfDay defaultSelesai = TimeOfDay(
|
||||||
|
hour: (pickedTime.hour + 1) % 24,
|
||||||
|
minute: pickedTime.minute,
|
||||||
|
);
|
||||||
|
selectedWaktuSelesai.value = defaultSelesai;
|
||||||
|
waktuSelesaiController.text =
|
||||||
|
'${defaultSelesai.hour.toString().padLeft(2, '0')}:${defaultSelesai.minute.toString().padLeft(2, '0')}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
validator: (value) {
|
||||||
|
if (value == null || value.isEmpty) {
|
||||||
|
return 'Waktu mulai harus dipilih';
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const SizedBox(width: 16),
|
||||||
|
Expanded(
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
const Text('Waktu Selesai'),
|
||||||
|
const SizedBox(height: 4),
|
||||||
|
TextFormField(
|
||||||
|
controller: waktuSelesaiController,
|
||||||
|
readOnly: true,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
hintText: 'Selesai',
|
||||||
|
border: OutlineInputBorder(
|
||||||
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
),
|
||||||
|
contentPadding: const EdgeInsets.symmetric(
|
||||||
|
horizontal: 12,
|
||||||
|
vertical: 8,
|
||||||
|
),
|
||||||
|
suffixIcon: const Icon(Icons.access_time),
|
||||||
|
),
|
||||||
|
onTap: () async {
|
||||||
|
// Pastikan waktu mulai sudah dipilih
|
||||||
|
if (selectedWaktuMulai.value == null) {
|
||||||
|
Get.snackbar(
|
||||||
|
'Perhatian',
|
||||||
|
'Silakan pilih waktu mulai terlebih dahulu',
|
||||||
|
backgroundColor: Colors.amber,
|
||||||
|
colorText: Colors.black,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final TimeOfDay? pickedTime = await showTimePicker(
|
||||||
|
context: context,
|
||||||
|
initialTime: selectedWaktuSelesai.value ??
|
||||||
|
TimeOfDay(
|
||||||
|
hour: (selectedWaktuMulai.value!.hour + 1) %
|
||||||
|
24,
|
||||||
|
minute: selectedWaktuMulai.value!.minute,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (pickedTime != null) {
|
||||||
|
// Validasi waktu selesai harus setelah waktu mulai
|
||||||
|
if (pickedTime.hour <
|
||||||
|
selectedWaktuMulai.value!.hour ||
|
||||||
|
(pickedTime.hour ==
|
||||||
|
selectedWaktuMulai.value!.hour &&
|
||||||
|
pickedTime.minute <=
|
||||||
|
selectedWaktuMulai.value!.minute)) {
|
||||||
|
Get.snackbar(
|
||||||
|
'Perhatian',
|
||||||
|
'Waktu selesai harus setelah waktu mulai',
|
||||||
|
backgroundColor: Colors.amber,
|
||||||
|
colorText: Colors.black,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedWaktuSelesai.value = pickedTime;
|
||||||
|
waktuSelesaiController.text =
|
||||||
'${pickedTime.hour.toString().padLeft(2, '0')}:${pickedTime.minute.toString().padLeft(2, '0')}';
|
'${pickedTime.hour.toString().padLeft(2, '0')}:${pickedTime.minute.toString().padLeft(2, '0')}';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
validator: (value) {
|
validator: (value) {
|
||||||
if (value == null || value.isEmpty) {
|
if (value == null || value.isEmpty) {
|
||||||
return 'Waktu penyaluran harus dipilih';
|
return 'Waktu selesai harus dipilih';
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
// Deskripsi
|
// Deskripsi
|
||||||
@ -407,16 +561,29 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
if (formKey.currentState!.validate()) {
|
if (formKey.currentState!.validate()) {
|
||||||
// Gabungkan tanggal dan waktu
|
// Gabungkan tanggal dan waktu mulai
|
||||||
DateTime? tanggalWaktuPenyaluran;
|
DateTime? tanggalWaktuMulai;
|
||||||
if (selectedDate.value != null &&
|
if (selectedDate.value != null &&
|
||||||
selectedTime.value != null) {
|
selectedWaktuMulai.value != null) {
|
||||||
tanggalWaktuPenyaluran = DateTime(
|
tanggalWaktuMulai = DateTime(
|
||||||
selectedDate.value!.year,
|
selectedDate.value!.year,
|
||||||
selectedDate.value!.month,
|
selectedDate.value!.month,
|
||||||
selectedDate.value!.day,
|
selectedDate.value!.day,
|
||||||
selectedTime.value!.hour,
|
selectedWaktuMulai.value!.hour,
|
||||||
selectedTime.value!.minute,
|
selectedWaktuMulai.value!.minute,
|
||||||
|
).toLocal();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Gabungkan tanggal dan waktu selesai
|
||||||
|
DateTime? tanggalWaktuSelesai;
|
||||||
|
if (selectedDate.value != null &&
|
||||||
|
selectedWaktuSelesai.value != null) {
|
||||||
|
tanggalWaktuSelesai = DateTime(
|
||||||
|
selectedDate.value!.year,
|
||||||
|
selectedDate.value!.month,
|
||||||
|
selectedDate.value!.day,
|
||||||
|
selectedWaktuSelesai.value!.hour,
|
||||||
|
selectedWaktuSelesai.value!.minute,
|
||||||
).toLocal();
|
).toLocal();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,7 +594,10 @@ class TambahPenyaluranView extends GetView<JadwalPenyaluranController> {
|
|||||||
skemaId: selectedSkemaBantuanId.value!,
|
skemaId: selectedSkemaBantuanId.value!,
|
||||||
lokasiPenyaluranId: selectedLokasiPenyaluranId.value!,
|
lokasiPenyaluranId: selectedLokasiPenyaluranId.value!,
|
||||||
jumlahPenerima: jumlahPenerima.value,
|
jumlahPenerima: jumlahPenerima.value,
|
||||||
tanggalPenyaluran: tanggalWaktuPenyaluran,
|
tanggalPenyaluran: tanggalWaktuMulai,
|
||||||
|
tanggalWaktuSelesai: tanggalWaktuSelesai,
|
||||||
|
kategoriBantuanId:
|
||||||
|
selectedSkemaBantuan.value!.kategoriBantuanId!,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -244,6 +244,8 @@ class SupabaseService extends GetxService {
|
|||||||
.lt('tanggal_penyaluran', tomorrowUtc)
|
.lt('tanggal_penyaluran', tomorrowUtc)
|
||||||
.inFilter('status', ['AKTIF', 'DIJADWALKAN']);
|
.inFilter('status', ['AKTIF', 'DIJADWALKAN']);
|
||||||
|
|
||||||
|
print("hari ini $response");
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print('Error getting jadwal hari ini: $e');
|
print('Error getting jadwal hari ini: $e');
|
||||||
|
Reference in New Issue
Block a user