|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|
|
|
import 'package:siopas/models/asset_status_model.dart';
|
|
|
|
import 'package:siopas/models/condition_peti_model.dart';
|
|
|
|
import 'package:siopas/models/customer_model.dart';
|
|
|
|
import 'package:siopas/models/m_asset_status_model.dart';
|
|
|
|
import 'package:siopas/pages/pengembalian_barang/controller/pengembalian_controller.dart';
|
|
|
|
import 'package:intl/date_symbol_data_local.dart';
|
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
import 'package:collection/collection.dart';
|
|
|
|
|
|
|
|
import '../../models/warehouse_mode.dart';
|
|
|
|
import '../../services/controllerApi.dart';
|
|
|
|
import '../../widget/loading_shimmer_show.dart';
|
|
|
|
|
|
|
|
class DetailPengembalianBarangPage extends StatefulWidget {
|
|
|
|
final String pengembalianId;
|
|
|
|
|
|
|
|
const DetailPengembalianBarangPage({Key? key, required this.pengembalianId})
|
|
|
|
: super(key: key);
|
|
|
|
|
|
|
|
@override
|
|
|
|
_DetailPengembalianBarangPageState createState() =>
|
|
|
|
_DetailPengembalianBarangPageState();
|
|
|
|
}
|
|
|
|
|
|
|
|
class _DetailPengembalianBarangPageState
|
|
|
|
extends State<DetailPengembalianBarangPage> {
|
|
|
|
AssetStatusModel? pengembalianInfo;
|
|
|
|
WarehouseModel? warehouseInfo;
|
|
|
|
|
|
|
|
List<PetiAssetModel>? petiData;
|
|
|
|
List<CustomerModel>? customerData;
|
|
|
|
List<WarehouseModel>? warehouseData;
|
|
|
|
List<ConditionPetiModel>? _valconditionPeti;
|
|
|
|
|
|
|
|
bool loading = true;
|
|
|
|
late Future<void> _dataFuture;
|
|
|
|
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
super.initState();
|
|
|
|
|
|
|
|
// Set loading ke true pada awalnya
|
|
|
|
if (mounted) {
|
|
|
|
if (mounted) {
|
|
|
|
setState(() {
|
|
|
|
loading = false;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
_dataFuture = fetchData();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> fetchData() async {
|
|
|
|
await getPengembalianIdData();
|
|
|
|
await customerListAPI();
|
|
|
|
await petiListAPI();
|
|
|
|
await warehouseListAPI();
|
|
|
|
await kondisiPetiListAPI();
|
|
|
|
initializeDateFormatting('id_ID', null);
|
|
|
|
|
|
|
|
// Tandai bahwa proses loading telah selesai
|
|
|
|
if (mounted) {
|
|
|
|
setState(() {
|
|
|
|
loading = false;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future customerListAPI() async {
|
|
|
|
if (mounted) {
|
|
|
|
await ControllerApi().fetchCustomerDataAPI().then((value) {
|
|
|
|
setState(() {
|
|
|
|
customerData = (value as List<dynamic>)
|
|
|
|
.map((item) => CustomerModel.fromJson(item))
|
|
|
|
.toList();
|
|
|
|
loading = false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future petiListAPI() async {
|
|
|
|
if (mounted) {
|
|
|
|
await ControllerApi().fetchPetiDataAPI().then((value) {
|
|
|
|
setState(() {
|
|
|
|
petiData = (value as List<dynamic>)
|
|
|
|
.map((item) => PetiAssetModel.fromJson(item))
|
|
|
|
.toList();
|
|
|
|
loading = false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future kondisiPetiListAPI() async {
|
|
|
|
if (mounted) {
|
|
|
|
await ControllerApi().fetchKondisiPetiDataAPI().then((value) {
|
|
|
|
setState(() {
|
|
|
|
_valconditionPeti = (value as List<dynamic>)
|
|
|
|
.map((item) => ConditionPetiModel.fromJson(item))
|
|
|
|
.toList();
|
|
|
|
loading = false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future warehouseListAPI() async {
|
|
|
|
if (mounted) {
|
|
|
|
await ControllerApi().fetchWarehouseDataAPI().then((value) {
|
|
|
|
setState(() {
|
|
|
|
warehouseData = (value as List<dynamic>)
|
|
|
|
.map((item) => WarehouseModel.fromJson(item))
|
|
|
|
.toList();
|
|
|
|
loading = false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> getPengembalianIdData() async {
|
|
|
|
List<AssetStatusModel> pengembalians =
|
|
|
|
await ControllerPengembalian().fetchPengembalianDataId();
|
|
|
|
pengembalianInfo = pengembalians.firstWhereOrNull(
|
|
|
|
(pengembalian) => pengembalian.id.toString() == widget.pengembalianId,
|
|
|
|
);
|
|
|
|
|
|
|
|
if (mounted) {
|
|
|
|
setState(() {});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
String _formatDate(String? date) {
|
|
|
|
if (date != null) {
|
|
|
|
DateTime parsedDate = DateTime.parse(date);
|
|
|
|
String formattedDate =
|
|
|
|
DateFormat('EEEE, dd MMMM yyyy', 'id_ID').format(parsedDate);
|
|
|
|
return formattedDate;
|
|
|
|
} else {
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _deletePengembalian() async {
|
|
|
|
try {
|
|
|
|
// Panggil fungsi untuk menghapus pengembalian berdasarkan ID
|
|
|
|
await ControllerPengembalian()
|
|
|
|
.deletePengembalianById(widget.pengembalianId);
|
|
|
|
// Navigasi kembali ke halaman sebelumnya atau halaman yang sesuai
|
|
|
|
Navigator.pushNamed(context, '/pengembalian-barang');
|
|
|
|
} catch (e) {
|
|
|
|
// Tangani kesalahan jika terjadi
|
|
|
|
print('Gagal menghapus pengembalian: $e');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
PetiAssetModel? petiSqfliteApi;
|
|
|
|
petiSqfliteApi = petiData?.firstWhereOrNull(
|
|
|
|
(peti) => peti.id == pengembalianInfo!.peti_id,
|
|
|
|
);
|
|
|
|
|
|
|
|
CustomerModel? customerSqfliteApi;
|
|
|
|
customerSqfliteApi = customerData?.firstWhereOrNull(
|
|
|
|
(customer) => customer.id == pengembalianInfo?.customer_id,
|
|
|
|
);
|
|
|
|
|
|
|
|
WarehouseModel? warehouseSqfliteApi;
|
|
|
|
warehouseSqfliteApi = warehouseData?.firstWhereOrNull(
|
|
|
|
(warehouse) => warehouse.id == pengembalianInfo!.enter_warehouse,
|
|
|
|
);
|
|
|
|
|
|
|
|
ConditionPetiModel? conditionPetiSqfliteApi;
|
|
|
|
conditionPetiSqfliteApi = _valconditionPeti?.firstWhereOrNull(
|
|
|
|
(conditionPeti) => conditionPeti.id == pengembalianInfo!.kondisi_peti_id,
|
|
|
|
);
|
|
|
|
|
|
|
|
Future<void> _showDeleteConfirmationDialog() async {
|
|
|
|
return showDialog<void>(
|
|
|
|
context: context,
|
|
|
|
builder: (BuildContext context) {
|
|
|
|
return AlertDialog(
|
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.circular(16.0),
|
|
|
|
),
|
|
|
|
title: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Icon(
|
|
|
|
Icons.info,
|
|
|
|
color: Colors.blue,
|
|
|
|
),
|
|
|
|
SizedBox(width: 8),
|
|
|
|
Text(
|
|
|
|
'Konfirmasi Hapus',
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 18,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
IconButton(
|
|
|
|
icon: Icon(
|
|
|
|
Icons.close,
|
|
|
|
color: Colors.black54,
|
|
|
|
),
|
|
|
|
onPressed: () {
|
|
|
|
Navigator.of(context).pop();
|
|
|
|
},
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
content: SingleChildScrollView(
|
|
|
|
child: ListBody(
|
|
|
|
children: <Widget>[
|
|
|
|
Text(
|
|
|
|
'Anda yakin ingin menghapus pengembalian ini? ${petiSqfliteApi!.fix_lot.toString()}',
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
actions: <Widget>[
|
|
|
|
Container(
|
|
|
|
margin: EdgeInsets.only(right: 3.0),
|
|
|
|
child: ElevatedButton(
|
|
|
|
child: Text('Hapus'),
|
|
|
|
onPressed: () {
|
|
|
|
// Panggil fungsi untuk menghapus pengembalian berdasarkan ID
|
|
|
|
_deletePengembalian();
|
|
|
|
Navigator.pushNamed(context, '/pengembalian-barang');
|
|
|
|
EasyLoading.showSuccess(
|
|
|
|
'Berhasil menghapus data pengembalian');
|
|
|
|
},
|
|
|
|
style: ElevatedButton.styleFrom(
|
|
|
|
primary: Colors.red,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
return WillPopScope(
|
|
|
|
onWillPop: () async {
|
|
|
|
// Mencegah kembali ke halaman sebelumnya
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
child: Scaffold(
|
|
|
|
backgroundColor: Colors.grey[200],
|
|
|
|
appBar: AppBar(
|
|
|
|
backgroundColor: Colors.indigo[700],
|
|
|
|
elevation: 0,
|
|
|
|
title: Text(
|
|
|
|
'Detail Peti In',
|
|
|
|
style: TextStyle(
|
|
|
|
color: Colors.white,
|
|
|
|
fontSize: 16,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
leading: IconButton(
|
|
|
|
icon: Icon(Icons.arrow_back, color: Colors.white),
|
|
|
|
onPressed: () {
|
|
|
|
Navigator.pop(context);
|
|
|
|
},
|
|
|
|
),
|
|
|
|
actions: [
|
|
|
|
IconButton(
|
|
|
|
icon: Icon(Icons.delete, color: Colors.redAccent),
|
|
|
|
onPressed: () {
|
|
|
|
_showDeleteConfirmationDialog();
|
|
|
|
},
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
body: FutureBuilder<void>(
|
|
|
|
future: _dataFuture,
|
|
|
|
builder: (context, snapshot) {
|
|
|
|
if (snapshot.connectionState == ConnectionState.waiting) {
|
|
|
|
return ShimmerShow();
|
|
|
|
} else if (snapshot.hasError) {
|
|
|
|
return Text('Error: ${snapshot.error}');
|
|
|
|
} else {
|
|
|
|
return Padding(
|
|
|
|
padding: EdgeInsets.all(16.0),
|
|
|
|
child: Card(
|
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius: BorderRadius.circular(15.0),
|
|
|
|
),
|
|
|
|
elevation: 5,
|
|
|
|
child: Column(
|
|
|
|
children: [
|
|
|
|
Card(
|
|
|
|
shape: RoundedRectangleBorder(
|
|
|
|
borderRadius:
|
|
|
|
BorderRadius.vertical(top: Radius.circular(15.0)),
|
|
|
|
),
|
|
|
|
elevation: 0,
|
|
|
|
margin: EdgeInsets.all(0),
|
|
|
|
color: Colors.indigo[700],
|
|
|
|
child: Padding(
|
|
|
|
padding: const EdgeInsets.all(16.0),
|
|
|
|
child: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
Icon(Icons.article,
|
|
|
|
size: 30, color: Colors.white),
|
|
|
|
SizedBox(width: 10),
|
|
|
|
Column(
|
|
|
|
crossAxisAlignment:
|
|
|
|
CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
SizedBox(height: 5),
|
|
|
|
Text(
|
|
|
|
petiSqfliteApi != null &&
|
|
|
|
petiSqfliteApi.fix_lot != null
|
|
|
|
? petiSqfliteApi!.fix_lot.toString()
|
|
|
|
: '-',
|
|
|
|
style: TextStyle(
|
|
|
|
fontSize: 12,
|
|
|
|
fontWeight: FontWeight.bold,
|
|
|
|
color: Colors.white,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
SizedBox(height: 10),
|
|
|
|
if (pengembalianInfo != null) ...[
|
|
|
|
_buildDetailItem(
|
|
|
|
'Kode Peti',
|
|
|
|
petiSqfliteApi != null &&
|
|
|
|
petiSqfliteApi.fix_lot != null
|
|
|
|
? petiSqfliteApi!.fix_lot.toString()
|
|
|
|
: '-',
|
|
|
|
),
|
|
|
|
|
|
|
|
Divider(thickness: 1),
|
|
|
|
_buildDetailItem('Tgl Pengembalian',
|
|
|
|
_formatDate(pengembalianInfo!.enter_at.toString())),
|
|
|
|
Divider(thickness: 1),
|
|
|
|
_buildDetailItem(
|
|
|
|
'PIC/PJ:', pengembalianInfo!.enter_pic.toString()),
|
|
|
|
Divider(thickness: 1),
|
|
|
|
_buildDetailItem(
|
|
|
|
'Gudang',
|
|
|
|
warehouseSqfliteApi != null &&
|
|
|
|
warehouseSqfliteApi.name != null
|
|
|
|
? warehouseSqfliteApi!.name.toString()
|
|
|
|
: '-'),
|
|
|
|
Divider(thickness: 1),
|
|
|
|
_buildDetailItem(
|
|
|
|
'Kondisi Barang',
|
|
|
|
conditionPetiSqfliteApi != null &&
|
|
|
|
conditionPetiSqfliteApi.nama_kondisi != null
|
|
|
|
? conditionPetiSqfliteApi!.nama_kondisi.toString()
|
|
|
|
: '-',
|
|
|
|
),
|
|
|
|
|
|
|
|
Divider(thickness: 1),
|
|
|
|
// ... tambahkan data lainnya sesuai kebutuhan
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Widget _buildDetailItem(String label, String value) {
|
|
|
|
return Padding(
|
|
|
|
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0),
|
|
|
|
child: Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
Text(
|
|
|
|
label,
|
|
|
|
style: TextStyle(fontSize: 12.5, fontWeight: FontWeight.bold),
|
|
|
|
),
|
|
|
|
Text(value),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|