...@@ -55,12 +55,36 @@ class _AddLiveAttendanceScreenState extends State<AddLiveAttendanceScreen> { ...@@ -55,12 +55,36 @@ class _AddLiveAttendanceScreenState extends State<AddLiveAttendanceScreen> {
} }
Future<void> _autoFetchLocation() async { Future<void> _autoFetchLocation() async {
String loc = await getCurrentLocation(); Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high,
);
// Save raw coordinates separately (for submission)
final coords = "${position.latitude},${position.longitude}";
// Convert to address for display
final placemarks =
await placemarkFromCoordinates(position.latitude, position.longitude);
String displayAddress;
if (placemarks.isNotEmpty) {
final place = placemarks.first;
displayAddress =
"${place.name}, ${place.locality}, ${place.administrativeArea}, ${place.country}";
} else {
displayAddress = coords; // fallback
}
setState(() { setState(() {
locationController.text = loc; locationController.text = displayAddress; // what user sees
_rawCoordinates = coords; // keep coords hidden for backend
}); });
} }
// Add this field at the top of your State class:
String? _rawCoordinates;
Future<String> getCurrentLocation() async { Future<String> getCurrentLocation() async {
try { try {
LocationPermission permission = await Geolocator.checkPermission(); LocationPermission permission = await Geolocator.checkPermission();
...@@ -164,7 +188,7 @@ class _AddLiveAttendanceScreenState extends State<AddLiveAttendanceScreen> { ...@@ -164,7 +188,7 @@ class _AddLiveAttendanceScreenState extends State<AddLiveAttendanceScreen> {
context, context,
process: "Live", process: "Live",
type: selectedType ?? "", type: selectedType ?? "",
loc: locationController.text, loc: _rawCoordinates ?? "", // send actual coordinates
checkDate: DateTime.now().toString().split(" ").first, checkDate: DateTime.now().toString().split(" ").first,
checkInTime: checkInTime:
selectedType == "Check In" ? TimeOfDay.now().format(context) : null, selectedType == "Check In" ? TimeOfDay.now().format(context) : null,
...@@ -198,210 +222,213 @@ class _AddLiveAttendanceScreenState extends State<AddLiveAttendanceScreen> { ...@@ -198,210 +222,213 @@ class _AddLiveAttendanceScreenState extends State<AddLiveAttendanceScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return SafeArea(
backgroundColor: Colors.white, top: false,
appBar: AppBar( child: Scaffold(
automaticallyImplyLeading: false,
backgroundColor: Colors.white, backgroundColor: Colors.white,
elevation: 0, appBar: AppBar(
title: Row( automaticallyImplyLeading: false,
children: [ backgroundColor: Colors.white,
InkResponse( elevation: 0,
onTap: () => Navigator.pop(context, true), title: Row(
child: SvgPicture.asset( children: [
"assets/svg/appbar_back_button.svg", InkResponse(
height: 25, onTap: () => Navigator.pop(context, true),
), child: SvgPicture.asset(
), "assets/svg/appbar_back_button.svg",
const SizedBox(width: 10), height: 25,
Text( ),
"Add Live Attendance",
style: TextStyle(
fontSize: 18,
fontFamily: "JakartaMedium",
fontWeight: FontWeight.w600,
color: AppColors.semi_black,
), ),
), const SizedBox(width: 10),
], Text(
), "Add Live Attendance",
),
body: SingleChildScrollView(
padding: const EdgeInsets.all(18),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
/// Type Dropdown
const Text("Type",
style: TextStyle( style: TextStyle(
fontSize: 15, fontSize: 18,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontWeight: FontWeight.w500)), fontWeight: FontWeight.w600,
const SizedBox(height: 6), color: AppColors.semi_black,
Container( ),
padding: const EdgeInsets.symmetric(horizontal: 2),
decoration: BoxDecoration(
color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(8),
), ),
child: DropdownButtonHideUnderline( ],
child: DropdownButton2<String>( ),
isExpanded: true, ),
hint: const Text( body: SingleChildScrollView(
"Select Type", padding: const EdgeInsets.all(18),
overflow: TextOverflow.ellipsis, child: Column(
style: TextStyle( crossAxisAlignment: CrossAxisAlignment.start,
fontSize: 15, children: [
fontFamily: "JakartaMedium", /// Type Dropdown
fontWeight: FontWeight.w400), const Text("Type",
), style: TextStyle(
value: selectedType, fontSize: 15,
items: types fontFamily: "JakartaMedium",
.map((e) => DropdownMenuItem<String>( fontWeight: FontWeight.w500)),
value: e, const SizedBox(height: 6),
child: Text( Container(
e, padding: const EdgeInsets.symmetric(horizontal: 2),
style: const TextStyle( decoration: BoxDecoration(
fontSize: 14, fontFamily: "JakartaMedium"), color: Colors.grey.shade100,
borderRadius: BorderRadius.circular(8),
),
child: DropdownButtonHideUnderline(
child: DropdownButton2<String>(
isExpanded: true,
hint: const Text(
"Select Type",
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 15,
fontFamily: "JakartaMedium",
fontWeight: FontWeight.w400),
), ),
)) value: selectedType,
.toList(), items: types
onChanged: (val) => setState(() => selectedType = val), .map((e) => DropdownMenuItem<String>(
iconStyleData: ddtheme.iconStyleData, value: e,
dropdownStyleData: ddtheme.dropdownStyleData, child: Text(
e,
style: const TextStyle(
fontSize: 14, fontFamily: "JakartaMedium"),
overflow: TextOverflow.ellipsis,
),
))
.toList(),
onChanged: (val) => setState(() => selectedType = val),
iconStyleData: ddtheme.iconStyleData,
dropdownStyleData: ddtheme.dropdownStyleData,
),
), ),
), ),
), if (typeError != null) ...[
if (typeError != null) ...[ const SizedBox(height: 4),
const SizedBox(height: 4), Text(typeError!,
Text(typeError!, style: const TextStyle(
color: Colors.red,
fontSize: 13,
fontFamily: "JakartaMedium")),
],
const SizedBox(height: 16),
/// Location
Text(locationHeading,
style: const TextStyle( style: const TextStyle(
color: Colors.red, fontSize: 15,
fontSize: 13, fontFamily: "JakartaMedium",
fontFamily: "JakartaMedium")), fontWeight: FontWeight.w500)),
], const SizedBox(height: 6),
TextField(
controller: locationController,
decoration: _inputDecoration("Enter location"),
),
if (locationError != null) ...[
const SizedBox(height: 4),
Text(locationError!,
style: const TextStyle(
color: Colors.red,
fontSize: 13,
fontFamily: "JakartaMedium")),
],
const SizedBox(height: 16), const SizedBox(height: 16),
/// Location /// Description
Text(locationHeading, Text(descriptionHeading,
style: const TextStyle(
fontSize: 15,
fontFamily: "JakartaMedium",
fontWeight: FontWeight.w500)),
const SizedBox(height: 6),
TextField(
controller: locationController,
decoration: _inputDecoration("Enter location"),
),
if (locationError != null) ...[
const SizedBox(height: 4),
Text(locationError!,
style: const TextStyle( style: const TextStyle(
color: Colors.red, fontSize: 15,
fontSize: 13, fontFamily: "JakartaMedium",
fontFamily: "JakartaMedium")), fontWeight: FontWeight.w500)),
], const SizedBox(height: 6),
TextField(
controller: descriptionController,
maxLines: 3,
decoration: _inputDecoration("Write Description"),
),
const SizedBox(height: 16), const SizedBox(height: 20),
/// Description /// Attach Proof
Text(descriptionHeading, InkResponse(
style: const TextStyle( onTap: () => _showPicker(context),
fontSize: 15, child: Container(
fontFamily: "JakartaMedium", width: double.infinity,
fontWeight: FontWeight.w500)), padding: const EdgeInsets.symmetric(vertical: 14),
const SizedBox(height: 6), decoration: BoxDecoration(
TextField( color: Colors.blue.shade50,
controller: descriptionController, border: Border.all(color: Colors.blue.shade200),
maxLines: 3, borderRadius: BorderRadius.circular(14),
decoration: _inputDecoration("Write Description"), ),
), child: Center(
child: Text(
const SizedBox(height: 20), proofButtonText,
style: const TextStyle(
/// Attach Proof fontSize: 16,
InkResponse( color: Colors.blue,
onTap: () => _showPicker(context), fontFamily: "JakartaMedium",
child: Container( fontWeight: FontWeight.w500,
width: double.infinity, ),
padding: const EdgeInsets.symmetric(vertical: 14), ),
decoration: BoxDecoration( ),
color: Colors.blue.shade50,
border: Border.all(color: Colors.blue.shade200),
borderRadius: BorderRadius.circular(14),
), ),
child: Center( ),
child: Text( if (proofError != null) ...[
proofButtonText, const SizedBox(height: 4),
Text(proofError!,
style: const TextStyle( style: const TextStyle(
color: Colors.red,
fontSize: 13,
fontFamily: "JakartaMedium")),
],
if (proofFile != null) ...[
const SizedBox(height: 10),
Row(
children: [
const Icon(Icons.check_circle, color: Colors.green),
const SizedBox(width: 8),
Expanded(
child: Text("Attached: ${proofFile!.name}",
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontFamily: "JakartaMedium", fontSize: 14))),
IconButton(
icon: const Icon(Icons.close, color: Colors.red),
onPressed: () => setState(() => proofFile = null),
),
],
)
],
const SizedBox(height: 24),
/// Submit Button
InkResponse(
onTap:
isSubmitEnabled && !isSubmitting ? () => submitAttendance(context) : null,
child: Container(
height: 48,
alignment: Alignment.center,
decoration: BoxDecoration(
color: isSubmitEnabled
? AppColors.app_blue
: Colors.grey.shade400,
borderRadius: BorderRadius.circular(12),
),
child: isSubmitting
? const CircularProgressIndicator(
color: Colors.white, strokeWidth: 2)
: const Text(
"Submit",
style: TextStyle(
fontSize: 16, fontSize: 16,
color: Colors.blue,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontWeight: FontWeight.w500, color: Colors.white,
), ),
), ),
), ),
), ),
),
if (proofError != null) ...[
const SizedBox(height: 4),
Text(proofError!,
style: const TextStyle(
color: Colors.red,
fontSize: 13,
fontFamily: "JakartaMedium")),
],
if (proofFile != null) ...[
const SizedBox(height: 10),
Row(
children: [
const Icon(Icons.check_circle, color: Colors.green),
const SizedBox(width: 8),
Expanded(
child: Text("Attached: ${proofFile!.name}",
overflow: TextOverflow.ellipsis,
style: const TextStyle(
fontFamily: "JakartaMedium", fontSize: 14))),
IconButton(
icon: const Icon(Icons.close, color: Colors.red),
onPressed: () => setState(() => proofFile = null),
),
],
)
], ],
),
const SizedBox(height: 24),
/// Submit Button
InkResponse(
onTap:
isSubmitEnabled && !isSubmitting ? () => submitAttendance(context) : null,
child: Container(
height: 48,
alignment: Alignment.center,
decoration: BoxDecoration(
color: isSubmitEnabled
? AppColors.app_blue
: Colors.grey.shade400,
borderRadius: BorderRadius.circular(12),
),
child: isSubmitting
? const CircularProgressIndicator(
color: Colors.white, strokeWidth: 2)
: const Text(
"Submit",
style: TextStyle(
fontSize: 16,
fontFamily: "JakartaMedium",
color: Colors.white,
),
),
),
),
],
), ),
), ),
); );
......
...@@ -168,7 +168,7 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> { ...@@ -168,7 +168,7 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
} }
void _submitForm(BuildContext context) async { void _submitForm(BuildContext context) async {
// reset errors first // Reset errors first
dateError = null; dateError = null;
typeError = null; typeError = null;
checkInTimeError = checkInLocError = checkInDescError = checkInProofError = null; checkInTimeError = checkInLocError = checkInDescError = checkInProofError = null;
...@@ -176,15 +176,27 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> { ...@@ -176,15 +176,27 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
final provider = Provider.of<Attendancelistprovider>(context, listen: false); final provider = Provider.of<Attendancelistprovider>(context, listen: false);
// --- Date Validation --- // --- Date Validation (allow today, yesterday, day before yesterday) ---
if (provider.dateController.text.isEmpty) { if (provider.dateController.text.isEmpty) {
dateError = "Please select a date"; dateError = "Please select a date";
} else { } else {
try { try {
final enteredDate = DateFormat("dd MMM yyyy").parse(provider.dateController.text); final enteredDate = DateFormat("dd MMM yyyy").parse(provider.dateController.text);
provider.setSelectedDate(enteredDate); provider.setSelectedDate(enteredDate);
if (!provider.isDateValid()) {
dateError = "Date must be today or yesterday"; final today = DateTime.now();
final yesterday = today.subtract(const Duration(days: 1));
final dayBeforeYesterday = today.subtract(const Duration(days: 2));
// Normalize dates (ignore time part)
bool isValid = enteredDate.year == today.year &&
enteredDate.month == today.month &&
(enteredDate.day == today.day ||
enteredDate.day == yesterday.day ||
enteredDate.day == dayBeforeYesterday.day);
if (!isValid) {
dateError = "Date must be today, yesterday, or the day before yesterday";
} }
} catch (e) { } catch (e) {
dateError = "Invalid date format (use dd MMM yyyy)"; dateError = "Invalid date format (use dd MMM yyyy)";
...@@ -225,7 +237,19 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> { ...@@ -225,7 +237,19 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
checkOutDescError, checkOutDescError,
checkOutProofError checkOutProofError
].any((e) => e != null)) { ].any((e) => e != null)) {
setState(() {}); setState(() {}); // refresh UI to show error messages
return;
}
// --- Format date for server ---
String formattedDate = "";
try {
final parsedDate = DateFormat("dd MMM yyyy").parse(provider.dateController.text);
formattedDate = DateFormat("yyyy-MM-dd").format(parsedDate);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Error formatting date: $e")),
);
return; return;
} }
...@@ -268,7 +292,7 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> { ...@@ -268,7 +292,7 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
: selectedType == "Check Out" : selectedType == "Check Out"
? checkOutLocation.text ? checkOutLocation.text
: "${checkInLocation.text}, ${checkOutLocation.text}", : "${checkInLocation.text}, ${checkOutLocation.text}",
checkDate: provider.dateController.text, checkDate: formattedDate,
checkInTime: finalCheckInTime, checkInTime: finalCheckInTime,
checkInLoc: finalCheckInLoc, checkInLoc: finalCheckInLoc,
checkInProof: finalCheckInProof, checkInProof: finalCheckInProof,
...@@ -278,14 +302,13 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> { ...@@ -278,14 +302,13 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
note: finalNote, note: finalNote,
); );
// Check the response from provider // --- Response handling ---
if (provider.addResponse != null && provider.addResponse!.error == "0") { if (provider.addResponse != null && provider.addResponse!.error == "0") {
// Success case
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(provider.addResponse!.message ?? "Attendance Submitted Successfully")), SnackBar(content: Text(provider.addResponse!.message ?? "Attendance Submitted Successfully")),
); );
// --- Reset fields --- // Reset fields
setState(() { setState(() {
selectedType = null; selectedType = null;
provider.dateController.clear(); provider.dateController.clear();
...@@ -301,19 +324,20 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> { ...@@ -301,19 +324,20 @@ class _AddManualAttendanceScreenState extends State<AddManualAttendanceScreen> {
_fetchInitialLocation(); _fetchInitialLocation();
} else { } else {
// Error case - show appropriate message
String errorMessage = provider.errorMessage ?? "Failed to submit attendance"; String errorMessage = provider.errorMessage ?? "Failed to submit attendance";
// Handle specific server error for Check Out without Check In
if (errorMessage.contains("Check In is not Available")) { if (errorMessage.contains("Check In is not Available")) {
errorMessage = "Cannot submit Check Out without a Check In record for this date"; errorMessage = "Cannot submit Check Out without a Check In record for this date";
} }
if (errorMessage.contains("2")){
errorMessage = "Only One manual Request can be added in a month !";
}
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(errorMessage), backgroundColor: Colors.red), SnackBar(content: Text(errorMessage), backgroundColor: Colors.red),
); );
} }
} }
// it's date picker need to take day before yesterday, yesterday and today
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -168,38 +168,36 @@ class _TourExpensesListScreenState extends State<TourExpensesListScreen> { ...@@ -168,38 +168,36 @@ class _TourExpensesListScreenState extends State<TourExpensesListScreen> {
], ],
), ),
floatingActionButtonLocation: bottomNavigationBar: Container(
FloatingActionButtonLocation.centerFloat, padding: const EdgeInsets.symmetric(horizontal: 18, vertical: 10),
floatingActionButton: InkResponse( color: Colors.white,
onTap: () { child: ElevatedButton(
HapticFeedback.selectionClick(); style: ElevatedButton.styleFrom(
Navigator.push( backgroundColor: const Color(0xff1487c9), // App blue
context, shape: RoundedRectangleBorder(
MaterialPageRoute( borderRadius: BorderRadius.circular(15),
builder: (context) =>
const AddBillScreen(pageTitleName: "Add Bill",),
settings: const RouteSettings(
name: 'AddTourExpBillScreen'),
), ),
).then((_) { padding: const EdgeInsets.symmetric(vertical: 14),
provider.fetchTourExpenses(context, "1"); elevation: 0, // Optional: remove shadow
});
// show add bill screen here
},
child: Container(
height: 45,
alignment: Alignment.center,
margin: EdgeInsets.symmetric(horizontal: 20),
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 5),
decoration: BoxDecoration(
color: AppColors.app_blue,
borderRadius: BorderRadius.circular(15),
), ),
child: Text( onPressed: () {
HapticFeedback.selectionClick();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const AddBillScreen(pageTitleName: "Add Bill"),
settings: const RouteSettings(name: 'AddTourExpBillScreen'),
),
).then((_) {
provider.fetchTourExpenses(context, "1");
});
},
child: const Text(
"Add Bill", "Add Bill",
style: TextStyle( style: TextStyle(
fontSize: 15, fontSize: 16,
fontFamily: "JakartaMedium", fontFamily: "JakartaMedium",
fontWeight: FontWeight.w500,
color: Colors.white, color: Colors.white,
), ),
), ),
......
...@@ -57,6 +57,7 @@ export 'package:generp/Notifiers/crmProvider/followUpUpdateProvider.dart'; ...@@ -57,6 +57,7 @@ export 'package:generp/Notifiers/crmProvider/followUpUpdateProvider.dart';
export 'package:generp/Notifiers/crmProvider/appointmentCalendarProvider.dart'; export 'package:generp/Notifiers/crmProvider/appointmentCalendarProvider.dart';
export 'package:generp/Notifiers/crmProvider/addNewLeadsandProspectsProvider.dart'; export 'package:generp/Notifiers/crmProvider/addNewLeadsandProspectsProvider.dart';
export 'package:generp/Notifiers/hrmProvider/hrmAccessiblePagesProvider.dart';
export 'package:generp/Notifiers/hrmProvider/attendanceListProvider.dart'; export 'package:generp/Notifiers/hrmProvider/attendanceListProvider.dart';
export 'package:generp/Notifiers/hrmProvider/AttendanceDetailsProvider.dart'; export 'package:generp/Notifiers/hrmProvider/AttendanceDetailsProvider.dart';
export 'package:generp/Notifiers/hrmProvider/tourExpensesProvider.dart'; export 'package:generp/Notifiers/hrmProvider/tourExpensesProvider.dart';
......
...@@ -4995,11 +4995,13 @@ class ApiCalling { ...@@ -4995,11 +4995,13 @@ class ApiCalling {
type, type,
from, from,
to, to,
mode
) async { ) async {
try { try {
Map<String, String> data = { Map<String, String> data = {
'emp_id': (empId).toString(), 'emp_id': (empId).toString(),
'session_id': (session).toString(), 'session_id': (session).toString(),
'mode': (mode),
'type': (type), 'type': (type),
'from': (from), 'from': (from),
'to': (to), 'to': (to),
...@@ -5019,6 +5021,7 @@ class ApiCalling { ...@@ -5019,6 +5021,7 @@ class ApiCalling {
} }
} }
static Future<attendanceRequestDetailsResponse?> attendanceRequestDetailAPI( static Future<attendanceRequestDetailsResponse?> attendanceRequestDetailAPI(
empId, empId,
session, session,
...@@ -5045,6 +5048,38 @@ class ApiCalling { ...@@ -5045,6 +5048,38 @@ class ApiCalling {
} }
} }
static Future<CommonResponse?> attendanceRequestApproveRejectAPI(
session,
empId,
mode,
type,
remarks,
id,
) async {
try {
Map<String, String> data = {
'session_id': (session).toString(),
'emp_id': (empId).toString(),
'mode': (mode).toString(),
'type': (type).toString(),
'remarks': (remarks).toString(),
'id': (id).toString(),
};
final res = await post(data, AttendanceRequestRejectUrl, {});
if (res != null) {
print("Attendance App Reje:${data}");
debugPrint(res.body);
return CommonResponse.fromJson(jsonDecode(res.body));
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
static Future<CommonResponse?> addAttendanceRequestAPI({ static Future<CommonResponse?> addAttendanceRequestAPI({
required String sessionId, required String sessionId,
required String empId, required String empId,
...@@ -5317,12 +5352,14 @@ class ApiCalling { ...@@ -5317,12 +5352,14 @@ class ApiCalling {
// Leave Application api
// Leave Application api // Leave Application api
static Future<leaveApplicationLIstResponse?> leaveApplicationListAPI( static Future<leaveApplicationLIstResponse?> leaveApplicationListAPI(
session, session,
empId, empId,
dateFrom, dateFrom,
dateTo dateTo,
mode
) async { ) async {
try { try {
Map<String, String> data = { Map<String, String> data = {
...@@ -5330,6 +5367,8 @@ class ApiCalling { ...@@ -5330,6 +5367,8 @@ class ApiCalling {
'emp_id': (empId).toString(), 'emp_id': (empId).toString(),
'requested_date_from': (dateFrom), 'requested_date_from': (dateFrom),
'requested_date_to': (dateTo), 'requested_date_to': (dateTo),
'mode': (mode),
}; };
final res = await post(data, LeaveApplicationListUrl, {}); final res = await post(data, LeaveApplicationListUrl, {});
if (res != null) { if (res != null) {
...@@ -5408,6 +5447,38 @@ class ApiCalling { ...@@ -5408,6 +5447,38 @@ class ApiCalling {
} }
} }
static Future<CommonResponse?> leaveRequestRejectApproveAPI(
session,
empId,
mode,
type,
remarks,
id,
) async {
try {
Map<String, String> data = {
'session_id': (session).toString(),
'emp_id': (empId).toString(),
'mode': (mode).toString(),
'type': (type).toString(),
'remarks': (remarks).toString(),
'id': (id).toString(),
};
final res = await post(data, LeaveRequestRejectAprroveUrl, {});
if (res != null) {
print(data);
debugPrint(res.body);
return CommonResponse.fromJson(jsonDecode(res.body));
} else {
debugPrint("Null Response");
return null;
}
} catch (e) {
debugPrint('hello bev=bug $e ');
return null;
}
}
// static Future<CommonResponse?> TpcIssueListApprovalAPI( // static Future<CommonResponse?> TpcIssueListApprovalAPI(
// empId, // empId,
......
...@@ -180,13 +180,16 @@ const crmDashboardQuotationsUrl = "${baseUrl_test}crm_dashboard_quotations_list" ...@@ -180,13 +180,16 @@ const crmDashboardQuotationsUrl = "${baseUrl_test}crm_dashboard_quotations_list"
const ogcharturl = "${baseUrl_test}organisation_structures"; const ogcharturl = "${baseUrl_test}organisation_structures";
const JobDesciptionUrl ="${baseUrl_test}job_description";
///HRM ///HRM
//Attendance //Attendance
const HrmAccessiblePagesUrl ="${baseUrl_test}hrm_accessible_pages"; const HrmAccessiblePagesUrl ="${baseUrl_test}hrm_accessible_pages";
const AttendanceRequestListUrl ="${baseUrl_test}attendance_request_list"; const AttendanceRequestListUrl ="${baseUrl_test}attendance_request_list";
const AttendanceRequestDetailsUrl ="${baseUrl_test}attendance_request_details"; const AttendanceRequestDetailsUrl ="${baseUrl_test}attendance_request_details";
const AddAttendanceRequestUrl ="${baseUrl_test}add_attendance_request"; const AddAttendanceRequestUrl ="${baseUrl_test}add_attendance_request";
const AttendanceRequestRejectUrl ="${baseUrl_test}attendance_approve_reject";
const AttendanceRequestAproveUrl ="${baseUrl_test}attendance_approve_reject";
// reward list // reward list
const RewardListUrl ="${baseUrl_test}hrm_emp_self_rewards"; const RewardListUrl ="${baseUrl_test}hrm_emp_self_rewards";
// Tour Expenses hrm_emp_self_rewards // Tour Expenses hrm_emp_self_rewards
...@@ -198,6 +201,7 @@ const AddTourExpensesUrl ="${baseUrl_test}add_tour_bill"; ...@@ -198,6 +201,7 @@ const AddTourExpensesUrl ="${baseUrl_test}add_tour_bill";
const LeaveApplicationListUrl ="${baseUrl_test}leave_request_list"; const LeaveApplicationListUrl ="${baseUrl_test}leave_request_list";
const LeaveApplicationDetailsUrl ="${baseUrl_test}leave_request_details"; const LeaveApplicationDetailsUrl ="${baseUrl_test}leave_request_details";
const LeaveRequestAdditionUrl ="${baseUrl_test}add_leave_request"; const LeaveRequestAdditionUrl ="${baseUrl_test}add_leave_request";
const LeaveRequestRejectAprroveUrl ="${baseUrl_test}leaves_approve_reject";
......