chnages has been made and net salary is being displayed

This commit is contained in:
Daniah Ayad Al-sultani
2026-02-11 14:31:03 +03:00
parent 1002937045
commit a7930d19e5
23 changed files with 691 additions and 141 deletions

View File

@@ -7,6 +7,7 @@ import '../dto/attendance_record_dto.dart';
import '../dto/overtime_dto.dart';
import '../dto/reward_dto.dart';
import '../dto/punishment_dto.dart';
import '../dto/salary_response_dto.dart';
abstract class AttendanceRemoteDataSource {
Future<AttendanceResponseDto> login({
@@ -25,6 +26,11 @@ abstract class AttendanceRemoteDataSource {
Future<List<OvertimeDto>> getExtraHours({required String employeeId});
Future<List<RewardDto>> getRewards({required String employeeId});
Future<List<PunishmentDto>> getPunishments({required String employeeId});
Future<SalaryResponseDto> calculateSalary({
required String employeeId,
required int month,
required int year,
});
}
class AttendanceRemoteDataSourceImpl implements AttendanceRemoteDataSource {
@@ -286,4 +292,66 @@ class AttendanceRemoteDataSourceImpl implements AttendanceRemoteDataSource {
throw ServerException(message: 'خطأ غير متوقع');
}
}
@override
Future<SalaryResponseDto> calculateSalary({
required String employeeId,
required int month,
required int year,
}) async {
try {
final response = await apiClient.get(
'/SalaryRecord/calculate',
queryParameters: {
'EmployeeId': employeeId,
'Month': month,
'Year': year,
},
);
print('Salary Response Status: ${response.statusCode}');
if (response.statusCode == 200 || response.statusCode == 201) {
final responseData = response.data;
print(
'Salary Response Data: $responseData (${responseData.runtimeType})',
);
if (responseData is Map<String, dynamic>) {
return SalaryResponseDto.fromJson(responseData);
} else if (responseData is num) {
// Handle case where API returns raw number
return SalaryResponseDto(
isSuccess: true,
message: 'Success',
data: SalaryDataDto(netAmount: responseData.toDouble()),
);
} else if (responseData is String &&
double.tryParse(responseData) != null) {
// Handle case where API returns raw numeric string
return SalaryResponseDto(
isSuccess: true,
message: 'Success',
data: SalaryDataDto(netAmount: double.parse(responseData)),
);
} else {
throw ServerException(
message: 'استجابة غير صحيحة من الخادم: $responseData',
statusCode: response.statusCode,
);
}
} else {
throw ServerException(
message: 'فشل في حساب الراتب (Status: ${response.statusCode})',
statusCode: response.statusCode,
);
}
} on DioException catch (e) {
throw ServerException(
message: e.message ?? 'Unknown error',
statusCode: e.response?.statusCode,
);
} catch (e) {
throw ServerException(message: 'خطأ غير متوقع');
}
}
}

View File

@@ -3,9 +3,14 @@ import '../../core/error/exceptions.dart';
import '../../core/network/api_client.dart';
import '../dto/login_dto.dart';
import '../dto/login_response_dto.dart';
import '../dto/change_password_request_dto.dart';
import '../dto/change_password_response_dto.dart';
abstract class AuthRemoteDataSource {
Future<LoginResponseDto> login(LoginDto dto);
Future<ChangePasswordResponseDto> changePassword(
ChangePasswordRequestDto dto,
);
}
class AuthRemoteDataSourceImpl implements AuthRemoteDataSource {
@@ -72,4 +77,37 @@ class AuthRemoteDataSourceImpl implements AuthRemoteDataSource {
throw ServerException(message: 'خطأ غير متوقع');
}
}
@override
Future<ChangePasswordResponseDto> changePassword(
ChangePasswordRequestDto dto,
) async {
try {
final response = await apiClient.post(
'/Auth/change-password',
data: dto.toJson(),
);
if (response.statusCode == 200) {
return ChangePasswordResponseDto.fromJson(response.data);
} else {
throw ServerException(
message: response.data['message'] ?? 'فشل تغيير كلمة المرور',
statusCode: response.statusCode,
);
}
} on DioException catch (e) {
final message =
e.response?.data?['message'] ??
e.response?.data?['error'] ??
'فشل تغيير كلمة المرور';
throw ServerException(
message: message,
statusCode: e.response?.statusCode,
);
} catch (e) {
if (e is ServerException) rethrow;
throw ServerException(message: 'خطأ غير متوقع: $e');
}
}
}