Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sai Srinivas
GEN_ERP_2025
Commits
a5f65ab1
Commit
a5f65ab1
authored
Sep 03, 2025
by
Sai Srinivas
Committed by
Sai Srinivas
Sep 04, 2025
Browse files
03-09-2025 HRM accessible pages and attendance/ leave approval/rejection
parent
332a8e91
Changes
29
Show whitespace changes
Inline
Side-by-side
lib/Models/hrmmodels/ogresponse.dart
0 → 100644
View file @
a5f65ab1
class
ogresponse
{
String
?
id
;
String
?
name
;
String
?
title
;
String
?
profile
;
List
<
Children
>?
children
;
String
?
error
;
String
?
message
;
int
?
sessionExists
;
ogresponse
(
{
this
.
id
,
this
.
name
,
this
.
title
,
this
.
profile
,
this
.
children
,
this
.
error
,
this
.
message
,
this
.
sessionExists
});
ogresponse
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
id
=
json
[
'id'
];
name
=
json
[
'name'
];
title
=
json
[
'title'
];
profile
=
json
[
'profile'
];
if
(
json
[
'children'
]
!=
null
)
{
children
=
<
Children
>[];
json
[
'children'
].
forEach
((
v
)
{
children
!.
add
(
new
Children
.
fromJson
(
v
));
});
}
error
=
json
[
'error'
];
message
=
json
[
'message'
];
sessionExists
=
json
[
'session_exists'
];
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'id'
]
=
this
.
id
;
data
[
'name'
]
=
this
.
name
;
data
[
'title'
]
=
this
.
title
;
data
[
'profile'
]
=
this
.
profile
;
if
(
this
.
children
!=
null
)
{
data
[
'children'
]
=
this
.
children
!.
map
((
v
)
=>
v
.
toJson
()).
toList
();
}
data
[
'error'
]
=
this
.
error
;
data
[
'message'
]
=
this
.
message
;
data
[
'session_exists'
]
=
this
.
sessionExists
;
return
data
;
}
}
class
Children
{
String
?
id
;
String
?
name
;
String
?
title
;
String
?
profile
;
List
<
Children
>?
children
;
Children
({
this
.
id
,
this
.
name
,
this
.
title
,
this
.
profile
,
this
.
children
});
Children
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
{
id
=
json
[
'id'
];
name
=
json
[
'name'
];
title
=
json
[
'title'
];
profile
=
json
[
'profile'
];
if
(
json
[
'children'
]
!=
null
)
{
children
=
<
Children
>[];
json
[
'children'
].
forEach
((
v
)
{
children
!.
add
(
new
Children
.
fromJson
(
v
));
});
}
}
Map
<
String
,
dynamic
>
toJson
()
{
final
Map
<
String
,
dynamic
>
data
=
new
Map
<
String
,
dynamic
>();
data
[
'id'
]
=
this
.
id
;
data
[
'name'
]
=
this
.
name
;
data
[
'title'
]
=
this
.
title
;
data
[
'profile'
]
=
this
.
profile
;
if
(
this
.
children
!=
null
)
{
data
[
'children'
]
=
this
.
children
!.
map
((
v
)
=>
v
.
toJson
()).
toList
();
}
return
data
;
}
}
lib/Notifiers/LogoutNotifier.dart
View file @
a5f65ab1
...
...
@@ -9,7 +9,7 @@ import '../Utils/BackgroundLocationService.dart';
class
LogoutNotifier
extends
ChangeNotifier
{
bool
_logoutButtonClicked
=
tru
e
;
bool
_logoutButtonClicked
=
fals
e
;
bool
_isLoading
=
false
;
bool
get
isLoading
=>
_isLoading
;
...
...
lib/Notifiers/financeProvider/RequesitionLidtDetailsProvider.dart
View file @
a5f65ab1
...
...
@@ -16,7 +16,7 @@ import 'approveRejectPaymentRequestResponse.dart';
class
Requesitionlidtdetailsprovider
extends
ChangeNotifier
{
bool
_showMoreDetails
=
false
;
final
numberFormat
=
NumberFormat
.
decimalPattern
();
TextEditingController
requestedAmount
=
TextEditingController
();
TextEditingController
approvedAmountReadonly
=
TextEditingController
();
TextEditingController
proposedPaymentAccount
=
TextEditingController
();
...
...
@@ -35,6 +35,13 @@ class Requesitionlidtdetailsprovider extends ChangeNotifier {
TextEditingController
bankHolderName
=
TextEditingController
();
TextEditingController
paymentAccountSearchController
=
TextEditingController
();
TextEditingController
editPaymentRequestedAmountController
=
TextEditingController
();
TextEditingController
editPaymentRequestedEditableAmountController
=
TextEditingController
();
bool
_editPaymentProcessLoading
=
false
;
String
?
editableAmountError
;
String
?
proposedAmountError
;
PaymentDetails
_paymentDetails
=
PaymentDetails
();
RequestDetails
_requestDetails
=
RequestDetails
();
...
...
@@ -61,12 +68,19 @@ String? proposedAmountError;
bool
get
showMoreDetails
=>
_showMoreDetails
;
bool
get
editPaymentProcessLoading
=>
_editPaymentProcessLoading
;
int
get
imagePicked
=>
_image_picked
;
File
?
get
imagePath
=>
_imageName
;
File
?
get
imageFilePath
=>
_image
;
set
editPaymentProcessLoading
(
bool
value
){
_editPaymentProcessLoading
=
value
;
notifyListeners
();
}
set
imagePicked
(
int
value
)
{
_image_picked
=
value
;
notifyListeners
();
...
...
@@ -329,6 +343,9 @@ String? proposedAmountError;
}
catch
(
e
,
s
)
{}
}
String
?
remarksError
;
String
?
ApprovedAmountError
;
String
?
selectpaymentAccountError
;
...
...
@@ -407,6 +424,95 @@ String? proposedAmountError;
}
catch
(
e
,
s
)
{}
}
editPrevalues
(){
editPaymentRequestedAmountController
.
text
=
_requestDetails
.
requestedAmount
??
"-"
;
editPaymentRequestedEditableAmountController
.
text
=
_requestDetails
.
requestedAmount
??
"-"
;
notifyListeners
();
}
onChangeEditableAmount
(
value
,
context
){
var
provider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
if
(
provider
.
empId
==
"5"
||
provider
.
empId
==
"130"
||
provider
.
empId
==
"131"
||
provider
.
empId
==
"6"
){
editableAmountError
=
""
;
}
else
{
if
(
numberFormat
.
parse
(
editPaymentRequestedAmountController
.
text
)
<
numberFormat
.
parse
(
editPaymentRequestedEditableAmountController
.
text
))
{
editableAmountError
=
"Approved Amount should not be greater than amount"
;
}
else
{
editableAmountError
=
null
;
}
}
_editPaymentProcessLoading
=
false
;
notifyListeners
();
}
bool
validateEditprocessPayment
(
context
){
bool
isValid
=
true
;
editableAmountError
=
null
;
var
provider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
if
(
editPaymentRequestedEditableAmountController
.
text
.
isNotEmpty
){
if
(
provider
.
empId
==
"5"
||
provider
.
empId
==
"130"
||
provider
.
empId
==
"131"
||
provider
.
empId
==
"6"
){
editableAmountError
=
null
;
}
else
{
if
(
numberFormat
.
parse
(
editPaymentRequestedAmountController
.
text
)
<
numberFormat
.
parse
(
editPaymentRequestedEditableAmountController
.
text
))
{
editableAmountError
=
"Approved Amount should not be greater than amount"
;
isValid
=
false
;
}
else
{
editableAmountError
=
null
;
}
}
}
_editPaymentProcessLoading
=
false
;
notifyListeners
();
return
isValid
;
}
Future
<
void
>
editProcessedPaymentAmountAPIFunction
(
context
,
payment_request_id
,
approval_amount
)
async
{
try
{
_editPaymentProcessLoading
=
true
;
notifyListeners
();
if
(!
validateEditprocessPayment
(
context
)){
return
;
}
var
provider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
final
data
=
await
ApiCalling
.
editProcessedRequestAmountAPI
(
provider
.
empId
,
provider
.
session
,
payment_request_id
,
approval_amount
);
if
(
data
!=
null
)
{
if
(
data
.
error
==
"0"
)
{
_editPaymentProcessLoading
=
false
;
paymentRequesitionDetails
(
context
,
payment_request_id
);
resetAll
();
toast
(
context
,
data
.
message
);
Navigator
.
pop
(
context
,
true
);
notifyListeners
();
}
else
{
_editPaymentProcessLoading
=
false
;
notifyListeners
();
}
}
else
{
_editPaymentProcessLoading
=
false
;
notifyListeners
();
}
}
catch
(
e
,
s
)
{
_editPaymentProcessLoading
=
false
;
notifyListeners
();
}
}
bool
validateApproval
(
approved_amount
,
approve_remarks
,
proposed_payment_account_id
,){
...
...
@@ -476,6 +582,10 @@ String? proposedAmountError;
resetAll
()
{
checkDropDownReset
();
editPaymentRequestedAmountController
.
clear
();
editPaymentRequestedEditableAmountController
.
clear
();
_editPaymentProcessLoading
=
false
;
editableAmountError
=
null
;
requestedAmount
.
clear
();
proposedPaymentAccount
.
clear
();
approvedAmountReadonly
.
clear
();
...
...
lib/Notifiers/financeProvider/RequestionListProvider.dart
View file @
a5f65ab1
...
...
@@ -576,14 +576,12 @@ class Requestionlistprovider extends ChangeNotifier {
payment_date
,
)
async
{
try
{
_submitClicked
=
true
;
notifyListeners
();
if
(!
validateDirectForm
(
context
))
{
print
(
"came here"
);
_submitClicked
=
false
;
return
;
}
_submitClicked
=
true
;
notifyListeners
();
var
homeProvider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
,
...
...
@@ -1132,14 +1130,16 @@ class Requestionlistprovider extends ChangeNotifier {
isValid
=
false
;
_submitClicked
=
false
;
}
if
([
"Cheque"
,
"RTGS"
,
"IMPS"
,
"NEFT"
].
contains
(
_paymentModeValue
))
{
if
(
bankNameController
.
text
.
trim
().
isEmpty
)
{
bankNameError
=
"Please enter bank name"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
([
"Cheque"
,
"RTGS"
,
"IMPS"
,
"NEFT"
].
contains
(
_paymentModeValue
))
{
if
(
bankBranchController
.
text
.
trim
().
isEmpty
)
{
bankBranchError
=
"Please enter bank branch"
;
isValid
=
false
;
...
...
@@ -1271,6 +1271,7 @@ class Requestionlistprovider extends ChangeNotifier {
// FileError = "Please attach a file";
// isValid = false;
// }
_submitClicked
=
false
;
notifyListeners
();
return
isValid
;
}
...
...
lib/Notifiers/financeProvider/paymentReceiptsProvider.dart
View file @
a5f65ab1
...
...
@@ -479,11 +479,12 @@ class Paymentreceiptsprovider extends ChangeNotifier {
receipt_date
,
)
async
{
try
{
_submitClicked
=
true
;
notifyListeners
();
if
(!
validatereceiptForm
(
context
))
{
return
;
}
_submitClicked
=
true
;
notifyListeners
();
var
homeProvider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
...
...
@@ -515,15 +516,15 @@ class Paymentreceiptsprovider extends ChangeNotifier {
notifyListeners
();
Navigator
.
of
(
context
).
pop
(
context
);
}
else
{
_submitClicked
=
tru
e
;
_submitClicked
=
fals
e
;
notifyListeners
();
}
}
else
{
_submitClicked
=
tru
e
;
_submitClicked
=
fals
e
;
notifyListeners
();
}
}
catch
(
e
,
s
)
{
_submitClicked
=
tru
e
;
_submitClicked
=
fals
e
;
notifyListeners
();
}
}
...
...
@@ -816,57 +817,47 @@ class Paymentreceiptsprovider extends ChangeNotifier {
bool
isValid
=
true
;
if
(
_selectedreceiptAccounts
==
null
||
_receiptAccountID
.
trim
().
isEmpty
)
{
selectAccountError
=
"Please select an Account"
;
_submitClicked
=
false
;
isValid
=
false
;
}
if
(
_selectreceiptPaymentAccounts
==
null
||
_receiptPaymentAccountsID
.
isEmpty
)
{
selectPaymentAccountError
=
"Please select an Account"
;
_submitClicked
=
false
;
isValid
=
false
;
}
if
(
amountController
.
text
.
trim
().
isEmpty
)
{
amountError
=
"Please enter an amount"
;
_submitClicked
=
false
;
isValid
=
false
;
}
if
(
dateController
.
text
.
trim
().
isEmpty
||
_formattedDate
!.
isEmpty
)
{
dateError
=
"Please select Date"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
(
_selectreceiptPaymentModes
==
null
||
_receiptPaymentModesID
.
isEmpty
)
{
selectPaymentError
=
"Please select a payment mode"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
([
"Cheque"
,
"RTGS"
,
"IMPS"
,
"NEFT"
].
contains
(
_paymentModeValue
))
{
if
(
bankNameController
.
text
.
trim
().
isEmpty
)
{
bankNameError
=
"Please enter bank name"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
(
bankBranchController
.
text
.
trim
().
isEmpty
)
{
bankBranchError
=
"Please enter bank branch"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
(
bankAccNumberController
.
text
.
trim
().
isEmpty
)
{
bankNumberError
=
"Please enter account number"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
(
bankIfscController
.
text
.
trim
().
isEmpty
)
{
bankIFSCError
=
"Please enter IFSC code"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
(
bankAcHolderController
.
text
.
trim
().
isEmpty
)
{
bankHolderError
=
"Please enter account holder name"
;
isValid
=
false
;
_submitClicked
=
false
;
}
}
...
...
@@ -874,18 +865,15 @@ class Paymentreceiptsprovider extends ChangeNotifier {
if
(
bankUpiController
.
text
.
trim
().
isEmpty
)
{
UPIError
=
"Please enter UPI ID"
;
isValid
=
false
;
_submitClicked
=
false
;
}
}
if
(
paymentReferenceController
.
text
.
trim
().
isEmpty
)
{
paymentreferenceError
=
"please enter refernce number"
;
isValid
=
false
;
_submitClicked
=
false
;
}
if
(
descController
.
text
.
trim
().
isEmpty
)
{
descriptionError
=
"Please Enter Description"
;
isValid
=
false
;
_submitClicked
=
false
;
}
_submitClicked
=
false
;
notifyListeners
();
...
...
lib/Notifiers/hrmProvider/LeaveApplicationDetailsProvider.dart
View file @
a5f65ab1
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:provider/provider.dart'
;
import
'../../Models/hrmModels/leaveApplicationDetailsResponse.dart'
;
import
'../../Models/ordersModels/commonResponse.dart'
;
import
'../../services/api_calling.dart'
;
import
'../HomeScreenNotifier.dart'
;
...
...
@@ -9,6 +11,11 @@ class LeaveApplicationDetailsProvider extends ChangeNotifier {
leaveApplicationDetailsResponse
?
_response
;
bool
_isLoading
=
false
;
String
?
_errorMessage
;
bool
_isSubmitting
=
false
;
bool
get
isSubmitting
=>
_isSubmitting
;
CommonResponse
?
_StatusResponse
;
CommonResponse
?
get
addResponse
=>
_StatusResponse
;
leaveApplicationDetailsResponse
?
get
response
=>
_response
;
bool
get
isLoading
=>
_isLoading
;
...
...
@@ -43,6 +50,60 @@ class LeaveApplicationDetailsProvider extends ChangeNotifier {
notifyListeners
();
}
Future
<
void
>
leaveRequestRejectApprove
(
BuildContext
context
,
{
required
String
mode
,
required
String
type
,
required
String
remarks
,
required
String
id
,
})
async
{
_isSubmitting
=
true
;
_errorMessage
=
null
;
_StatusResponse
=
null
;
notifyListeners
();
try
{
final
homeProvider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
final
result
=
await
ApiCalling
.
leaveRequestRejectApproveAPI
(
homeProvider
.
session
,
homeProvider
.
empId
,
mode
,
type
,
remarks
,
id
,
);
if
(
result
!=
null
)
{
_StatusResponse
=
result
;
if
(
result
.
error
!=
null
&&
result
.
error
!.
isNotEmpty
)
{
_errorMessage
=
result
.
error
;
}
else
{
// Show success snack bar
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
"Leave request
${type.toLowerCase()}
successfully."
,
),
backgroundColor:
Colors
.
green
,
behavior:
SnackBarBehavior
.
floating
,
),
);
}
}
else
{
_errorMessage
=
"Failed to
$type
leave request!"
;
}
}
catch
(
e
)
{
_errorMessage
=
"Error while processing leave request:
$e
"
;
}
_isSubmitting
=
false
;
notifyListeners
();
}
/// Clear the current response data
void
clearData
()
{
_response
=
null
;
...
...
lib/Notifiers/hrmProvider/attendanceDetailsProvider.dart
View file @
a5f65ab1
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/material.dart'
;
import
'package:generp/Models/hrmModels/attendanceRequestDetailsResponse.dart'
;
import
'package:provider/provider.dart'
;
import
'../../Models/hrmModels/attendanceRequestListResponse.dart'
;
import
'../../Models/ordersModels/commonResponse.dart'
;
import
'../../services/api_calling.dart'
;
import
'../HomeScreenNotifier.dart'
;
...
...
@@ -12,6 +14,11 @@ class AttendanceDetailsProvider extends ChangeNotifier {
attendanceRequestDetailsResponse
?
_response
;
bool
_isLoading
=
false
;
String
?
_errorMessage
;
bool
_isSubmitting
=
false
;
bool
get
isSubmitting
=>
_isSubmitting
;
CommonResponse
?
_RejectResponse
;
CommonResponse
?
get
addResponse
=>
_RejectResponse
;
attendanceRequestDetailsResponse
?
get
response
=>
_response
;
bool
get
isLoading
=>
_isLoading
;
...
...
@@ -39,4 +46,50 @@ class AttendanceDetailsProvider extends ChangeNotifier {
_isLoading
=
false
;
notifyListeners
();
}
Future
<
void
>
rejectAttendanceRequest
(
BuildContext
context
,
{
required
String
mode
,
required
String
type
,
required
String
remarks
,
required
String
id
,
})
async
{
_isSubmitting
=
true
;
_errorMessage
=
null
;
_RejectResponse
=
null
;
notifyListeners
();
try
{
final
homeProvider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
final
result
=
await
ApiCalling
.
attendanceRequestRejectAPI
(
homeProvider
.
session
,
homeProvider
.
empId
,
mode
,
type
,
remarks
,
id
,
);
if
(
result
!=
null
)
{
_RejectResponse
=
result
;
if
(
result
.
error
!=
null
&&
result
.
error
!.
isNotEmpty
)
{
_errorMessage
=
result
.
error
;
}
else
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
const
SnackBar
(
content:
Text
(
"Attendance request rejected successfully."
),
),
);
}
}
else
{
_errorMessage
=
"Failed to reject attendance request!"
;
}
}
catch
(
e
)
{
_errorMessage
=
"Error rejecting attendance request:
$e
"
;
}
_isSubmitting
=
false
;
notifyListeners
();
}
}
lib/Notifiers/hrmProvider/attendanceListProvider.dart
View file @
a5f65ab1
...
...
@@ -126,7 +126,7 @@ class Attendancelistprovider extends ChangeNotifier {
/// Fetch attendance request list with filters
Future
<
void
>
fetchAttendanceRequests
(
BuildContext
context
,
Future
<
void
>
fetchAttendanceRequests
(
BuildContext
context
,
mode
,
{
String
?
type
,
String
?
dateRange
,
DateTimeRange
?
customRange
})
async
{
_isLoading
=
true
;
_errorMessage
=
null
;
...
...
@@ -152,6 +152,7 @@ class Attendancelistprovider extends ChangeNotifier {
apiType
,
dateParams
[
'from'
]!,
dateParams
[
'to'
]!,
mode
);
debugPrint
(
'Fetching attendance from:
${dateParams['from']}
to:
${dateParams['to']}
'
);
...
...
@@ -232,6 +233,7 @@ class Attendancelistprovider extends ChangeNotifier {
/// Apply filters coming from bottom sheet
void
updateFiltersFromSheet
(
mode
,
BuildContext
context
,
{
required
String
type
,
required
String
selectedValue
,
...
...
@@ -243,6 +245,7 @@ class Attendancelistprovider extends ChangeNotifier {
fetchAttendanceRequests
(
context
,
mode
,
type:
_selectedType
,
dateRange:
_selectedDateRange
,
customRange:
_customDateRange
,
...
...
@@ -250,13 +253,13 @@ class Attendancelistprovider extends ChangeNotifier {
}
/// Set type filter and refresh data
void
setTypeFilter
(
BuildContext
context
,
String
type
)
{
void
setTypeFilter
(
BuildContext
context
,
String
type
,
mode
)
{
_selectedType
=
type
;
fetchAttendanceRequests
(
context
);
fetchAttendanceRequests
(
context
,
mode
);
}
/// Set date range filter and refresh data
void
setDateRangeFilter
(
BuildContext
context
,
String
dateRange
,
void
setDateRangeFilter
(
BuildContext
context
,
String
dateRange
,
mode
,
{
DateTimeRange
?
customRange
})
{
_selectedDateRange
=
dateRange
;
if
(
customRange
!=
null
)
{
...
...
@@ -264,24 +267,24 @@ class Attendancelistprovider extends ChangeNotifier {
fromDateController
.
text
=
_formatDate
(
customRange
.
start
);
toDateController
.
text
=
_formatDate
(
customRange
.
end
);
}
fetchAttendanceRequests
(
context
);
fetchAttendanceRequests
(
context
,
mode
);
}
/// Clear all filters and refresh data
void
clearFilters
(
BuildContext
context
)
{
void
clearFilters
(
BuildContext
context
,
mode
)
{
_selectedType
=
"All"
;
_selectedDateRange
=
"This Month"
;
_customDateRange
=
null
;
fromDateController
.
clear
();
toDateController
.
clear
();
fetchAttendanceRequests
(
context
);
fetchAttendanceRequests
(
context
,
mode
);
}
/// Reset form and data
void
resetForm
(
BuildContext
context
)
{
void
resetForm
(
BuildContext
context
,
mode
)
{
_response
=
null
;
_errorMessage
=
null
;
clearFilters
(
context
);
clearFilters
(
context
,
mode
);
notifyListeners
();
}
...
...
@@ -343,9 +346,10 @@ class Attendancelistprovider extends ChangeNotifier {
}
/// Apply filters and refresh data
void
applyFilters
(
BuildContext
context
)
{
void
applyFilters
(
BuildContext
context
,
mode
)
{
fetchAttendanceRequests
(
context
,
mode
,
type:
_selectedType
,
dateRange:
_selectedDateRange
,
customRange:
_customDateRange
,
...
...
lib/Notifiers/hrmProvider/hrmAccessiblePagesProvider.dart
0 → 100644
View file @
a5f65ab1
import
'package:flutter/foundation.dart'
;
import
'package:flutter/material.dart'
;
import
'package:provider/provider.dart'
;
import
'../../Models/hrmModels/hrmAccessiblePagesResponse.dart'
;
import
'../../services/api_calling.dart'
;
import
'../HomeScreenNotifier.dart'
;
class
HrmAccessiblePagesProvider
extends
ChangeNotifier
{
hrmAccessiblePagesResponse
?
_response
;
bool
_isLoading
=
false
;
String
?
_errorMessage
;
hrmAccessiblePagesResponse
?
get
response
=>
_response
;
bool
get
isLoading
=>
_isLoading
;
String
?
get
errorMessage
=>
_errorMessage
;
/// Fetch HRM Accessible Pages
Future
<
void
>
fetchAccessiblePages
(
BuildContext
context
)
async
{
_isLoading
=
true
;
_errorMessage
=
null
;
_response
=
null
;
notifyListeners
();
try
{
final
provider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
);
final
result
=
await
ApiCalling
.
hrmAccessiblePagesAPI
(
provider
.
empId
,
provider
.
session
,
);
if
(
result
!=
null
)
{
_response
=
result
;
if
(
_response
?.
pagesAccessible
==
null
||
_response
!.
pagesAccessible
!.
isEmpty
)
{
_errorMessage
=
"No accessible pages found!"
;
}
}
else
{
_errorMessage
=
"No data found!"
;
}
}
catch
(
e
)
{
_errorMessage
=
"Something went wrong:
$e
"
;
debugPrint
(
"Error fetching HRM accessible pages:
$e
"
);
}
_isLoading
=
false
;
notifyListeners
();
}
/// Clear stored data
void
clearData
()
{
_response
=
null
;
_errorMessage
=
null
;
notifyListeners
();
}
}
lib/Notifiers/hrmProvider/leaveApplicationListProvider.dart
View file @
a5f65ab1
...
...
@@ -63,7 +63,7 @@ class LeaveApplicationListProvider extends ChangeNotifier {
DateTime
?
get
selectedDate
=>
_selectedDate
;
/// Fetch leave application list with filters
Future
<
void
>
fetchLeaveApplications
(
BuildContext
context
,
Future
<
void
>
fetchLeaveApplications
(
BuildContext
context
,
mode
,
{
String
?
status
,
String
?
dateRange
,
DateTimeRange
?
customRange
})
async
{
_isLoading
=
true
;
_errorMessage
=
null
;
...
...
@@ -83,6 +83,7 @@ class LeaveApplicationListProvider extends ChangeNotifier {
provider
.
empId
,
dateParams
[
'from'
]!,
dateParams
[
'to'
]!,
mode
);
debugPrint
(
...
...
@@ -315,9 +316,10 @@ class LeaveApplicationListProvider extends ChangeNotifier {
}
/// Apply filters
void
applyFilters
(
BuildContext
context
)
{
void
applyFilters
(
BuildContext
context
,
mode
)
{
fetchLeaveApplications
(
context
,
mode
,
status:
_selectedStatus
,
dateRange:
_selectedDateRange
,
customRange:
_customDateRange
,
...
...
lib/Notifiers/hrmprovider/orgprovider.dart
0 → 100644
View file @
a5f65ab1
import
'package:flutter/foundation.dart'
;
import
'package:provider/provider.dart'
;
import
'../../Models/hrmmodels/ogresponse.dart'
;
import
'../../services/api_calling.dart'
;
import
'../HomeScreenNotifier.dart'
;
class
Orgprovider
extends
ChangeNotifier
{
List
<
Children
>
_employees
=[];
String
?
_rootName
;
String
?
_rootId
;
String
?
_rootTitle
;
String
?
_rootProfile
;
List
<
Children
>
get
employees
=>
_employees
;
String
?
get
rootName
=>
_rootName
;
String
?
get
rootID
=>
_rootId
;
String
?
get
rootTitle
=>
_rootTitle
;
String
?
get
rootProfile
=>
_rootProfile
;
Future
<
void
>
ogChart
(
context
)
async
{
try
{
var
homeProvider
=
Provider
.
of
<
HomescreenNotifier
>(
context
,
listen:
false
,
);
final
data
=
await
ApiCalling
.
ogChartAPI
(
homeProvider
.
empId
,
homeProvider
.
session
);
if
(
data
!=
null
){
if
(
data
.
error
==
"0"
){
_rootName
=
data
.
name
!;
_rootId
=
data
.
id
!;
_rootProfile
=
data
.
profile
!;
_rootTitle
=
data
.
title
!;
_employees
=
data
.
children
!;
notifyListeners
();
}
}
}
catch
(
e
,
s
){
}
}
}
\ No newline at end of file
lib/Utils/commonWidgets.dart
View file @
a5f65ab1
...
...
@@ -141,7 +141,10 @@ PreferredSizeWidget appbar2New(BuildContext context, title, reset, widget,int co
InkResponse
(
onTap:
()
{
HapticFeedback
.
selectionClick
();
if
(
reset
!=
null
){
reset
();
}
Navigator
.
pop
(
context
,
true
);
},
child:
SvgPicture
.
asset
(
"assets/svg/appbar_back_button.svg"
,
height:
25
),
...
...
@@ -152,7 +155,10 @@ PreferredSizeWidget appbar2New(BuildContext context, title, reset, widget,int co
child:
InkResponse
(
onTap:
()
{
HapticFeedback
.
selectionClick
();
if
(
reset
!=
null
){
reset
();
}
Navigator
.
pop
(
context
,
true
);
},
child:
Text
(
...
...
lib/main.dart
View file @
a5f65ab1
...
...
@@ -227,12 +227,14 @@ class MyApp extends StatelessWidget {
ChangeNotifierProvider
(
create:
(
_
)
=>
followUpUpdateProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
Appointmentcalendarprovider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
Addnewleadsandprospectsprovider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
HrmAccessiblePagesProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
Attendancelistprovider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
AttendanceDetailsProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
TourExpensesProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
TourExpensesDetailsProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
RewardListProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
LeaveApplicationListProvider
()),
ChangeNotifierProvider
(
create:
(
_
)
=>
Orgprovider
()),
],
child:
Builder
(
builder:
(
BuildContext
context
)
{
...
...
lib/screens/finance/PaymentRequestionListDetails.dart
View file @
a5f65ab1
...
...
@@ -335,7 +335,6 @@ class _PaymentrequestionlistdetailsState
Expanded
(
child:
InkResponse
(
onTap:
()
{
if
(
provider
.
Headings
[
j
]
==
"Attachment"
)
{
HapticFeedback
.
selectionClick
();
Navigator
.
push
(
...
...
@@ -1126,7 +1125,7 @@ class _PaymentrequestionlistdetailsState
SvgPicture
.
asset
(
"assets/svg/finance/level_reject_ic.svg"
,
),
SizedBox
(
width:
5
,
),
SizedBox
(
width:
5
),
Center
(
child:
Text
(
"Reject"
,
...
...
@@ -1141,7 +1140,7 @@ class _PaymentrequestionlistdetailsState
),
),
),
SizedBox
(
width:
10
),
SizedBox
(
width:
6
),
if
([
"apr_lvl1"
,
...
...
@@ -1151,7 +1150,7 @@ class _PaymentrequestionlistdetailsState
SvgPicture
.
asset
(
"assets/svg/crm/vertical_line_ic.svg"
,
),
SizedBox
(
width:
10
),
SizedBox
(
width:
6
),
Expanded
(
child:
InkResponse
(
onTap:
()
{
...
...
@@ -1181,7 +1180,7 @@ class _PaymentrequestionlistdetailsState
SvgPicture
.
asset
(
"assets/svg/finance/level_approve_ic.svg"
,
),
SizedBox
(
width:
5
,
),
SizedBox
(
width:
5
),
Center
(
child:
Text
(
"Approve"
,
...
...
@@ -1196,12 +1195,12 @@ class _PaymentrequestionlistdetailsState
),
),
),
SizedBox
(
width:
10
),
SizedBox
(
width:
6
),
]
else
if
(
widget
.
mode
==
"process"
)
...[
SvgPicture
.
asset
(
"assets/svg/crm/vertical_line_ic.svg"
,
),
SizedBox
(
width:
10
),
SizedBox
(
width:
6
),
Expanded
(
child:
InkResponse
(
onTap:
()
{
...
...
@@ -1229,14 +1228,59 @@ class _PaymentrequestionlistdetailsState
child:
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
SvgPicture
.
asset
(
"assets/svg/finance/level_add_payment_ic.svg"
),
SizedBox
(
width:
5
,),
SvgPicture
.
asset
(
"assets/svg/finance/level_add_payment_ic.svg"
,
),
SizedBox
(
width:
5
),
Center
(
child:
Text
(
"Add Payment"
,
style:
TextStyle
(
color:
AppColors
.
semi_black
,
fontSize:
14
fontSize:
14
,
),
),
),
],
),
),
),
),
SizedBox
(
width:
6
),
SvgPicture
.
asset
(
"assets/svg/crm/vertical_line_ic.svg"
,
),
SizedBox
(
width:
6
),
Expanded
(
child:
InkResponse
(
onTap:
()
{
// provider
// .approveRejectPaymentRequestAPIFunction(
// context,
// provider.requestsDetails.id,
// );
provider
.
editPrevalues
();
_showEditPaymentSheet
(
context
,
provider
.
requestsDetails
.
id
,
);
},
child:
Container
(
alignment:
Alignment
.
center
,
child:
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
SvgPicture
.
asset
(
"assets/svg/crm/lead_details_edit_ic.svg"
,
),
SizedBox
(
width:
5
),
Center
(
child:
Text
(
"Edit Amount"
,
style:
TextStyle
(
color:
AppColors
.
semi_black
,
fontSize:
14
,
),
),
),
...
...
@@ -2111,7 +2155,14 @@ class _PaymentrequestionlistdetailsState
return
Center
(
child:
CircularProgressIndicator
());
}
return
Container
(
return
Padding
(
padding:
EdgeInsets
.
only
(
bottom:
MediaQuery
.
of
(
context
,
).
viewInsets
.
bottom
,
),
child:
Container
(
// Constrain the height to avoid overflow
constraints:
BoxConstraints
(
maxHeight:
MediaQuery
.
of
(
context
).
size
.
height
*
0.8
,
...
...
@@ -2566,6 +2617,129 @@ class _PaymentrequestionlistdetailsState
),
],
),
),
);
},
),
);
},
);
},
);
}
Future
<
void
>
_showEditPaymentSheet
(
BuildContext
context
,
paymentID
)
{
return
showModalBottomSheet
(
useSafeArea:
true
,
isDismissible:
true
,
isScrollControlled:
true
,
showDragHandle:
true
,
backgroundColor:
Colors
.
white
,
enableDrag:
true
,
context:
context
,
builder:
(
context
)
{
return
StatefulBuilder
(
builder:
(
context
,
setState
)
{
return
SafeArea
(
child:
Consumer
<
Requesitionlidtdetailsprovider
>(
builder:
(
context
,
provider
,
child
)
{
return
Padding
(
padding:
EdgeInsets
.
only
(
bottom:
MediaQuery
.
of
(
context
,
).
viewInsets
.
bottom
,
),
child:
Container
(
constraints:
BoxConstraints
(
maxHeight:
MediaQuery
.
of
(
context
).
size
.
height
*
0.3
,
),
margin:
EdgeInsets
.
only
(
bottom:
15
,
left:
15
,
right:
15
,
top:
10
,
),
child:
Column
(
children:
[
Align
(
alignment:
Alignment
.
topLeft
,
child:
Text
(
"Edit Processed Amount"
,
style:
TextStyle
(
color:
AppColors
.
app_blue
,
fontSize:
16
,
),
),
),
textControllerReadonlyWidget
(
context
,
provider
.
editPaymentRequestedAmountController
,
"Requested Amount"
,
(
p0
)
{},
),
textControllerWidget
(
context
,
provider
.
editPaymentRequestedEditableAmountController
,
"Approved Amount"
,
"Enter Approved Amount"
,
(
p0
)
{
provider
.
onChangeEditableAmount
(
p0
,
context
);
},
TextInputType
.
numberWithOptions
(),
false
,
null
,
),
errorWidget
(
context
,
provider
.
editableAmountError
),
Padding
(
padding:
EdgeInsets
.
only
(
left:
5.0
,
right:
5.0
,
top:
5.0
,
bottom:
5.0
,
),
child:
InkWell
(
onTap:
provider
.
editPaymentProcessLoading
?
null
:
()
{
provider
.
editPaymentProcessLoading
=
true
;
provider
.
editProcessedPaymentAmountAPIFunction
(
context
,
paymentID
,
provider
.
editPaymentRequestedEditableAmountController
.
text
,
);
},
child:
Container
(
height:
45
,
decoration:
BoxDecoration
(
color:
AppColors
.
app_blue
,
borderRadius:
BorderRadius
.
circular
(
14.0
),
),
child:
Center
(
child:
provider
.
editPaymentProcessLoading
?
CircularProgressIndicator
.
adaptive
(
valueColor:
AlwaysStoppedAnimation
(
AppColors
.
white
,
),
)
:
Text
(
"Submit"
,
textAlign:
TextAlign
.
center
,
style:
TextStyle
(
color:
Colors
.
white
),
),
),
),
),
),
],
),
),
);
},
),
...
...
lib/screens/finance/addPaymentReceiptList.dart
View file @
a5f65ab1
...
...
@@ -43,6 +43,7 @@ class _AddpaymentreceiptlistState extends State<Addpaymentreceiptlist> {
listen:
false
,
);
provider
.
addReceiptPaymentRequestionViewAPI
(
context
);
provider
.
submitClicked
=
false
;
});
}
...
...
@@ -628,6 +629,7 @@ class _AddpaymentreceiptlistState extends State<Addpaymentreceiptlist> {
?
null
:
()
{
provider
.
submitClicked
=
true
;
provider
.
notifyListeners
();
provider
.
addReceiptPaymentRequestionSubmitAPI
(
context
,
provider
.
formattedDateToSend
,
...
...
lib/screens/finance/directPaymentRequesitionList.dart
View file @
a5f65ab1
...
...
@@ -646,7 +646,7 @@ class _DirectpaymentrequesitionlistState
child:
provider
.
submitClicked
?
CircularProgressIndicator
.
adaptive
(
valueColor:
AlwaysStoppedAnimation
(
AppColors
.
app_blu
e
),
valueColor:
AlwaysStoppedAnimation
(
AppColors
.
whit
e
),
)
:
Text
(
"Submit"
,
...
...
lib/screens/finance/financeDashboard.dart
View file @
a5f65ab1
...
...
@@ -432,7 +432,7 @@ class _FinancedashboardState extends State<Financedashboard> {
)
=>
Allpaymentrequesitionlistsbymodes
(
mode:
"process"
,
pageTitleName:
"Payment Requisition List (
Self
)"
,
"Payment Requisition List (
Process
)"
,
),
),
);
...
...
lib/screens/hrm/AddManualAttendance.dart
View file @
a5f65ab1
...
...
@@ -229,6 +229,18 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
return
;
}
// --- Format date for server (convert from "03 Sep 2025" to "2025-09-03" or whatever format server expects) ---
String
formattedDate
=
""
;
try
{
final
parsedDate
=
DateFormat
(
"dd MMM yyyy"
).
parse
(
provider
.
dateController
.
text
);
formattedDate
=
DateFormat
(
"yyyy-MM-dd"
).
format
(
parsedDate
);
// Change format as per server requirement
}
catch
(
e
)
{
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
"Error formatting date:
$e
"
)),
);
return
;
}
// --- Build data according to type ---
String
?
finalCheckInTime
;
String
?
finalCheckInLoc
;
...
...
@@ -268,7 +280,7 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
:
selectedType
==
"Check Out"
?
checkOutLocation
.
text
:
"
${checkInLocation.text}
,
${checkOutLocation.text}
"
,
checkDate:
provider
.
dateController
.
text
,
checkDate:
formattedDate
,
// Use the formatted date here
checkInTime:
finalCheckInTime
,
checkInLoc:
finalCheckInLoc
,
checkInProof:
finalCheckInProof
,
...
...
lib/screens/hrm/AttendanceRequestDetail.dart
View file @
a5f65ab1
...
...
@@ -12,8 +12,9 @@ import '../finance/FileViewer.dart';
/// screen for attendance details
class
AttendanceRequestDetailScreen
extends
StatefulWidget
{
final
String
mode
;
final
attendanceListId
;
const
AttendanceRequestDetailScreen
({
super
.
key
,
required
this
.
attendanceListId
});
const
AttendanceRequestDetailScreen
({
super
.
key
,
required
this
.
attendanceListId
,
required
this
.
mode
});
@override
State
<
AttendanceRequestDetailScreen
>
createState
()
=>
...
...
@@ -238,12 +239,279 @@ class _AttendanceRequestDetailScreenState
);
},
),
bottomNavigationBar:
widget
.
mode
==
"apr_lvl1"
?
Container
(
decoration:
const
BoxDecoration
(
color:
Colors
.
white
),
padding:
const
EdgeInsets
.
symmetric
(
horizontal:
10
,
vertical:
10
),
height:
80
,
child:
Row
(
children:
[
/// Reject Button
Expanded
(
child:
InkWell
(
onTap:
()
{
showRemarkSheet
(
context:
context
,
actionType:
"Reject"
,
onSubmit:
(
remark
)
{
provider
.
rejectAttendanceRequest
(
context
,
mode:
widget
.
mode
,
type:
"Rejected"
,
remarks:
remark
,
id:
provider
.
response
!.
requestDetails
!.
id
!,
);
},
);
},
child:
Container
(
alignment:
Alignment
.
center
,
height:
45
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
8
),
color:
const
Color
(
0xFFFFFFFF
),
),
child:
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
SvgPicture
.
asset
(
"assets/svg/finance/level_reject_ic.svg"
),
const
SizedBox
(
width:
6
),
const
Text
(
"Reject"
),
],
),
),
),
),
const
SizedBox
(
width:
10
),
/// Approve Button
Expanded
(
child:
InkWell
(
onTap:
()
{
showRemarkSheet
(
context:
context
,
actionType:
"Approve"
,
onSubmit:
(
remark
)
{
provider
.
rejectAttendanceRequest
(
context
,
mode:
widget
.
mode
,
type:
"Approved"
,
remarks:
remark
,
id:
provider
.
response
!.
requestDetails
!.
id
!,
);
},
);
},
child:
Container
(
alignment:
Alignment
.
center
,
height:
45
,
decoration:
BoxDecoration
(
borderRadius:
BorderRadius
.
circular
(
8
),
color:
const
Color
(
0xFFFFFFFF
),
),
child:
Row
(
mainAxisAlignment:
MainAxisAlignment
.
center
,
children:
[
SvgPicture
.
asset
(
"assets/svg/finance/level_approve_ic.svg"
),
const
SizedBox
(
width:
6
),
const
Text
(
"Approve"
),
],
),
),
),
),
],
),
)
:
const
SizedBox
.
shrink
(),
floatingActionButtonLocation:
FloatingActionButtonLocation
.
centerDocked
,
);
},
)
);
}
Future
<
void
>
showRemarkSheet
({
required
BuildContext
context
,
required
String
actionType
,
// "Approved" or "Rejected"
required
Function
(
String
remark
)
onSubmit
,
})
{
final
remarkController
=
TextEditingController
();
String
?
remarkError
;
return
showModalBottomSheet
(
useSafeArea:
true
,
isDismissible:
true
,
isScrollControlled:
true
,
showDragHandle:
true
,
backgroundColor:
Colors
.
white
,
enableDrag:
true
,
context:
context
,
builder:
(
context
)
{
return
StatefulBuilder
(
builder:
(
context
,
setState
)
{
void
updateState
(
VoidCallback
fn
)
{
setState
(
fn
);
}
bool
validateFields
()
{
String
?
newRemarkError
=
remarkController
.
text
.
trim
().
isEmpty
?
"Remark required"
:
null
;
if
(
remarkError
!=
newRemarkError
)
{
updateState
(()
{
remarkError
=
newRemarkError
;
});
}
return
newRemarkError
==
null
;
}
Widget
errorText
(
String
?
msg
)
=>
msg
==
null
?
const
SizedBox
()
:
Padding
(
padding:
const
EdgeInsets
.
only
(
top:
4
,
left:
4
),
child:
Text
(
msg
,
style:
const
TextStyle
(
color:
Colors
.
red
,
fontSize:
12
,
fontFamily:
"JakartaMedium"
,
),
),
);
return
SafeArea
(
child:
Container
(
margin:
const
EdgeInsets
.
symmetric
(
horizontal:
15
,
vertical:
10
),
padding:
EdgeInsets
.
only
(
bottom:
MediaQuery
.
of
(
context
).
viewInsets
.
bottom
,
),
child:
SingleChildScrollView
(
child:
Column
(
crossAxisAlignment:
CrossAxisAlignment
.
start
,
mainAxisSize:
MainAxisSize
.
min
,
children:
[
Text
(
"
$actionType
Attendance Request"
,
style:
const
TextStyle
(
fontSize:
16
,
color:
Colors
.
black87
,
fontFamily:
"JakartaMedium"
,
),
),
const
SizedBox
(
height:
16
),
Text
(
"Remark"
,
style:
const
TextStyle
(
fontSize:
14
,
color:
Colors
.
black87
,
fontFamily:
"JakartaMedium"
,
),
),
const
SizedBox
(
height:
6
),
TextField
(
controller:
remarkController
,
maxLines:
3
,
onChanged:
(
val
)
{
if
(
remarkError
!=
null
&&
val
.
isNotEmpty
)
{
updateState
(()
=>
remarkError
=
null
);
}
},
decoration:
InputDecoration
(
hintText:
"Enter your remark here..."
,
filled:
true
,
fillColor:
Colors
.
grey
.
shade100
,
border:
OutlineInputBorder
(
borderRadius:
BorderRadius
.
circular
(
12
),
),
contentPadding:
const
EdgeInsets
.
symmetric
(
vertical:
12
,
horizontal:
12
,
),
),
),
errorText
(
remarkError
),
const
SizedBox
(
height:
20
),
Row
(
children:
[
Expanded
(
child:
InkResponse
(
onTap:
()
=>
Navigator
.
pop
(
context
),
child:
Container
(
height:
45
,
decoration:
BoxDecoration
(
color:
Colors
.
red
.
shade100
,
borderRadius:
BorderRadius
.
circular
(
12
),
),
child:
const
Center
(
child:
Text
(
"Cancel"
,
style:
TextStyle
(
color:
Colors
.
red
,
fontFamily:
"JakartaMedium"
,
),
),
),
),
),
),
const
SizedBox
(
width:
12
),
Expanded
(
child:
InkResponse
(
onTap:
()
async
{
if
(
validateFields
())
{
final
remark
=
remarkController
.
text
.
trim
();
// Call provider
await
onSubmit
(
remark
);
// SnackBar here
Navigator
.
pop
(
context
);
ScaffoldMessenger
.
of
(
context
).
showSnackBar
(
SnackBar
(
content:
Text
(
"Request submitted successfully"
),
backgroundColor:
Colors
.
green
,
behavior:
SnackBarBehavior
.
floating
,
),
);
}
},
child:
Container
(
height:
45
,
decoration:
BoxDecoration
(
color:
Colors
.
blue
,
borderRadius:
BorderRadius
.
circular
(
12
),
),
child:
const
Center
(
child:
Text
(
"Submit"
,
style:
TextStyle
(
color:
Colors
.
white
,
fontFamily:
"JakartaMedium"
,
),
),
),
),
),
),
],
),
],
),
),
),
);
},
);
},
);
}
/// Reusable Row Widget for details
Widget
_buildDetailTile
(
String
label
,
String
?
value
,
double
scaleFactor
)
{
return
Padding
(
...
...
lib/screens/hrm/Attendancelist.dart
View file @
a5f65ab1
...
...
@@ -13,14 +13,15 @@ import '../CommonFilter2.dart';
import
'../commonDateRangeFilter.dart'
;
import
'AddLiveAttendance.dart'
;
class
Attendancelist
extends
StatefulWidget
{
const
Attendancelist
({
super
.
key
});
class
AttendanceListScreen
extends
StatefulWidget
{
final
mode
;
const
AttendanceListScreen
({
super
.
key
,
required
this
.
mode
});
@override
State
<
Attendance
l
ist
>
createState
()
=>
_Attendance
l
istState
();
State
<
Attendance
L
ist
Screen
>
createState
()
=>
_Attendance
L
istS
creenS
tate
();
}
class
_Attendance
l
istState
extends
State
<
Attendance
l
ist
>
{
class
_Attendance
L
istS
creenS
tate
extends
State
<
Attendance
L
ist
Screen
>
{
// @override
// void initState() {
// super.initState();
...
...
@@ -38,7 +39,7 @@ class _AttendancelistState extends State<Attendancelist> {
create:
(
_
)
{
final
provider
=
Attendancelistprovider
();
Future
.
microtask
(()
{
provider
.
fetchAttendanceRequests
(
context
);
provider
.
fetchAttendanceRequests
(
context
,
widget
.
mode
);
});
return
provider
;
},
...
...
@@ -80,6 +81,7 @@ class _AttendancelistState extends State<Attendancelist> {
provider
.
updateFiltersFromSheet
(
context
,
widget
.
mode
,
type:
result
[
'type'
]
??
"All"
,
selectedValue:
result
[
'selectedValue'
]
??
"This Month"
,
customRange:
result
[
'dateRange'
],
...
...
@@ -161,6 +163,7 @@ class _AttendancelistState extends State<Attendancelist> {
MaterialPageRoute
(
builder:
(
context
)
=>
AttendanceRequestDetailScreen
(
attendanceListId:
item
.
id
,
mode:
widget
.
mode
,
),
),
);
...
...
@@ -266,7 +269,7 @@ class _AttendancelistState extends State<Attendancelist> {
),
),
).
then
((
_
)
{
provider
.
fetchAttendanceRequests
(
context
);
provider
.
fetchAttendanceRequests
(
context
,
widget
.
mode
);
});
},
child:
Row
(
...
...
@@ -294,7 +297,7 @@ class _AttendancelistState extends State<Attendancelist> {
name:
'AddManualAttendanceScreen'
),
),
).
then
((
_
)
{
provider
.
fetchAttendanceRequests
(
context
);
provider
.
fetchAttendanceRequests
(
context
,
widget
.
mode
);
});
},
child:
Row
(
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment