221 lines
6.8 KiB
Dart
221 lines
6.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_svg/svg.dart';
|
|
import '../../domain/models/attendance_model.dart';
|
|
import '../../domain/models/overtime_model.dart';
|
|
import '../../domain/models/extra_payment_model.dart';
|
|
import '../../domain/models/finance_record.dart';
|
|
import 'gradient_line.dart';
|
|
import 'status_circle.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
class WorkDayCard extends StatelessWidget {
|
|
final FinanceRecord record;
|
|
|
|
const WorkDayCard({super.key, required this.record});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final dateFormat = DateFormat('yyyy.MM.dd');
|
|
|
|
String title = "يوم عمل";
|
|
if (record is OvertimeModel) title = "ساعات أضافية";
|
|
if (record is ExtraPaymentModel) {
|
|
title = (record as ExtraPaymentModel).isPenalty ? "عقوبة" : "مكافئة";
|
|
}
|
|
|
|
final dateStr =
|
|
record.date != null ? dateFormat.format(record.date!) : '--.--.--';
|
|
|
|
return Container(
|
|
margin: const EdgeInsets.symmetric(horizontal: 18, vertical: 6),
|
|
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white,
|
|
borderRadius: BorderRadius.circular(22),
|
|
boxShadow: const [
|
|
BoxShadow(
|
|
color: Colors.black26,
|
|
blurRadius: 12,
|
|
offset: Offset(0, 6),
|
|
),
|
|
],
|
|
),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
dateStr,
|
|
style: const TextStyle(fontSize: 12, color: Colors.grey),
|
|
),
|
|
Text(
|
|
title,
|
|
textAlign: TextAlign.right,
|
|
style: const TextStyle(
|
|
fontSize: 20,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: 16),
|
|
|
|
/// CONTENT
|
|
_buildContent(context),
|
|
|
|
const SizedBox(height: 12),
|
|
const Divider(color: Colors.black38),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: [
|
|
Text(
|
|
record.reason ??
|
|
(record is ExtraPaymentModel
|
|
? ((record as ExtraPaymentModel).note ??
|
|
"لا يوجد ملاحظات")
|
|
: "لا يوجد ملاحظات"),
|
|
style: const TextStyle(fontSize: 12),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _buildContent(BuildContext context) {
|
|
if (record is AttendanceModel) {
|
|
return _buildAttendanceContent(record as AttendanceModel);
|
|
} else if (record is OvertimeModel) {
|
|
return _buildOvertimeContent(record as OvertimeModel);
|
|
} else if (record is ExtraPaymentModel) {
|
|
return _buildExtraPaymentContent(record as ExtraPaymentModel);
|
|
}
|
|
return const SizedBox();
|
|
}
|
|
|
|
Widget _buildAttendanceContent(AttendanceModel attendance) {
|
|
final timeFormat = DateFormat('h:mm a');
|
|
final loginStr =
|
|
attendance.loginTime != null
|
|
? timeFormat.format(attendance.loginTime!)
|
|
: '--:--';
|
|
final logoutStr =
|
|
attendance.logoutTime != null
|
|
? timeFormat.format(attendance.logoutTime!)
|
|
: '--:--';
|
|
final hoursStr = attendance.workHours?.toString() ?? '0.00';
|
|
|
|
return Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
_StatusItem(
|
|
color: const Color(0xFF1266A8),
|
|
icon: SvgPicture.asset('assets/images/watch.svg', width: 20),
|
|
label: "عدد ساعات\n$hoursStr",
|
|
),
|
|
_buildDivider(const Color(0xFF1266A8), const Color(0xFFB00000)),
|
|
_StatusItem(
|
|
color: const Color(0xFFB00000),
|
|
icon: SvgPicture.asset('assets/images/out.svg', width: 20),
|
|
label: "خروج\n$logoutStr",
|
|
),
|
|
_buildDivider(const Color(0xFFB00000), const Color(0xFF0A8F6B)),
|
|
_StatusItem(
|
|
color: const Color(0xFF0A8F6B),
|
|
icon: SvgPicture.asset('assets/images/in.svg', width: 20),
|
|
label: "دخول\n$loginStr",
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildOvertimeContent(OvertimeModel overtime) {
|
|
return Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
_StatusItem(
|
|
color: const Color(0xFFD16400),
|
|
icon: SvgPicture.asset('assets/images/money3.svg', width: 20),
|
|
label: "سعر كلي\n${overtime.totalAmount.toStringAsFixed(0)} د.ع",
|
|
),
|
|
_buildDivider(const Color(0xFFD16400), const Color(0xFF1266A8)),
|
|
_StatusItem(
|
|
color: const Color(0xFF1266A8),
|
|
icon: SvgPicture.asset('assets/images/watch.svg', width: 20),
|
|
label: "ساعات إضافية\n${overtime.hours.toStringAsFixed(2)}",
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildExtraPaymentContent(ExtraPaymentModel payment) {
|
|
// Reason goes in the middle column.
|
|
// Note goes next to the amount (as part of the amount label).
|
|
final reasonText = payment.reason ?? "لا يوجد سبب";
|
|
final noteText = payment.note != null ? "\n(${payment.note})" : "";
|
|
|
|
return Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
_StatusItem(
|
|
color: const Color(0xFFD16400),
|
|
icon: SvgPicture.asset('assets/images/money3.svg', width: 20),
|
|
label: "المبلغ\n${payment.amount.toStringAsFixed(0)} د.ع$noteText",
|
|
),
|
|
_buildDivider(const Color(0xFFD16400), const Color(0xFF1266A8)),
|
|
Expanded(
|
|
flex: 2,
|
|
child: Column(
|
|
children: [
|
|
Text(
|
|
reasonText,
|
|
textAlign: TextAlign.center,
|
|
style: const TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
const Text("السبب", style: TextStyle(fontSize: 12)),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _buildDivider(Color start, Color end) {
|
|
return Expanded(child: Center(child: GradientLine(start: start, end: end)));
|
|
}
|
|
}
|
|
|
|
class _StatusItem extends StatelessWidget {
|
|
final Color color;
|
|
final Widget icon;
|
|
final String label;
|
|
|
|
const _StatusItem({
|
|
required this.color,
|
|
required this.icon,
|
|
required this.label,
|
|
});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
StatusCircle(color: color, icon: icon),
|
|
const SizedBox(height: 3),
|
|
Text(
|
|
label,
|
|
textAlign: TextAlign.center,
|
|
style: const TextStyle(fontSize: 12),
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|