Commit c71dbe0b authored by William Goszal's avatar William Goszal 🚴

tambah break_start dan break_end

parent c21740a1
...@@ -29,9 +29,7 @@ class Api { ...@@ -29,9 +29,7 @@ class Api {
// dynamic jsonObject = await httpRequest( // dynamic jsonObject = await httpRequest(
// typePost, apiUrl, "getNearestBranch", // typePost, apiUrl, "getNearestBranch",
// bodies: bodies); // bodies: bodies);
HttpResponseApi apiResult = await ConstantApi.httpRequest( HttpResponseApi apiResult = await ConstantApi.httpRequest(typePost, apiUrl, "getNearestBranch", bodies: bodies);
typePost, apiUrl, "getNearestBranch",
bodies: bodies);
if (apiResult.succes == false) { if (apiResult.succes == false) {
return apiResult.apiResponse!; return apiResult.apiResponse!;
} else { } else {
...@@ -47,12 +45,9 @@ class Api { ...@@ -47,12 +45,9 @@ class Api {
), ),
); );
} }
ConstantString.outletDistance = ConstantString.outletDistance = jsonObject['data']['max_distance'].toString();
jsonObject['data']['max_distance'].toString(); ConstantString.logoUrlHome = jsonObject['data']['logo_attendance_home'];
ConstantString.logoUrlHome = ConstantString.logoUrlCamera = jsonObject['data']['logo_attendance_camera'];
jsonObject['data']['logo_attendance_home'];
ConstantString.logoUrlCamera =
jsonObject['data']['logo_attendance_camera'];
return ApiResponse( return ApiResponse(
error: false, error: false,
msg: Strings.succesGetData, msg: Strings.succesGetData,
...@@ -169,8 +164,7 @@ class Api { ...@@ -169,8 +164,7 @@ class Api {
} }
} }
static Future<ApiResponse> shiftIn( static Future<ApiResponse> shiftIn(String branchId, String nik, String shiftId, String photoBase64,
String branchId, String nik, String shiftId, String photoBase64,
{int forceSubmit = 0}) async { {int forceSubmit = 0}) async {
String apiUrl = "$baseUrl${endPoint}clock_in"; String apiUrl = "$baseUrl${endPoint}clock_in";
// Position position = await Geolocator.getCurrentPosition(); // Position position = await Geolocator.getCurrentPosition();
...@@ -212,8 +206,7 @@ class Api { ...@@ -212,8 +206,7 @@ class Api {
if (jsonObject['status'] == "ok") { if (jsonObject['status'] == "ok") {
// simpan NIK user // simpan NIK user
List<String> listAbsentUser = getListAbsentUser(); List<String> listAbsentUser = getListAbsentUser();
int indexList = int indexList = listAbsentUser.indexWhere((element) => element == nik);
listAbsentUser.indexWhere((element) => element == nik);
if (indexList == -1) { if (indexList == -1) {
listAbsentUser.add(nik); listAbsentUser.add(nik);
setListAbsentUser(listAbsentUser); setListAbsentUser(listAbsentUser);
...@@ -243,9 +236,7 @@ class Api { ...@@ -243,9 +236,7 @@ class Api {
} }
} }
static Future<ApiResponse> shiftOut( static Future<ApiResponse> shiftOut(String branchId, String nik, String photoBase64, {int forceSubmit = 0}) async {
String branchId, String nik, String photoBase64,
{int forceSubmit = 0}) async {
String apiUrl = "$baseUrl${endPoint}clock_out"; String apiUrl = "$baseUrl${endPoint}clock_out";
// Position position = await Geolocator.getCurrentPosition(); // Position position = await Geolocator.getCurrentPosition();
...@@ -286,8 +277,72 @@ class Api { ...@@ -286,8 +277,72 @@ class Api {
if (jsonObject['status'] == "ok") { if (jsonObject['status'] == "ok") {
// simpan NIK user // simpan NIK user
List<String> listAbsentUser = getListAbsentUser(); List<String> listAbsentUser = getListAbsentUser();
int indexList = int indexList = listAbsentUser.indexWhere((element) => element == nik);
listAbsentUser.indexWhere((element) => element == nik); if (indexList == -1) {
listAbsentUser.add(nik);
setListAbsentUser(listAbsentUser);
}
return ApiResponse(
error: false,
msg: Strings.succesGetData,
data: AbsentSuccessModel.json(
jsonObject['data'],
),
);
} else {
return ApiResponse(
error: true,
msg: jsonObject['msg'],
code: jsonObject['code'],
);
}
}
} catch (e) {
return ApiResponse(error: true, msg: "Error: $e");
}
}
static Future<ApiResponse> submitBreak(bool isIn, String branchId, String nik, String photoBase64,
{int forceSubmit = 0}) async {
String action = isIn ? "break_start" : "break_end";
String apiUrl = "$baseUrl$endPoint$action";
IpAddress ipAddress = IpAddress(type: RequestType.json);
dynamic dataIp = await ipAddress.getIpAddress();
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
String userAgent = "";
if (kIsWeb) {
WebBrowserInfo browser = await deviceInfo.webBrowserInfo;
userAgent = browser.userAgent ?? "";
}
try {
Map<String, dynamic> data = {
"branch_id": branchId,
"brand_code": brandCode,
"nik": nik,
"user_lat": getLatitude(),
"user_long": getLongitude(),
"photo_base64": photoBase64,
"ip": dataIp['ip'],
"user_agent": userAgent,
"forced_submit": forceSubmit,
};
String bodies = jsonEncode(data);
HttpResponseApi apiResult = await ConstantApi.httpRequest(
typePost,
apiUrl,
"shiftIn",
bodies: bodies,
);
if (apiResult.succes == false) {
return ApiResponse(error: true, msg: Strings.cantConnectToServer);
} else {
Map<String, dynamic> jsonObject = apiResult.jsonObject!;
if (jsonObject['status'] == "ok") {
// simpan NIK user
List<String> listAbsentUser = getListAbsentUser();
int indexList = listAbsentUser.indexWhere((element) => element == nik);
if (indexList == -1) { if (indexList == -1) {
listAbsentUser.add(nik); listAbsentUser.add(nik);
setListAbsentUser(listAbsentUser); setListAbsentUser(listAbsentUser);
...@@ -369,5 +424,3 @@ int typePost = 2; ...@@ -369,5 +424,3 @@ int typePost = 2;
// this.code = "", // this.code = "",
// }); // });
// } // }
...@@ -4,6 +4,7 @@ import 'package:ravintola_attendance/models/profile.dart'; ...@@ -4,6 +4,7 @@ import 'package:ravintola_attendance/models/profile.dart';
import 'package:ravintola_attendance/models/shift.dart'; import 'package:ravintola_attendance/models/shift.dart';
class AbsentCameraArguments { class AbsentCameraArguments {
final int actionType; // 1 = Absent, 2 = Break
final bool isIn; final bool isIn;
final BranchModel branchModel; final BranchModel branchModel;
final ShiftModel? shiftModel; final ShiftModel? shiftModel;
...@@ -14,6 +15,7 @@ class AbsentCameraArguments { ...@@ -14,6 +15,7 @@ class AbsentCameraArguments {
final String shiftEndTime; final String shiftEndTime;
AbsentCameraArguments({ AbsentCameraArguments({
this.actionType = 1,
required this.isIn, required this.isIn,
required this.branchModel, required this.branchModel,
required this.nik, required this.nik,
...@@ -39,6 +41,7 @@ class AbsentSuccessArguments { ...@@ -39,6 +41,7 @@ class AbsentSuccessArguments {
final AbsentSuccessModel absentSuccess; final AbsentSuccessModel absentSuccess;
final ProfileModel profil; final ProfileModel profil;
final String nik; final String nik;
final int actionType;
final bool isIn; final bool isIn;
final String shiftStart; final String shiftStart;
final String shiftEnd; final String shiftEnd;
...@@ -48,6 +51,7 @@ class AbsentSuccessArguments { ...@@ -48,6 +51,7 @@ class AbsentSuccessArguments {
required this.absentSuccess, required this.absentSuccess,
required this.profil, required this.profil,
required this.nik, required this.nik,
required this.actionType,
required this.isIn, required this.isIn,
required this.shiftStart, required this.shiftStart,
required this.shiftEnd, required this.shiftEnd,
......
This diff is collapsed.
...@@ -11,11 +11,21 @@ import 'package:ravintola_attendance/resource/size.dart'; ...@@ -11,11 +11,21 @@ import 'package:ravintola_attendance/resource/size.dart';
import 'package:ravintola_attendance/resource/style.dart'; import 'package:ravintola_attendance/resource/style.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
String getAbsentText(bool isIn, int actionType) {
if (actionType == 1) {
return isIn ? "Absen Masuk" : "Absen Keluar";
} else if (actionType == 2) {
return isIn ? "Break Start" : "Break End";
}
return "Unknown";
}
class AbsentSuccessView extends StatelessWidget { class AbsentSuccessView extends StatelessWidget {
const AbsentSuccessView({ const AbsentSuccessView({
super.key, super.key,
required this.absentSuccess, required this.absentSuccess,
required this.isIn, required this.isIn,
required this.actionType,
required this.nik, required this.nik,
required this.profil, required this.profil,
required this.shiftStart, required this.shiftStart,
...@@ -26,6 +36,7 @@ class AbsentSuccessView extends StatelessWidget { ...@@ -26,6 +36,7 @@ class AbsentSuccessView extends StatelessWidget {
final AbsentSuccessModel absentSuccess; final AbsentSuccessModel absentSuccess;
final ProfileModel profil; final ProfileModel profil;
final String nik; final String nik;
final int actionType;
final bool isIn; final bool isIn;
final String shiftStart; final String shiftStart;
final String shiftEnd; final String shiftEnd;
...@@ -37,6 +48,7 @@ class AbsentSuccessView extends StatelessWidget { ...@@ -37,6 +48,7 @@ class AbsentSuccessView extends StatelessWidget {
backgroundColor: ColorManager.backgroundColor, backgroundColor: ColorManager.backgroundColor,
body: ScreenResponsive( body: ScreenResponsive(
widget: BodyWidget( widget: BodyWidget(
actionType: actionType,
isIn: isIn, isIn: isIn,
profil: profil, profil: profil,
nik: nik, nik: nik,
...@@ -54,6 +66,7 @@ class AbsentSuccessView extends StatelessWidget { ...@@ -54,6 +66,7 @@ class AbsentSuccessView extends StatelessWidget {
class BodyWidget extends StatelessWidget { class BodyWidget extends StatelessWidget {
const BodyWidget({ const BodyWidget({
super.key, super.key,
required this.actionType,
required this.isIn, required this.isIn,
required this.profil, required this.profil,
required this.nik, required this.nik,
...@@ -63,6 +76,7 @@ class BodyWidget extends StatelessWidget { ...@@ -63,6 +76,7 @@ class BodyWidget extends StatelessWidget {
required this.shiftName, required this.shiftName,
}); });
final int actionType;
final bool isIn; final bool isIn;
final ProfileModel profil; final ProfileModel profil;
final String nik; final String nik;
...@@ -134,11 +148,7 @@ class BodyWidget extends StatelessWidget { ...@@ -134,11 +148,7 @@ class BodyWidget extends StatelessWidget {
width: double.infinity, width: double.infinity,
child: Center( child: Center(
child: Text( child: Text(
(isIn) getAbsentText(isIn, actionType),
? '''Absen Masuk
Sukses'''
: '''Absen Keluar
Sukses''',
style: getSemiBoldStyle( style: getSemiBoldStyle(
color: Colors.black, color: Colors.black,
fontSize: FontSize.s24, fontSize: FontSize.s24,
......
This diff is collapsed.
...@@ -23,8 +23,7 @@ class RouteGenerator { ...@@ -23,8 +23,7 @@ class RouteGenerator {
static Route<dynamic> getRoute(RouteSettings routeSettings) { static Route<dynamic> getRoute(RouteSettings routeSettings) {
switch (routeSettings.name) { switch (routeSettings.name) {
case Routes.onBoarding: case Routes.onBoarding:
return pageRouteCustom(const OnBoardingView(), return pageRouteCustom(const OnBoardingView(), nameRoute: Routes.onBoarding);
nameRoute: Routes.onBoarding);
case Routes.home: case Routes.home:
HomeArguments args = routeSettings.arguments as HomeArguments; HomeArguments args = routeSettings.arguments as HomeArguments;
return pageRouteCustom( return pageRouteCustom(
...@@ -37,10 +36,11 @@ class RouteGenerator { ...@@ -37,10 +36,11 @@ class RouteGenerator {
); );
case Routes.absentCamera: case Routes.absentCamera:
AbsentCameraArguments args = AbsentCameraArguments args = routeSettings.arguments as AbsentCameraArguments;
routeSettings.arguments as AbsentCameraArguments; print("Generating route for AbsentCamera with isIn: ${args.isIn}, actionType: ${args.actionType}");
return pageRouteCustom( return pageRouteCustom(
AbsentCameraView( AbsentCameraView(
actionType: args.actionType,
isIn: args.isIn, isIn: args.isIn,
branchModel: args.branchModel, branchModel: args.branchModel,
shiftModel: args.shiftModel, shiftModel: args.shiftModel,
...@@ -54,13 +54,13 @@ class RouteGenerator { ...@@ -54,13 +54,13 @@ class RouteGenerator {
routeSettings: routeSettings, routeSettings: routeSettings,
); );
case Routes.absentSuccess: case Routes.absentSuccess:
AbsentSuccessArguments args = AbsentSuccessArguments args = routeSettings.arguments as AbsentSuccessArguments;
routeSettings.arguments as AbsentSuccessArguments;
return pageRouteCustom( return pageRouteCustom(
AbsentSuccessView( AbsentSuccessView(
absentSuccess: args.absentSuccess, absentSuccess: args.absentSuccess,
profil: args.profil, profil: args.profil,
nik: args.nik, nik: args.nik,
actionType: args.actionType,
isIn: args.isIn, isIn: args.isIn,
shiftEnd: args.shiftEnd, shiftEnd: args.shiftEnd,
shiftStart: args.shiftStart, shiftStart: args.shiftStart,
...@@ -70,8 +70,7 @@ class RouteGenerator { ...@@ -70,8 +70,7 @@ class RouteGenerator {
routeSettings: routeSettings, routeSettings: routeSettings,
); );
case Routes.errorWidget: case Routes.errorWidget:
ErrorWidgetArguments args = ErrorWidgetArguments args = routeSettings.arguments as ErrorWidgetArguments;
routeSettings.arguments as ErrorWidgetArguments;
return pageRouteCustom( return pageRouteCustom(
ErrorWidgetView( ErrorWidgetView(
messageError: args.errorMessage, messageError: args.errorMessage,
...@@ -104,10 +103,10 @@ class RouteGenerator { ...@@ -104,10 +103,10 @@ class RouteGenerator {
}) { }) {
// setTitle(title); // setTitle(title);
if (nameRoute == Routes.absentCamera) { if (nameRoute == Routes.absentCamera) {
AbsentCameraArguments args = AbsentCameraArguments args = routeSettings!.arguments as AbsentCameraArguments;
routeSettings!.arguments as AbsentCameraArguments;
return PageRouteBuilder( return PageRouteBuilder(
pageBuilder: (context, a, b) => AbsentCameraView( pageBuilder: (context, a, b) => AbsentCameraView(
actionType: args.actionType,
isIn: args.isIn, isIn: args.isIn,
branchModel: args.branchModel, branchModel: args.branchModel,
shiftModel: args.shiftModel, shiftModel: args.shiftModel,
...@@ -123,8 +122,7 @@ class RouteGenerator { ...@@ -123,8 +122,7 @@ class RouteGenerator {
// name: nameRoute.replaceFirst("/", ""), arguments: args), // name: nameRoute.replaceFirst("/", ""), arguments: args),
); );
} else if (nameRoute == Routes.errorWidget) { } else if (nameRoute == Routes.errorWidget) {
ErrorWidgetArguments args = ErrorWidgetArguments args = routeSettings!.arguments as ErrorWidgetArguments;
routeSettings!.arguments as ErrorWidgetArguments;
return PageRouteBuilder( return PageRouteBuilder(
pageBuilder: (context, a, b) => ErrorWidgetView( pageBuilder: (context, a, b) => ErrorWidgetView(
messageError: args.errorMessage, messageError: args.errorMessage,
...@@ -147,13 +145,13 @@ class RouteGenerator { ...@@ -147,13 +145,13 @@ class RouteGenerator {
// name: nameRoute.replaceFirst("/", ""), arguments: args), // name: nameRoute.replaceFirst("/", ""), arguments: args),
); );
} else if (nameRoute == Routes.absentSuccess) { } else if (nameRoute == Routes.absentSuccess) {
AbsentSuccessArguments args = AbsentSuccessArguments args = routeSettings!.arguments as AbsentSuccessArguments;
routeSettings!.arguments as AbsentSuccessArguments;
return PageRouteBuilder( return PageRouteBuilder(
pageBuilder: (context, a, b) => AbsentSuccessView( pageBuilder: (context, a, b) => AbsentSuccessView(
absentSuccess: args.absentSuccess, absentSuccess: args.absentSuccess,
profil: args.profil, profil: args.profil,
nik: args.nik, nik: args.nik,
actionType: args.actionType,
isIn: args.isIn, isIn: args.isIn,
shiftEnd: args.shiftEnd, shiftEnd: args.shiftEnd,
shiftStart: args.shiftStart, shiftStart: args.shiftStart,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment