From 409b8561e7f429bd7e56a8afa36e52667db681c9 Mon Sep 17 00:00:00 2001 From: sindhu Date: Mon, 5 Feb 2024 11:56:54 +0700 Subject: [PATCH] step 21 : rekap kehadiran di home screen & update versi 1.0.2 --- lib/app/constant.dart | 2 +- .../rekap_kehadiran_home_screen_model.dart | 33 ++++++++ ...current_rekap_kehadiran_home_provider.dart | 5 ++ lib/repository/presensi_repository.dart | 46 ++++++++++ lib/screen/home/home_screen.dart | 60 ++++++++++++-- .../rekap_kehadiran_home_screen_provider.dart | 83 +++++++++++++++++++ pubspec.yaml | 2 +- 7 files changed, 220 insertions(+), 11 deletions(-) create mode 100644 lib/model/rekap_kehadiran_home_screen_model.dart create mode 100644 lib/provider/current_rekap_kehadiran_home_provider.dart create mode 100644 lib/screen/home/rekap_kehadiran_home_screen_provider.dart diff --git a/lib/app/constant.dart b/lib/app/constant.dart index 95141d5..da867fd 100644 --- a/lib/app/constant.dart +++ b/lib/app/constant.dart @@ -14,7 +14,7 @@ class Constant { static double designWidthPhone = 390; // NOTE VERSI HARUS SAMA DENGAN PUBSPEC.YAML - static String version = "1.0.1"; + static String version = "1.0.2"; // color theme static Color textTrueBlack = const Color(0xff000000); diff --git a/lib/model/rekap_kehadiran_home_screen_model.dart b/lib/model/rekap_kehadiran_home_screen_model.dart new file mode 100644 index 0000000..37b0a32 --- /dev/null +++ b/lib/model/rekap_kehadiran_home_screen_model.dart @@ -0,0 +1,33 @@ +class RekapKehadiranHomeScreenModel { + String? status; + String? message; + String? kehadiran; + String? tidakHadir; + String? lembur; + + RekapKehadiranHomeScreenModel({ + this.status, + this.message, + this.kehadiran, + this.tidakHadir, + this.lembur, + }); + + RekapKehadiranHomeScreenModel.fromJson(Map json) { + status = json['status']; + message = json['message']; + kehadiran = json['kehadiran']; + tidakHadir = json['tidak_hadir']; + lembur = json['lembur']; + } + + Map toJson() { + final Map data = new Map(); + data['status'] = this.status; + data['message'] = this.message; + data['kehadiran'] = this.kehadiran; + data['tidak_hadir'] = this.tidakHadir; + data['lembur'] = this.lembur; + return data; + } +} diff --git a/lib/provider/current_rekap_kehadiran_home_provider.dart b/lib/provider/current_rekap_kehadiran_home_provider.dart new file mode 100644 index 0000000..a01049f --- /dev/null +++ b/lib/provider/current_rekap_kehadiran_home_provider.dart @@ -0,0 +1,5 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../model/rekap_kehadiran_home_screen_model.dart'; + +final currentRekapKehadiranHomeProvider = StateProvider((ref) => null); \ No newline at end of file diff --git a/lib/repository/presensi_repository.dart b/lib/repository/presensi_repository.dart index 15bacad..3819ce8 100644 --- a/lib/repository/presensi_repository.dart +++ b/lib/repository/presensi_repository.dart @@ -1,5 +1,6 @@ import 'package:absensi_sas/model/check_distance_model.dart'; import 'package:absensi_sas/model/check_presensi_jam_model.dart'; +import '../model/rekap_kehadiran_home_screen_model.dart'; import 'base_repository.dart'; class PresensiRepository extends BaseRepository { @@ -177,4 +178,49 @@ class PresensiRepository extends BaseRepository { ); return result; } + + // rekap kehadiran home screen + Future rekapKehadiranHomeScreen( + String M_StaffID, + String M_CompanyID, + String token, + Map paramInpVariables, + ) async { + const String query = + r'''query($M_StaffID:String!, $M_CompanyID:String!, $token:String!){ + queryRekapKehadiranHomeScreen(M_StaffID:$M_StaffID, M_CompanyID:$M_CompanyID, token:$token){ + status + message + kehadiran + tidak_hadir + lembur + } + }'''; + + // Map inpVariables = paramInpVariables; + + // Map X = { + // "M_StaffID": M_StaffID, + // "M_CompanyID": M_CompanyID, + // "token": token+"1", + // }; + + print(paramInpVariables); + + final resp = await postGraphQlQuery(query, paramInpVariables); + // final resp = await postGraphQlQueryX(query, X); + + // print(inpVariables); + + print('obj queryRekapKehadiranHomeScreen : ${resp["queryRekapKehadiranHomeScreen"]}'); + + final result = RekapKehadiranHomeScreenModel( + kehadiran: resp['queryRekapKehadiranHomeScreen']['kehadiran'], + tidakHadir: resp['queryRekapKehadiranHomeScreen']['tidak_hadir'], + lembur: resp['queryRekapKehadiranHomeScreen']['lembur'], + message: resp['queryRekapKehadiranHomeScreen']['message'], + status: resp['queryRekapKehadiranHomeScreen']['status'], + ); + return result; + } } diff --git a/lib/screen/home/home_screen.dart b/lib/screen/home/home_screen.dart index 43008da..d1fb721 100644 --- a/lib/screen/home/home_screen.dart +++ b/lib/screen/home/home_screen.dart @@ -1,4 +1,5 @@ import 'package:absensi_sas/app/constant.dart'; +import 'package:absensi_sas/provider/current_rekap_kehadiran_home_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:geocoding/geocoding.dart'; @@ -19,6 +20,7 @@ import '../../widget/real_time.dart'; import '../../widget/sankbar_widget.dart'; import '../presensi/check_distance_provider.dart'; import '../presensi/check_presensi_jam_provider.dart'; +import 'rekap_kehadiran_home_screen_provider.dart'; class HomeScreen extends HookConsumerWidget { const HomeScreen({super.key}); @@ -30,6 +32,9 @@ class HomeScreen extends HookConsumerWidget { final varCurrentDistanceProvider = ref.watch(currentCheckDistanceProvider); final varCurrentCheckJamProvider = ref.watch(currentCheckJamPresensiProvider); + + final varCurrentRekapKehadiranProvider = + ref.watch(currentRekapKehadiranHomeProvider); final positionLatitude = useState(""); final positionLongitude = useState(""); // GoogleSignInAccount? currentUserGoogle = @@ -70,6 +75,16 @@ class HomeScreen extends HookConsumerWidget { selectedUser?.token ?? "", inpVariablesCheckPresensiJam, ); + + // panggil rekap kehadiran home screen + ref + .read(rekapKehadiranHomeScreenProvider.notifier) + .rekapKehadiranHomeScreen( + selectedUser?.model.staffId ?? "", + selectedUser?.model.companyId ?? "", + selectedUser?.token ?? "", + inpVariablesCheckPresensiJam, + ); } }); return () {}; @@ -180,6 +195,20 @@ class HomeScreen extends HookConsumerWidget { } }); + // rekap kehadiran home screen + ref.listen(rekapKehadiranHomeScreenProvider, (prev, next) { + if (next is RekapKehadiranHomeScreenStateLoading) { + isLoadingProsesCheckDistance.value = true; + } else if (next is RekapKehadiranHomeScreenStateError) { + isLoadingProsesCheckDistance.value = false; + print("Error : " + next.toString()); + SanckbarWidget( + context, "Error : " + next.toString(), snackbarType.warning); + } else if (next is RekapKehadiranHomeScreenStateDone) { + isLoadingProsesCheckDistance.value = false; + } + }); + return Padding( padding: EdgeInsets.only( top: Constant.getActualYPhone(context: context, y: 30), @@ -383,6 +412,16 @@ class HomeScreen extends HookConsumerWidget { selectedUser?.token ?? "", inpVariablesCheckPresensiJam, ); + + // panggil rekap kehadiran home screen + ref + .read(rekapKehadiranHomeScreenProvider.notifier) + .rekapKehadiranHomeScreen( + selectedUser?.model.staffId ?? "", + selectedUser?.model.companyId ?? "", + selectedUser?.token ?? "", + inpVariablesCheckPresensiJam, + ); } }, child: SingleChildScrollView( @@ -693,12 +732,12 @@ class HomeScreen extends HookConsumerWidget { //Menu Rekap Presensi Padding( padding: EdgeInsets.only( - right: - Constant.getActualXPhone(context: context, x: 27), - left: - Constant.getActualXPhone(context: context, x: 33), - bottom: Constant.getActualYPhone( - context: context, y: 40)), + right: + Constant.getActualXPhone(context: context, x: 27), + left: Constant.getActualXPhone(context: context, x: 33), + bottom: + Constant.getActualYPhone(context: context, y: 40), + ), child: Container( width: Constant.getActualXPhone(context: context, x: 330), @@ -750,7 +789,8 @@ class HomeScreen extends HookConsumerWidget { CrossAxisAlignment.start, children: [ Text( - '24 hari', + // '24 hari', + varCurrentRekapKehadiranProvider?.kehadiran ?? "", style: Constant.subtitle_600_14( context: context) .copyWith( @@ -802,7 +842,8 @@ class HomeScreen extends HookConsumerWidget { CrossAxisAlignment.start, children: [ Text( - '2 hari', + // '2 hari', + varCurrentRekapKehadiranProvider?.tidakHadir ?? "", style: Constant.subtitle_600_14( context: context) .copyWith( @@ -854,7 +895,8 @@ class HomeScreen extends HookConsumerWidget { CrossAxisAlignment.start, children: [ Text( - '5 hari', + // '5 hari', + varCurrentRekapKehadiranProvider?.lembur ?? "", style: Constant.subtitle_600_14( context: context) .copyWith( diff --git a/lib/screen/home/rekap_kehadiran_home_screen_provider.dart b/lib/screen/home/rekap_kehadiran_home_screen_provider.dart new file mode 100644 index 0000000..262617f --- /dev/null +++ b/lib/screen/home/rekap_kehadiran_home_screen_provider.dart @@ -0,0 +1,83 @@ + +import '../../model/rekap_kehadiran_home_screen_model.dart'; +import '../../provider/current_rekap_kehadiran_home_provider.dart'; +import '../../repository/presensi_repository.dart'; + +import 'package:equatable/equatable.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../provider/dio_provider.dart'; +import '../../provider/graphql_provider.dart'; +import '../../repository/base_repository.dart'; + +abstract class RekapKehadiranHomeScreenState extends Equatable { + final DateTime date; + const RekapKehadiranHomeScreenState(this.date); + @override + List get props => [date]; +} + +class RekapKehadiranHomeScreenStateInit extends RekapKehadiranHomeScreenState { + RekapKehadiranHomeScreenStateInit() : super(DateTime.now()); +} + +class RekapKehadiranHomeScreenStateLoading extends RekapKehadiranHomeScreenState { + RekapKehadiranHomeScreenStateLoading() : super(DateTime.now()); +} + +class RekapKehadiranHomeScreenStateError extends RekapKehadiranHomeScreenState { + final String message; + RekapKehadiranHomeScreenStateError({ + required this.message, + }) : super(DateTime.now()); +} + +class RekapKehadiranHomeScreenStateDone extends RekapKehadiranHomeScreenState { + final RekapKehadiranHomeScreenModel model; + RekapKehadiranHomeScreenStateDone({ + required this.model, + }) : super(DateTime.now()); +} + +//notifier +class RekapKehadiranHomeScreenNotifier extends StateNotifier { + final Ref ref; + RekapKehadiranHomeScreenNotifier({ + required this.ref, + }) : super(RekapKehadiranHomeScreenStateInit()); + + void rekapKehadiranHomeScreen( + String M_StaffID, + String M_CompanyID, + String token, + Map paramInpVariables, + ) async { + try { + state = RekapKehadiranHomeScreenStateLoading(); + final graphql = ref.read(graphqlProvider('')); + final dio = ref.read(dioProvider); + final resp = await PresensiRepository(graphql: graphql, dio: dio) + .rekapKehadiranHomeScreen( + M_StaffID, + M_CompanyID, + token, + paramInpVariables, + ); + // set ke global state provider currentRekapKehadiranHomeProvider + ref.read(currentRekapKehadiranHomeProvider.notifier).update((state) => resp); + state = RekapKehadiranHomeScreenStateDone(model: resp); + } catch (e) { + if (e is BaseRepositoryException) { + print(e.message); + state = RekapKehadiranHomeScreenStateError(message: e.message ?? ""); + } else { + state = RekapKehadiranHomeScreenStateError(message: e.toString()); + } + } + } +} + +// provider +final rekapKehadiranHomeScreenProvider = + StateNotifierProvider( + (ref) => RekapKehadiranHomeScreenNotifier(ref: ref), +); diff --git a/pubspec.yaml b/pubspec.yaml index 8bd71c9..0e3c512 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.1 +version: 1.0.2 environment: sdk: '>=3.0.6 <4.0.0'