step 27 : fix homescreen, report timestamp, filter history transaksi
This commit is contained in:
@@ -13,7 +13,7 @@ class Constant {
|
||||
// static String version = "1.00";
|
||||
|
||||
// NOTE VERSI HARUS SAMA DENGAN PUBSPEC.YAML
|
||||
static String version = "1.0.0";
|
||||
static String version = "1.1.0";
|
||||
|
||||
// static String baseUrl = "https://devregonline.pramita.co.id/one-api/xdoc/";
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ class HistoryTransaksiModel {
|
||||
String? tanggalconfirm;
|
||||
String? usertransaksi;
|
||||
String? userconfirm;
|
||||
String? tanggalcreated;
|
||||
|
||||
HistoryTransaksiModel(
|
||||
{this.id,
|
||||
@@ -26,7 +27,9 @@ class HistoryTransaksiModel {
|
||||
this.isconfirm,
|
||||
this.tanggalconfirm,
|
||||
this.usertransaksi,
|
||||
this.userconfirm});
|
||||
this.userconfirm,
|
||||
this.tanggalcreated
|
||||
});
|
||||
|
||||
HistoryTransaksiModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
@@ -42,6 +45,7 @@ class HistoryTransaksiModel {
|
||||
tanggalconfirm = json['tanggalconfirm'];
|
||||
usertransaksi = json['usertransaksi'];
|
||||
userconfirm = json['userconfirm'];
|
||||
tanggalcreated = json['tanggalcreated'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
@@ -59,6 +63,7 @@ class HistoryTransaksiModel {
|
||||
data['tanggalconfirm'] = this.tanggalconfirm;
|
||||
data['usertransaksi'] = this.usertransaksi;
|
||||
data['userconfirm'] = this.userconfirm;
|
||||
data['tanggalcreated'] = this.tanggalcreated;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@@ -12,21 +12,24 @@ class ListTransaksiHomeModel {
|
||||
String? tanggalconfirm;
|
||||
String? usertransaksi;
|
||||
String? userconfirm;
|
||||
String? tanggalcreated;
|
||||
|
||||
ListTransaksiHomeModel(
|
||||
{this.id,
|
||||
this.tanggaltransaksi,
|
||||
this.tipe,
|
||||
this.kategoriid,
|
||||
this.kategoriname,
|
||||
this.note,
|
||||
this.amount,
|
||||
this.sender,
|
||||
this.imgurl,
|
||||
this.isconfirm,
|
||||
this.tanggalconfirm,
|
||||
this.usertransaksi,
|
||||
this.userconfirm});
|
||||
ListTransaksiHomeModel({
|
||||
this.id,
|
||||
this.tanggaltransaksi,
|
||||
this.tipe,
|
||||
this.kategoriid,
|
||||
this.kategoriname,
|
||||
this.note,
|
||||
this.amount,
|
||||
this.sender,
|
||||
this.imgurl,
|
||||
this.isconfirm,
|
||||
this.tanggalconfirm,
|
||||
this.usertransaksi,
|
||||
this.userconfirm,
|
||||
this.tanggalcreated,
|
||||
});
|
||||
|
||||
ListTransaksiHomeModel.fromJson(Map<String, dynamic> json) {
|
||||
id = json['id'];
|
||||
@@ -42,6 +45,7 @@ class ListTransaksiHomeModel {
|
||||
tanggalconfirm = json['tanggalconfirm'];
|
||||
usertransaksi = json['usertransaksi'];
|
||||
userconfirm = json['userconfirm'];
|
||||
tanggalcreated = json['tanggalcreated'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
@@ -59,6 +63,7 @@ class ListTransaksiHomeModel {
|
||||
data['tanggalconfirm'] = this.tanggalconfirm;
|
||||
data['usertransaksi'] = this.usertransaksi;
|
||||
data['userconfirm'] = this.userconfirm;
|
||||
data['tanggalcreated'] = this.tanggalcreated;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,7 +139,7 @@ class TransaksiRepository extends BaseRepository {
|
||||
String categoryid,
|
||||
) async {
|
||||
final service =
|
||||
"${Constant.baseUrlDevone}/homescreen/list_transaction/?companyid=$companyid&startdate=$tglAwal&enddate=$tglAkhir&kategoriid=$categoryid";
|
||||
"${Constant.baseUrlDevone}/history/list_transaction/?companyid=$companyid&startdate=$tglAwal&enddate=$tglAkhir&kategoriid=$categoryid";
|
||||
// https://devone.aplikasi.web.id/one-api-pettycash/pettycash/history/list_transaction/?companyid=1&startdate=2023-12-01&enddate=2023-12-30&kategoriid=0
|
||||
final resp = await get(
|
||||
// param: {
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:app_petty_cash/screen/home/list_transaksi_home_provider.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../../app/constant.dart';
|
||||
@@ -140,6 +141,25 @@ class HomeScreen extends HookConsumerWidget {
|
||||
},
|
||||
);
|
||||
|
||||
String formatDateString(String inputDate) {
|
||||
try {
|
||||
// Parsing tanggal dari string input
|
||||
DateTime date =
|
||||
DateFormat('dd-MM-yyyy HH:mm:ss', 'id').parse(inputDate);
|
||||
|
||||
// Format tanggal ke '30 Des 2023'
|
||||
String formattedDate =
|
||||
DateFormat('dd MMM yyyy HH:mm:ss', 'id').format(date);
|
||||
|
||||
return formattedDate;
|
||||
} catch (e) {
|
||||
// Tangkap kesalahan jika format tanggal tidak sesuai
|
||||
print('Error parsing date: $e');
|
||||
// return 'Format Tanggal Salah';
|
||||
return inputDate;
|
||||
}
|
||||
}
|
||||
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: Constant.getActualYPhone(context: context, y: 30),
|
||||
@@ -400,6 +420,60 @@ class HomeScreen extends HookConsumerWidget {
|
||||
.value[idx].tipe
|
||||
.toString(),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 10),
|
||||
),
|
||||
|
||||
// catatan
|
||||
Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
listTransaksiHome.value[idx].note
|
||||
.toString(),
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 10),
|
||||
),
|
||||
|
||||
// Tanggal Created align right
|
||||
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
'created : ' +
|
||||
formatDateString(
|
||||
listTransaksiHome
|
||||
.value[idx]
|
||||
.tanggalcreated
|
||||
.toString(),
|
||||
),
|
||||
overflow:
|
||||
TextOverflow.ellipsis,
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight:
|
||||
FontWeight.normal,
|
||||
fontStyle: FontStyle.italic,
|
||||
color: Constant.textBlack,
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -31,6 +31,10 @@ class ReportScreen extends HookConsumerWidget {
|
||||
final tglAkhirTmp = useState<String>("");
|
||||
String M_CompanyID = "0";
|
||||
|
||||
String timeStamp = DateFormat('dd-MM-yyyy').format(
|
||||
DateTime.now(),
|
||||
);
|
||||
|
||||
Future<String> getCompanyID() async {
|
||||
final shared = await SharedPreferences.getInstance();
|
||||
String M_CompanyID = "0";
|
||||
@@ -328,8 +332,9 @@ class ReportScreen extends HookConsumerWidget {
|
||||
),
|
||||
onPressed: () async {
|
||||
M_CompanyID = await getCompanyID();
|
||||
if(M_CompanyID == "0"){
|
||||
SanckbarWidget(context, 'Invalid Company', snackbarType.error);
|
||||
if (M_CompanyID == "0") {
|
||||
SanckbarWidget(
|
||||
context, 'Invalid Company', snackbarType.error);
|
||||
return;
|
||||
}
|
||||
// Awal
|
||||
@@ -343,13 +348,13 @@ class ReportScreen extends HookConsumerWidget {
|
||||
// Akhir
|
||||
DateTime parsedDateAkhir =
|
||||
DateFormat('dd-MM-yyyy').parse(
|
||||
ctrlTglAwal.value.text.toString(),
|
||||
ctrlTglAkhir.value.text.toString(),
|
||||
);
|
||||
String formattedDateAkhir =
|
||||
DateFormat('yyyy-MM-dd').format(parsedDateAkhir);
|
||||
|
||||
String url =
|
||||
"https://${Constant.baseUrlDevoneReport}/birt/run?__report=report/one/pettycash/rpt_r_pt_001.rptdesign&__format=xls&PStartDate=$formattedDateAwal&PEndDate=$formattedDateAkhir&PCompanyID=$M_CompanyID&username=adminsas%20";
|
||||
"https://${Constant.baseUrlDevoneReport}/birt/run?__report=report/one/pettycash/rpt_r_pt_001.rptdesign&__format=xls&PStartDate=$formattedDateAwal&PEndDate=$formattedDateAkhir&PCompanyID=$M_CompanyID&username=adminsas%20&tm=$timeStamp";
|
||||
if (!await launchUrl(Uri.parse(url))) {
|
||||
// throw Exception('Could not launch $url');
|
||||
SanckbarWidget(context, 'Could not launch $url',
|
||||
@@ -406,8 +411,9 @@ class ReportScreen extends HookConsumerWidget {
|
||||
),
|
||||
onPressed: () async {
|
||||
M_CompanyID = await getCompanyID();
|
||||
if(M_CompanyID == "0"){
|
||||
SanckbarWidget(context, 'Invalid Company', snackbarType.error);
|
||||
if (M_CompanyID == "0") {
|
||||
SanckbarWidget(
|
||||
context, 'Invalid Company', snackbarType.error);
|
||||
return;
|
||||
}
|
||||
// Awal
|
||||
@@ -421,13 +427,15 @@ class ReportScreen extends HookConsumerWidget {
|
||||
// Akhir
|
||||
DateTime parsedDateAkhir =
|
||||
DateFormat('dd-MM-yyyy').parse(
|
||||
ctrlTglAwal.value.text.toString(),
|
||||
ctrlTglAkhir.value.text.toString(),
|
||||
);
|
||||
String formattedDateAkhir =
|
||||
DateFormat('yyyy-MM-dd').format(parsedDateAkhir);
|
||||
|
||||
String url =
|
||||
"https://${Constant.baseUrlDevoneReport}/birt/run?__report=report/one/pettycash/rpt_r_pt_001.rptdesign&__format=pdf&PStartDate=$formattedDateAwal&PEndDate=$formattedDateAkhir&PCompanyID=$M_CompanyID&username=adminsas%20";
|
||||
"https://${Constant.baseUrlDevoneReport}/birt/run?__report=report/one/pettycash/rpt_r_pt_001.rptdesign&__format=pdf&PStartDate=$formattedDateAwal&PEndDate=$formattedDateAkhir&PCompanyID=$M_CompanyID&username=adminsas%20&tm=$timeStamp";
|
||||
|
||||
print(url);
|
||||
if (!await launchUrl(Uri.parse(url))) {
|
||||
// throw Exception('Could not launch $url');
|
||||
SanckbarWidget(context, 'Could not launch $url',
|
||||
|
||||
@@ -464,6 +464,25 @@ class HistoryTransaksiScreen extends HookConsumerWidget {
|
||||
final FocusNode focusNodetglAkhir = useFocusNode();
|
||||
final tglAkhirHasFocus = useState(false);
|
||||
|
||||
String formatDateString(String inputDate) {
|
||||
try {
|
||||
// Parsing tanggal dari string input
|
||||
DateTime date =
|
||||
DateFormat('dd-MM-yyyy HH:mm:ss', 'id').parse(inputDate);
|
||||
|
||||
// Format tanggal ke '30 Des 2023'
|
||||
String formattedDate =
|
||||
DateFormat('dd MMM yyyy HH:mm:ss', 'id').format(date);
|
||||
|
||||
return formattedDate;
|
||||
} catch (e) {
|
||||
// Tangkap kesalahan jika format tanggal tidak sesuai
|
||||
print('Error parsing date: $e');
|
||||
// return 'Format Tanggal Salah';
|
||||
return inputDate;
|
||||
}
|
||||
}
|
||||
|
||||
return GestureDetector(
|
||||
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
|
||||
child: Padding(
|
||||
@@ -736,6 +755,7 @@ class HistoryTransaksiScreen extends HookConsumerWidget {
|
||||
value: option,
|
||||
child: Text(
|
||||
option.categoryname ?? "",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: Constant.body1(context: context)
|
||||
.copyWith(
|
||||
color: Constant.textBlack,
|
||||
@@ -875,13 +895,27 @@ class HistoryTransaksiScreen extends HookConsumerWidget {
|
||||
],
|
||||
),
|
||||
onPressed: () async {
|
||||
DateTime parsedDate =
|
||||
DateFormat('dd-MM-yyyy').parse(
|
||||
ctrlTglAwal.value.text.toString(),
|
||||
);
|
||||
String formattedDateAwal =
|
||||
DateFormat('yyyy-MM-dd').format(parsedDate);
|
||||
|
||||
DateTime parsedDateAkhir =
|
||||
DateFormat('dd-MM-yyyy').parse(
|
||||
ctrlTglAkhir.value.text.toString(),
|
||||
);
|
||||
String formattedDateAkhir = DateFormat('yyyy-MM-dd')
|
||||
.format(parsedDateAkhir);
|
||||
|
||||
M_CompanyID.value = await getCompanyID();
|
||||
ref
|
||||
.read(searchHistoryTransaksiProvider.notifier)
|
||||
.searchHistoryTransaksi(
|
||||
M_CompanyID.value,
|
||||
ctrlTglAwal.text,
|
||||
ctrlTglAkhir.text,
|
||||
formattedDateAwal,
|
||||
formattedDateAkhir,
|
||||
selectedListCategory.value.categoryid ?? "0",
|
||||
);
|
||||
},
|
||||
@@ -1080,7 +1114,27 @@ class HistoryTransaksiScreen extends HookConsumerWidget {
|
||||
// ),
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 6),
|
||||
context: context, y: 10),
|
||||
),
|
||||
|
||||
// catatan
|
||||
Align(
|
||||
alignment: Alignment.centerLeft,
|
||||
child: Text(
|
||||
listSearchHistory.value[idx].note
|
||||
.toString(),
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Constant.textBlack,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
SizedBox(
|
||||
height: Constant.getActualYPhone(
|
||||
context: context, y: 10),
|
||||
),
|
||||
|
||||
if (listSearchHistory
|
||||
@@ -1308,70 +1362,32 @@ class HistoryTransaksiScreen extends HookConsumerWidget {
|
||||
),
|
||||
],
|
||||
),
|
||||
// Row(
|
||||
// children: [
|
||||
// Container(
|
||||
// width: Constant.getActualXPhone(
|
||||
// context: context, x: 40),
|
||||
// height: Constant.getActualYPhone(
|
||||
// context: context,
|
||||
// y: 40,
|
||||
// ),
|
||||
// child: Image.asset(
|
||||
// "images/icon_delete.png",
|
||||
// // scale: 1,
|
||||
// ),
|
||||
// ),
|
||||
// SizedBox(
|
||||
// height: Constant.getActualYPhone(
|
||||
// context: context, y: 12),
|
||||
// ),
|
||||
// Expanded(
|
||||
// child: ElevatedButton(
|
||||
// style: ButtonStyle(
|
||||
// backgroundColor: MaterialStateColor
|
||||
// .resolveWith((st) => Constant
|
||||
// .pcBtnBackgroundColor),
|
||||
// shape:
|
||||
// MaterialStateProperty.all<
|
||||
// RoundedRectangleBorder>(
|
||||
// RoundedRectangleBorder(
|
||||
// borderRadius:
|
||||
// BorderRadius.circular(
|
||||
// 8),
|
||||
// side: BorderSide(
|
||||
// color: Constant
|
||||
// .pcBtnBackgroundColor,
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// shadowColor:
|
||||
// MaterialStateProperty.all(
|
||||
// Color(0xffff48423d)),
|
||||
// elevation:
|
||||
// MaterialStateProperty.all(
|
||||
// 4.0),
|
||||
// ),
|
||||
// child: Stack(
|
||||
// children: [
|
||||
// Text(
|
||||
// 'Confirmed',
|
||||
// style: Constant.body1(
|
||||
// context: context)
|
||||
// .copyWith(
|
||||
// fontWeight:
|
||||
// FontWeight
|
||||
// .w600,
|
||||
// color: Constant
|
||||
// .white),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// onPressed: () {},
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// Tanggal Created align right
|
||||
|
||||
Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
'created : ' +
|
||||
formatDateString(
|
||||
listSearchHistory
|
||||
.value[idx]
|
||||
.tanggalcreated
|
||||
.toString(),
|
||||
),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: Constant.body1(
|
||||
context: context)
|
||||
.copyWith(
|
||||
fontWeight: FontWeight.normal,
|
||||
fontStyle: FontStyle.italic,
|
||||
color: Constant.textBlack,
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -39,6 +39,7 @@ class TransaksiSelectKategoriWidget extends StatelessWidget {
|
||||
value: option,
|
||||
child: Text(
|
||||
option.categoryname ?? "",
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: Constant.body1(context: context).copyWith(
|
||||
color: Constant.textBlack, fontWeight: FontWeight.w400),
|
||||
),
|
||||
|
||||
@@ -211,71 +211,6 @@ class HistoryRowAtasWidget extends HookConsumerWidget {
|
||||
Radius.circular(8.0),
|
||||
),
|
||||
),
|
||||
// child: Text('s'),
|
||||
// child: FutureBuilder<Widget>(
|
||||
// future: checkFileExistence(
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg',
|
||||
// ),
|
||||
// builder: (context, snapshot) {
|
||||
// // if (snapshot.connectionState == ConnectionState.waiting) {
|
||||
// // // return CircularProgressIndicator();
|
||||
// // return Text('');
|
||||
// // } else if (snapshot.hasError) {
|
||||
// // return Icon(
|
||||
// // Icons.error,
|
||||
// // color: Colors.red,
|
||||
// // );
|
||||
// // } else {
|
||||
// // return snapshot.data ?? Container();
|
||||
// // }
|
||||
|
||||
// if (snapshot.connectionState == ConnectionState.done) {
|
||||
// return snapshot.data ?? Container();
|
||||
// } else if (snapshot.hasError) {
|
||||
// return Icon(
|
||||
// Icons.error,
|
||||
// color: Colors.red,
|
||||
// );
|
||||
// } else {
|
||||
// return Text('');
|
||||
// }
|
||||
// },
|
||||
// ),
|
||||
// child: Consumer(
|
||||
// builder: (context, watch, child) {
|
||||
// String iconUrl =
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg';
|
||||
// final iconAsyncValue = ref.read(
|
||||
// iconProvider(
|
||||
// iconUrl,
|
||||
// ),
|
||||
// );
|
||||
|
||||
// return iconAsyncValue.when(
|
||||
// loading: () {
|
||||
// print('loading iconurl : $iconUrl');
|
||||
// return CircularProgressIndicator();
|
||||
// },
|
||||
// error: (error, stackTrace) {
|
||||
// print('error iconurl : $iconUrl');
|
||||
// return Icon(
|
||||
// Icons.error,
|
||||
// color: Colors.red,
|
||||
// );
|
||||
// },
|
||||
// data: (iconWidget) {
|
||||
// print('data iconurl : $iconUrl');
|
||||
// return iconWidget ?? Container();
|
||||
// }
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
|
||||
// child: SvgPicture.network(
|
||||
// 'https://devone.aplikasi.web.id/pettycash-media/icon/icon_$icon_category_id.svg',
|
||||
// semanticsLabel: 'Icon pizza',
|
||||
// ),
|
||||
|
||||
child: getIconUrl(icon_category_id),
|
||||
),
|
||||
|
||||
|
||||
Reference in New Issue
Block a user