From 50edbede2759a5636778c0b526963de88825a994 Mon Sep 17 00:00:00 2001 From: Fazil Date: Thu, 23 Jul 2026 15:26:21 +0000 Subject: [PATCH] Registry module tabs + full option coverage; header language & back; attendance guards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Options Registry: module tabs (All / Projects / Finance / HR / Procurement / Safety / Other) with group counts organise every dropdown group; seeded the missing system-wide groups so each select has a home in the registry — asset_category, asset_condition, weather, change_order_reason, gender, marital_status, employment_type (bilingual, system-locked codes). Header: the language switcher (EN/دری/پښتو) is back in the top bar and a Back button sits next to the hamburger for fullscreen/PWA use; the calendar-lead preference moved to Theme & Appearance as a Fine-tune toggle. Attendance: past days can be recorded, future days cannot — the date picker clamps to today with a warning and the three write endpoints validate before_or_equal:today. --- .../Controllers/HR/AttendanceController.php | 6 +- backend/database/seeders/LookupSeeder.php | 43 +++++++++++++++ frontend/src/i18n/en/index.js | 7 +++ frontend/src/i18n/fa/index.js | 7 +++ frontend/src/layouts/MainLayout.vue | 19 +++++-- frontend/src/pages/hr/AttendancePage.vue | 12 +++- .../src/pages/system/OptionsRegistryPage.vue | 55 ++++++++++++++++++- frontend/src/pages/system/ThemePage.vue | 12 ++++ 8 files changed, 147 insertions(+), 14 deletions(-) diff --git a/backend/app/Http/Controllers/HR/AttendanceController.php b/backend/app/Http/Controllers/HR/AttendanceController.php index a88e82f..4ebdd3e 100644 --- a/backend/app/Http/Controllers/HR/AttendanceController.php +++ b/backend/app/Http/Controllers/HR/AttendanceController.php @@ -79,7 +79,7 @@ public function day(Request $request): JsonResponse public function save(Request $request): JsonResponse { $data = $request->validate([ - 'date' => ['required', 'date'], + 'date' => ['required', 'date', 'before_or_equal:today'], 'rows' => ['required', 'array'], 'rows.*.employee_id' => ['required', 'integer', 'exists:employees,id'], 'rows.*.status' => ['required', 'in:present,absent,leave,holiday'], @@ -107,7 +107,7 @@ public function record(Request $request): JsonResponse { $data = $request->validate([ 'employee_id' => ['required', 'integer', 'exists:employees,id'], - 'date' => ['required', 'date'], + 'date' => ['required', 'date', 'before_or_equal:today'], 'status' => ['required', 'in:present,absent,leave,holiday'], 'note' => ['nullable', 'string'], 'check_in' => ['nullable', 'string', 'max:10'], @@ -136,7 +136,7 @@ public function record(Request $request): JsonResponse public function syncDevice(Request $request): JsonResponse { $data = $request->validate([ - 'date' => ['required', 'date'], + 'date' => ['required', 'date', 'before_or_equal:today'], 'device_id' => ['nullable', 'integer', 'exists:fingerprint_devices,id'], ]); diff --git a/backend/database/seeders/LookupSeeder.php b/backend/database/seeders/LookupSeeder.php index 13fff10..01b9749 100644 --- a/backend/database/seeders/LookupSeeder.php +++ b/backend/database/seeders/LookupSeeder.php @@ -145,6 +145,49 @@ private function groups(): array ['other', 'Other', 'سایر'], ], 'province' => $this->provinces(), + // ── Assets & procurement ── + 'asset_category' => [ + ['heavy_machinery', 'Heavy Machinery', 'ماشین‌آلات سنگین'], + ['vehicles', 'Vehicles', 'وسایط نقلیه'], + ['tools', 'Tools', 'ابزار'], + ['equipment', 'Equipment', 'تجهیزات'], + ], + 'asset_condition' => [ + ['new', 'New', 'نو'], + ['good', 'Good', 'خوب'], + ['fair', 'Fair', 'متوسط'], + ['needs_repair', 'Needs Repair', 'نیاز به ترمیم'], + ], + // ── Site diary ── + 'weather' => [ + ['sunny', 'Sunny', 'آفتابی'], + ['cloudy', 'Cloudy', 'ابری'], + ['rainy', 'Rainy', 'بارانی'], + ['windy', 'Windy', 'بادی'], + ['snow', 'Snow', 'برفی'], + ['hot', 'Hot', 'گرم'], + ['cold', 'Cold', 'سرد'], + ], + 'change_order_reason' => [ + ['owner_request', 'Owner request', 'درخواست مالک'], + ['design_change', 'Design change', 'تغییر دیزاین'], + ['site_condition', 'Site condition', 'وضعیت ساحه'], + ['error', 'Error / omission', 'اشتباه / از قلم‌افتادگی'], + ], + // ── HR ── + 'gender' => [ + ['male', 'Male', 'مرد'], + ['female', 'Female', 'زن'], + ], + 'marital_status' => [ + ['single', 'Single', 'مجرد'], + ['married', 'Married', 'متأهل'], + ], + 'employment_type' => [ + ['permanent', 'Permanent', 'دائمی'], + ['contract', 'Contract', 'قراردادی'], + ['daily_wage', 'Daily Wage', 'روزمزد'], + ], ]; } diff --git a/frontend/src/i18n/en/index.js b/frontend/src/i18n/en/index.js index 728dbe1..8edfc8d 100644 --- a/frontend/src/i18n/en/index.js +++ b/frontend/src/i18n/en/index.js @@ -272,6 +272,13 @@ export default { // Theme DisplayMode: 'Display Mode', Language: 'Language', + AssetCategory: 'Asset Category', + AssetCondition: 'Asset Condition', + ChangeOrderReason: 'Change Order Reason', + CalendarLead: 'Calendar', + Gregorian: 'Gregorian', + SolarHijri: 'Solar (خورشیدی)', + NoFutureAttendance: 'Attendance cannot be recorded for future days', TakeAttendance: 'Take Attendance', AttendanceManagement: 'Attendance Management', Marked: 'Marked', diff --git a/frontend/src/i18n/fa/index.js b/frontend/src/i18n/fa/index.js index 4979973..136301b 100644 --- a/frontend/src/i18n/fa/index.js +++ b/frontend/src/i18n/fa/index.js @@ -272,6 +272,13 @@ export default { // Theme DisplayMode: 'حالت نمایش', Language: 'زبان', + AssetCategory: 'دسته‌بندی اموال', + AssetCondition: 'حالت دارایی', + ChangeOrderReason: 'دلیل تغییر قرارداد', + CalendarLead: 'تقویم', + Gregorian: 'میلادی', + SolarHijri: 'خورشیدی', + NoFutureAttendance: 'حاضری برای روزهای آینده ثبت شده نمی‌تواند', TakeAttendance: 'ثبت حاضری', AttendanceManagement: 'مدیریت حاضری', Marked: 'ثبت‌شده', diff --git a/frontend/src/layouts/MainLayout.vue b/frontend/src/layouts/MainLayout.vue index c4ff7af..de53fa9 100644 --- a/frontend/src/layouts/MainLayout.vue +++ b/frontend/src/layouts/MainLayout.vue @@ -8,6 +8,11 @@ + + + {{ $t('Back') }} + +
- - - - {{ headerDate }} - {{ calendarType === 'fa' ? $t('CalendarShamsiLead') : $t('CalendarGregorianLead') }} - + + + + English + دری + پښتو + + diff --git a/frontend/src/pages/hr/AttendancePage.vue b/frontend/src/pages/hr/AttendancePage.vue index fb99048..8f9f2d1 100644 --- a/frontend/src/pages/hr/AttendancePage.vue +++ b/frontend/src/pages/hr/AttendancePage.vue @@ -240,7 +240,7 @@