From 3e1b64e0084cab6427442edc4d4500f2a43da2fc Mon Sep 17 00:00:00 2001 From: eko54r Date: Mon, 4 May 2026 23:04:09 +0700 Subject: [PATCH] update addon HRM --- .../App/Exports/ExportAttendanceReport.php | 20 + .../App/Exports/ExportLeaveReport.php | 20 + .../App/Exports/ExportPayrollReport.php | 21 + .../HrmAddon/App/Http/Controllers/.gitkeep | 0 .../Controllers/AcnooAttendanceController.php | 168 ++++++ .../AcnooAttendanceReportController.php | 72 +++ ...AcnooAttendanceReportHistoryController.php | 49 ++ .../Controllers/AcnooDepartmentController.php | 97 ++++ .../AcnooDesignationController.php | 101 ++++ .../Controllers/AcnooEmployeeController.php | 201 +++++++ .../Controllers/AcnooHolidayController.php | 107 ++++ .../Http/Controllers/AcnooLeaveController.php | 167 ++++++ .../AcnooLeaveReportController.php | 84 +++ .../AcnooLeaveReportHistoryController.php | 61 +++ .../Controllers/AcnooLeaveTypeController.php | 100 ++++ .../Controllers/AcnooPayrollController.php | 219 ++++++++ .../AcnooPayrollReportController.php | 77 +++ .../AcnooPayrollReportHistoryController.php | 54 ++ .../Http/Controllers/AcnooShiftController.php | 135 +++++ .../Controllers/Api/AttendanceController.php | 176 +++++++ .../Api/AttendanceReportController.php | 66 +++ .../Controllers/Api/DepartmentController.php | 96 ++++ .../Controllers/Api/DesignationController.php | 95 ++++ .../Controllers/Api/EmployeeController.php | 126 +++++ .../Controllers/Api/HolidayController.php | 86 +++ .../Http/Controllers/Api/LeaveController.php | 117 +++++ .../Controllers/Api/LeaveReportController.php | 31 ++ .../Controllers/Api/LeaveTypeController.php | 86 +++ .../Controllers/Api/PayrollController.php | 137 +++++ .../Api/PayrollReportController.php | 30 ++ .../Http/Controllers/Api/ShiftController.php | 150 ++++++ Modules/HrmAddon/App/Models/Attendance.php | 69 +++ Modules/HrmAddon/App/Models/Department.php | 18 + Modules/HrmAddon/App/Models/Designation.php | 21 + Modules/HrmAddon/App/Models/Employee.php | 84 +++ Modules/HrmAddon/App/Models/Holiday.php | 41 ++ Modules/HrmAddon/App/Models/Leave.php | 56 ++ Modules/HrmAddon/App/Models/LeaveType.php | 13 + Modules/HrmAddon/App/Models/Payroll.php | 71 +++ Modules/HrmAddon/App/Models/Shift.php | 21 + Modules/HrmAddon/App/Providers/.gitkeep | 0 .../App/Providers/HrmAddonServiceProvider.php | 111 ++++ .../App/Providers/RouteServiceProvider.php | 59 +++ Modules/HrmAddon/Database/Seeders/.gitkeep | 0 .../Seeders/HrmAddonDatabaseSeeder.php | 16 + ..._05_12_094745_create_departments_table.php | 31 ++ ...05_12_130921_create_designations_table.php | 31 ++ .../2025_05_12_152226_create_shifts_table.php | 36 ++ ...25_05_13_102231_create_employees_table.php | 41 ++ ..._05_13_152009_create_leave_types_table.php | 31 ++ .../2025_05_14_090651_create_leaves_table.php | 37 ++ ...025_05_14_124928_create_holidays_table.php | 32 ++ ..._05_14_162716_create_attendances_table.php | 36 ++ ...025_05_15_105035_create_payrolls_table.php | 36 ++ ...05036_add_new_fields_to_multiple_table.php | 30 ++ Modules/HrmAddon/composer.json | 31 ++ Modules/HrmAddon/config/.gitkeep | 0 Modules/HrmAddon/config/config.php | 5 + Modules/HrmAddon/module.json | 10 + Modules/HrmAddon/package.json | 15 + Modules/HrmAddon/resources/assets/js/app.js | 0 .../HrmAddon/resources/assets/sass/app.scss | 0 Modules/HrmAddon/resources/views/.gitkeep | 0 .../views/attendances/create.blade.php | 71 +++ .../views/attendances/datas.blade.php | 79 +++ .../views/attendances/edit.blade.php | 69 +++ .../views/attendances/index.blade.php | 94 ++++ .../views/component/delete-modal.blade.php | 22 + .../views/department/create.blade.php | 36 ++ .../views/department/datas.blade.php | 74 +++ .../resources/views/department/edit.blade.php | 37 ++ .../views/department/index.blade.php | 66 +++ .../views/designations/create.blade.php | 36 ++ .../views/designations/datas.blade.php | 75 +++ .../views/designations/edit.blade.php | 37 ++ .../views/designations/index.blade.php | 66 +++ .../bulk-upload/employees-import.blade.php | 152 ++++++ .../views/employees/create.blade.php | 160 ++++++ .../resources/views/employees/datas.blade.php | 110 ++++ .../resources/views/employees/edit.blade.php | 150 ++++++ .../resources/views/employees/index.blade.php | 84 +++ .../resources/views/employees/view.blade.php | 81 +++ .../resources/views/holidays/create.blade.php | 48 ++ .../resources/views/holidays/datas.blade.php | 77 +++ .../resources/views/holidays/edit.blade.php | 50 ++ .../resources/views/holidays/index.blade.php | 80 +++ .../views/leave-types/create.blade.php | 37 ++ .../views/leave-types/datas.blade.php | 74 +++ .../views/leave-types/edit.blade.php | 37 ++ .../views/leave-types/index.blade.php | 64 +++ .../resources/views/leaves/create.blade.php | 103 ++++ .../resources/views/leaves/datas.blade.php | 100 ++++ .../resources/views/leaves/edit.blade.php | 106 ++++ .../resources/views/leaves/index.blade.php | 107 ++++ .../resources/views/payrolls/create.blade.php | 99 ++++ .../resources/views/payrolls/datas.blade.php | 88 ++++ .../resources/views/payrolls/edit.blade.php | 97 ++++ .../resources/views/payrolls/index.blade.php | 107 ++++ .../views/reports/attendances/datas.blade.php | 34 ++ .../views/reports/attendances/excel.blade.php | 28 + .../views/reports/attendances/index.blade.php | 106 ++++ .../views/reports/attendances/pdf.blade.php | 50 ++ .../views/reports/leaves/datas.blade.php | 47 ++ .../views/reports/leaves/excel.blade.php | 42 ++ .../views/reports/leaves/index.blade.php | 106 ++++ .../views/reports/leaves/pdf.blade.php | 60 +++ .../views/reports/payrolls/datas.blade.php | 53 ++ .../views/reports/payrolls/excel.blade.php | 48 ++ .../views/reports/payrolls/index.blade.php | 104 ++++ .../views/reports/payrolls/pdf.blade.php | 65 +++ .../resources/views/shifts/create.blade.php | 68 +++ .../resources/views/shifts/datas.blade.php | 85 +++ .../resources/views/shifts/edit.blade.php | 69 +++ .../resources/views/shifts/index.blade.php | 64 +++ Modules/HrmAddon/routes/.gitkeep | 0 Modules/HrmAddon/routes/api.php | 22 + Modules/HrmAddon/routes/web.php | 76 +++ Modules/HrmAddon/vite.config.js | 21 + .../Controllers/Admin/AddonController.php | 3 +- app/Traits/ImageUrlTrait.php | 49 ++ docker_vendor_issue_analysis.txt | 47 ++ modules_statuses.json | 3 +- public/uploads/26/05/1777910268-364.png | Bin 0 -> 18802 bytes vendor/autoload.php | 5 +- vendor/composer/autoload_classmap.php | 43 ++ vendor/composer/autoload_psr4.php | 4 +- vendor/composer/autoload_real.php | 2 + vendor/composer/autoload_static.php | 491 ++++++++++-------- vendor/composer/platform_check.php | 5 +- .../src/Controllers/PermissionsController.php | 35 +- .../src/Helpers/UserTechGuard.php | 32 +- 131 files changed, 8281 insertions(+), 290 deletions(-) create mode 100644 Modules/HrmAddon/App/Exports/ExportAttendanceReport.php create mode 100644 Modules/HrmAddon/App/Exports/ExportLeaveReport.php create mode 100644 Modules/HrmAddon/App/Exports/ExportPayrollReport.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/.gitkeep create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportHistoryController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooDepartmentController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooDesignationController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooEmployeeController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooHolidayController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooLeaveController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportHistoryController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooLeaveTypeController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportHistoryController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/AcnooShiftController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/AttendanceController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/AttendanceReportController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/DepartmentController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/DesignationController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/EmployeeController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/HolidayController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/LeaveController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/LeaveReportController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/LeaveTypeController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/PayrollController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/PayrollReportController.php create mode 100644 Modules/HrmAddon/App/Http/Controllers/Api/ShiftController.php create mode 100644 Modules/HrmAddon/App/Models/Attendance.php create mode 100644 Modules/HrmAddon/App/Models/Department.php create mode 100644 Modules/HrmAddon/App/Models/Designation.php create mode 100644 Modules/HrmAddon/App/Models/Employee.php create mode 100644 Modules/HrmAddon/App/Models/Holiday.php create mode 100644 Modules/HrmAddon/App/Models/Leave.php create mode 100644 Modules/HrmAddon/App/Models/LeaveType.php create mode 100644 Modules/HrmAddon/App/Models/Payroll.php create mode 100644 Modules/HrmAddon/App/Models/Shift.php create mode 100644 Modules/HrmAddon/App/Providers/.gitkeep create mode 100644 Modules/HrmAddon/App/Providers/HrmAddonServiceProvider.php create mode 100644 Modules/HrmAddon/App/Providers/RouteServiceProvider.php create mode 100644 Modules/HrmAddon/Database/Seeders/.gitkeep create mode 100644 Modules/HrmAddon/Database/Seeders/HrmAddonDatabaseSeeder.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_12_094745_create_departments_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_12_130921_create_designations_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_12_152226_create_shifts_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_13_102231_create_employees_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_13_152009_create_leave_types_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_14_090651_create_leaves_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_14_124928_create_holidays_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_14_162716_create_attendances_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_05_15_105035_create_payrolls_table.php create mode 100644 Modules/HrmAddon/Database/migrations/2025_08_19_105036_add_new_fields_to_multiple_table.php create mode 100644 Modules/HrmAddon/composer.json create mode 100644 Modules/HrmAddon/config/.gitkeep create mode 100644 Modules/HrmAddon/config/config.php create mode 100644 Modules/HrmAddon/module.json create mode 100644 Modules/HrmAddon/package.json create mode 100644 Modules/HrmAddon/resources/assets/js/app.js create mode 100644 Modules/HrmAddon/resources/assets/sass/app.scss create mode 100644 Modules/HrmAddon/resources/views/.gitkeep create mode 100644 Modules/HrmAddon/resources/views/attendances/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/attendances/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/attendances/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/attendances/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/component/delete-modal.blade.php create mode 100644 Modules/HrmAddon/resources/views/department/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/department/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/department/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/department/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/designations/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/designations/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/designations/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/designations/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/employees/bulk-upload/employees-import.blade.php create mode 100644 Modules/HrmAddon/resources/views/employees/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/employees/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/employees/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/employees/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/employees/view.blade.php create mode 100644 Modules/HrmAddon/resources/views/holidays/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/holidays/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/holidays/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/holidays/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/leave-types/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/leave-types/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/leave-types/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/leave-types/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/leaves/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/leaves/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/leaves/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/leaves/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/payrolls/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/payrolls/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/payrolls/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/payrolls/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/attendances/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/attendances/excel.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/attendances/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/attendances/pdf.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/leaves/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/leaves/excel.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/leaves/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/leaves/pdf.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/payrolls/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/payrolls/excel.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/payrolls/index.blade.php create mode 100644 Modules/HrmAddon/resources/views/reports/payrolls/pdf.blade.php create mode 100644 Modules/HrmAddon/resources/views/shifts/create.blade.php create mode 100644 Modules/HrmAddon/resources/views/shifts/datas.blade.php create mode 100644 Modules/HrmAddon/resources/views/shifts/edit.blade.php create mode 100644 Modules/HrmAddon/resources/views/shifts/index.blade.php create mode 100644 Modules/HrmAddon/routes/.gitkeep create mode 100644 Modules/HrmAddon/routes/api.php create mode 100644 Modules/HrmAddon/routes/web.php create mode 100644 Modules/HrmAddon/vite.config.js create mode 100644 app/Traits/ImageUrlTrait.php create mode 100644 docker_vendor_issue_analysis.txt create mode 100644 public/uploads/26/05/1777910268-364.png diff --git a/Modules/HrmAddon/App/Exports/ExportAttendanceReport.php b/Modules/HrmAddon/App/Exports/ExportAttendanceReport.php new file mode 100644 index 00000000..df22df48 --- /dev/null +++ b/Modules/HrmAddon/App/Exports/ExportAttendanceReport.php @@ -0,0 +1,20 @@ +where('business_id', auth()->user()->business_id) + ->latest() + ->get(); + + return view('hrmaddon::reports.attendances.excel', compact('attendances')); + } +} diff --git a/Modules/HrmAddon/App/Exports/ExportLeaveReport.php b/Modules/HrmAddon/App/Exports/ExportLeaveReport.php new file mode 100644 index 00000000..32d50c22 --- /dev/null +++ b/Modules/HrmAddon/App/Exports/ExportLeaveReport.php @@ -0,0 +1,20 @@ +where('business_id', auth()->user()->business_id) + ->latest() + ->get(); + + return view('hrmaddon::reports.leaves.excel', compact('leaves')); + } +} diff --git a/Modules/HrmAddon/App/Exports/ExportPayrollReport.php b/Modules/HrmAddon/App/Exports/ExportPayrollReport.php new file mode 100644 index 00000000..25494e4f --- /dev/null +++ b/Modules/HrmAddon/App/Exports/ExportPayrollReport.php @@ -0,0 +1,21 @@ +where('business_id', auth()->user()->business_id) + ->latest() + ->get(); + + return view('hrmaddon::reports.payrolls.excel', compact('payrolls')); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/.gitkeep b/Modules/HrmAddon/App/Http/Controllers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceController.php new file mode 100644 index 00000000..976fa2e4 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceController.php @@ -0,0 +1,168 @@ +middleware('check.permission:attendances.read')->only(['index']); + $this->middleware('check.permission:attendances.create')->only(['store']); + $this->middleware('check.permission:attendances.update')->only(['update']); + $this->middleware('check.permission:attendances.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + + $attendances = Attendance::with(['employee:id,name', 'shift:id,name']) + ->where('business_id', auth()->user()->business_id) + + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->whereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('shift', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }) + + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::attendances.datas', compact('attendances'))->render() + ]); + } + + return view('hrmaddon::attendances.index', compact('attendances', 'employees')); + } + + public function store(Request $request) + { + $request->validate([ + 'employee_id' => 'required|integer|exists:employees,id', + 'shift_id' => 'required|integer|exists:shifts,id', + 'date' => 'required|date', + 'time_in' => 'required|date_format:H:i', + 'time_out' => 'required|date_format:H:i', + 'duration' => 'nullable|date_format:H:i', + 'note' => 'nullable|string', + ]); + + $business = Business::findOrFail(auth()->user()->business_id); + $employee = Employee::findOrFail($request->employee_id); + + $timeIn = Carbon::parse($request->time_in); + $timeOut = Carbon::parse($request->time_out); + + $durationInMinutes = $timeOut->diffInMinutes($timeIn); + $hours = floor($durationInMinutes / 60); + $minutes = $durationInMinutes % 60; + $formattedDuration = sprintf('%02d:%02d', $hours, $minutes); + $month = strtolower(Carbon::parse($request->date)->format('F')); + + $attendance = Attendance::create($request->except(['business_id', 'duration', 'month']) + [ + 'business_id' => $business->id, + 'duration' => $formattedDuration, + 'month' => $month, + ]); + + if (moduleCheck('MarketingAddon')) { + $this->attendanceMessage($business, $attendance, $employee); + } + + return response()->json([ + 'message' => __('Attendance created successfully'), + 'redirect' => route('hrm.attendances.index') + ]); + } + + public function update(Request $request, $id) + { + $request->validate([ + 'employee_id' => 'required|integer|exists:employees,id', + 'shift_id' => 'required|integer|exists:shifts,id', + 'date' => 'required|date', + 'time_in' => 'required', + 'time_out' => 'required', + 'duration' => 'nullable', + 'note' => 'nullable|string', + ]); + + $attendance = Attendance::findOrFail($id); + + $timeIn = Carbon::parse($request->time_in); + $timeOut = Carbon::parse($request->time_out); + + $durationInMinutes = $timeOut->diffInMinutes($timeIn); + $hours = floor($durationInMinutes / 60); + $minutes = $durationInMinutes % 60; + $formattedDuration = sprintf('%02d:%02d', $hours, $minutes); + $month = strtolower(Carbon::parse($request->date)->format('F')); + + $attendance->update($request->except(['business_id', 'duration', 'month']) + [ + 'business_id' => auth()->user()->business_id, + 'duration' => $formattedDuration, + 'month' => $month, + ]); + + return response()->json([ + 'message' => __('Attendance Updated successfully'), + 'redirect' => route('hrm.attendances.index') + ]); + } + + public function destroy($id) + { + $attendance = Attendance::findOrFail($id); + $attendance->delete(); + return response()->json([ + 'message' => __('Attendance Deleted Successfully'), + 'redirect' => route('hrm.attendances.index') + ]); + } + + public function deleteAll(Request $request) + { + Attendance::whereIn('id', $request->input('ids'))->delete(); + + return response()->json([ + 'message' => __('All Attendances deleted successfully'), + 'redirect' => route('hrm.attendances.index') + ]); + } + + public function getShift() + { + $employee = Employee::findOrFail(request('employee_id')); + $shift = Shift::findOrFail($employee->shift_id); + + return response()->json([ + 'data' => [ + 'id' => $shift->id, + 'name' => $shift->name + ] + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportController.php new file mode 100644 index 00000000..a901d962 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportController.php @@ -0,0 +1,72 @@ +middleware('check.permission:attendance-reports.read')->only(['index']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + $attendances = Attendance::with(['employee:id,name', 'shift:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->whereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('shift', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::reports.attendances.datas', compact('attendances'))->render() + ]); + } + + return view('hrmaddon::reports.attendances.index', compact('attendances', 'employees')); + } + + public function exportExcel() + { + return Excel::download(new ExportAttendanceReport, 'attendance-report.xlsx'); + } + + public function exportCsv() + { + return Excel::download(new ExportAttendanceReport, 'attendance-report.csv'); + } + + public function exportPdf(Request $request) + { + $attendances = Attendance::with(['employee:id,name', 'shift:id,name']) + ->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); + + return PdfService::render('hrmaddon::reports.attendances.pdf', compact('attendances'),'attendance-report.pdf'); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportHistoryController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportHistoryController.php new file mode 100644 index 00000000..780cb71a --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportHistoryController.php @@ -0,0 +1,49 @@ +middleware('check.permission:attendance-reports.read')->only(['index']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + $attendances = Attendance::with(['employee:id,name', 'shift:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->whereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('shift', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::reports.attendances.datas', compact('attendances'))->render() + ]); + } + + return view('hrmaddon::reports.attendances.index', compact('attendances', 'employees')); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooDepartmentController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooDepartmentController.php new file mode 100644 index 00000000..e1d07e3c --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooDepartmentController.php @@ -0,0 +1,97 @@ +middleware('check.permission:dashboard.read')->only(['index']); + $this->middleware('check.permission:deparment.create')->only(['store']); + $this->middleware('check.permission:department.update')->only(['update', 'status']); + $this->middleware('check.permission:department.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $departments = Department::where('business_id', auth()->user()->business_id) + ->when(request('search'), function($q) use($request) { + $q->where(function($q) use($request) { + $q->where('name', 'like', '%'.$request->search.'%') + ->orWhere('description', 'like', '%'.$request->search.'%'); + }); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if($request->ajax()){ + return response()->json([ + 'data' => view('hrmaddon::department.datas',compact('departments'))->render() + ]); + } + return view('hrmaddon::department.index', compact('departments')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + ]); + + Department::create($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id, + ]); + + return response()->json([ + 'message' => __('Department created cuccessfully'), + 'redirect' => route('hrm.department.index'), + ]); + } + + public function update(Request $request, $id) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + ]); + + Department::where('id', $id)->update($request->except(['_token', '_method'])); + + return response()->json([ + 'message' => __('Department updated successfully'), + 'redirect' => route('hrm.department.index'), + ]); + } + + public function destroy($id) + { + Department::where('id', $id)->delete(); + + return response()->json([ + 'message' => __('Department deleted successfully'), + 'redirect' => route('hrm.department.index') + ]); + } + + public function status(Request $request, $id) + { + $department = Department::findOrFail($id); + $department->update(['status' => $request->status]); + return response()->json(['message' => __('Department')]); + } + + public function deleteAll(Request $request) + { + Department::whereIn('id', $request->input('ids'))->delete(); + + return response()->json([ + 'message' => __('Selected Departments deleted successfully'), + 'redirect' => route('hrm.department.index') + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooDesignationController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooDesignationController.php new file mode 100644 index 00000000..819befc1 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooDesignationController.php @@ -0,0 +1,101 @@ +middleware('check.permission:designations.read')->only(['index']); + $this->middleware('check.permission:designations.create')->only(['store']); + $this->middleware('check.permission:designations.update')->only(['update', 'status']); + $this->middleware('check.permission:designations.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $designations = Designation::where('business_id', auth()->user()->business_id) + ->when(request('search'), function($q) use($request) { + $q->where(function($q) use($request) { + $q->where('name', 'like', '%'.$request->search.'%') + ->orWhere('description', 'like', '%'.$request->search.'%'); + }); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if($request->ajax()){ + return response()->json([ + 'data' => view('hrmaddon::designations.datas',compact('designations'))->render() + ]); + } + return view('hrmaddon::designations.index', compact('designations')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + ]); + + Designation::create($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id, + ]); + + return response()->json([ + 'message' => __('Designation created cuccessfully'), + 'redirect' => route('hrm.designations.index'), + ]); + } + + public function update(Request $request, $id) + { + $designation = Designation::findOrFail($id); + + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + ]); + + $designation->update($request->all()); + + return response()->json([ + 'message' => __('Designation updated successfully'), + 'redirect' => route('hrm.designations.index'), + ]); + } + + public function destroy($id) + { + $designation = Designation::findOrFail($id); + + $designation->delete(); + + return response()->json([ + 'message' => __('Designation deleted successfully'), + 'redirect' => route('hrm.designations.index') + ]); + } + + public function status(Request $request, $id) + { + $designation = Designation::findOrFail($id); + $designation->update(['status' => $request->status]); + return response()->json(['message' => __('Designation')]); + } + + public function deleteAll(Request $request) + { + Designation::whereIn('id', $request->input('ids'))->delete(); + + return response()->json([ + 'message' => __('Selected Designations deleted successfully'), + 'redirect' => route('hrm.designations.index') + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooEmployeeController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooEmployeeController.php new file mode 100644 index 00000000..3e97817e --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooEmployeeController.php @@ -0,0 +1,201 @@ +middleware('check.permission:employees.read')->only(['index']); + $this->middleware('check.permission:employees.create')->only(['create', 'store']); + $this->middleware('check.permission:employees.update')->only(['edit', 'update']); + $this->middleware('check.permission:employees.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $branches = Branch::withTrashed()->where('business_id', auth()->user()->business_id)->latest()->get(); + + $employees = Employee::with('department', 'designation', 'shift', 'branch:id,name') + ->where('business_id', auth()->user()->business_id) + ->when(request('search'), function ($q) { + $q->where('phone', 'like', '%' . request('search') . '%') + ->orWhere('amount', 'like', '%' . request('search') . '%') + ->orWhere('name', 'like', '%' . request('search') . '%'); + $q->orwhereHas('department', function ($d) { + $d->where('name', 'like', '%' . request('search') . '%'); + }); + $q->orwhereHas('designation', function ($r) { + $r->where('name', 'like', '%' . request('search') . '%'); + }); + $q->orwhereHas('shift', function ($s) { + $s->where('name', 'like', '%' . request('search') . '%'); + }); + $q->orwhereHas('branch', function ($r) { + $r->where('name', 'like', '%' . request('search') . '%'); + }); + }) + ->when($request->branch_id, function ($q) use ($request) { + $q->where('branch_id', $request->branch_id); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::employees.datas', compact('employees', 'branches'))->render() + ]); + } + + return view('hrmaddon::employees.index', compact('employees', 'branches')); + } + + public function create() + { + $designations = Designation::where('business_id', auth()->user()->business_id)->where('status', 1)->get(); + $departments = Department::where('business_id', auth()->user()->business_id)->where('status', 1)->get(); + $shifts = Shift::where('business_id', auth()->user()->business_id)->where('status', 1)->get(); + + return view('hrmaddon::employees.create', compact('designations', 'departments', 'shifts')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'designation_id' => 'required|exists:designations,id', + 'department_id' => 'required|exists:departments,id', + 'shift_id' => 'required|exists:shifts,id', + 'amount' => 'numeric|required', + 'phone' => 'required|string|max:20', + 'email' => 'nullable|email|max:255', + 'gender' => 'required|in:male,female,others', + 'country' => 'nullable|string|max:100', + 'birth_date' => 'nullable|date', + 'join_date' => 'nullable|date', + 'image' => 'nullable|image|mimes:jpg,png,jpeg,svg', + 'status' => 'required|in:active,terminated,suspended', + ]); + + Employee::create($request->except('business_id', 'image') + [ + 'business_id' => auth()->user()->business_id, + 'image' => $request->image ? $this->upload($request, 'image') : NULL + ]); + + return response()->json([ + 'message' => __('Employee created Successfully'), + 'redirect' => route('hrm.employees.index') + ]); + } + + + public function edit(string $id) + { + $employee = Employee::findOrFail($id); + $designations = Designation::where('business_id', auth()->user()->business_id)->where('status', 1)->get(); + $departments = Department::where('business_id', auth()->user()->business_id)->where('status', 1)->get(); + $shifts = Shift::where('business_id', auth()->user()->business_id)->where('status', 1)->get(); + + return view('hrmaddon::employees.edit', compact('employee', 'designations', 'departments', 'shifts')); + } + + public function update(Request $request, string $id) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'designation_id' => 'required|exists:designations,id', + 'department_id' => 'required|exists:departments,id', + 'shift_id' => 'required|exists:shifts,id', + 'amount' => 'numeric|required', + 'phone' => 'required|string|max:20', + 'email' => 'nullable|email|max:255', + 'gender' => 'required|in:male,female,others', + 'country' => 'nullable|string|max:100', + 'birth_date' => 'nullable|date', + 'join_date' => 'nullable|date', + 'image' => 'nullable|image|mimes:jpg,png,jpeg,svg', + 'status' => 'required|in:active,terminated,suspended', + ]); + + $employee = Employee::findOrFail($id); + + $employee->update($request->except('business_id', 'image') + [ + 'business_id' => auth()->user()->business_id, + 'image' => $request->image ? $this->upload($request, 'image', $employee->image) : $employee->image + ]); + + return response()->json([ + 'message' => __('Employee updated Successfully'), + 'redirect' => route('hrm.employees.index') + ]); + } + + public function destroy(string $id) + { + $employee = Employee::findOrFail($id); + if (file_exists($employee->image)) { + Storage::delete($employee->image); + } + $employee->delete(); + + return response()->json([ + 'message' => __('Employee deleted successfully'), + 'redirect' => route('hrm.employees.index') + ]); + } + + public function deleteAll(Request $request) + { + $employees = Employee::whereIn('id', $request->ids)->get(); + + foreach ($employees as $employee) { + if (file_exists($employee->image)) { + Storage::delete($employee->image); + } + } + Employee::whereIn('id', $request->ids)->delete(); + return response()->json([ + 'message' => __('Selected employees deleted successfully'), + 'redirect' => route('hrm.employees.index') + ]); + } + + public function bulkStore(Request $request) + { + $request->validate([ + 'file' => 'required|file|mimes:xlsx,xls,csv' + ]); + + $businessId = auth()->user()->business_id; + $import = new EmployeeImport($businessId); + + try { + Excel::import($import, $request->file('file')); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => $e->getMessage(), + ], 422); + } + + return response()->json([ + 'success' => true, + 'message' => __('Bulk upload successfully.'), + 'redirect' => route('hrm.employees.index') + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooHolidayController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooHolidayController.php new file mode 100644 index 00000000..0ef67e8a --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooHolidayController.php @@ -0,0 +1,107 @@ +middleware('check.permission:holidays.read')->only(['index']); + $this->middleware('check.permission:holidays.create')->only(['store']); + $this->middleware('check.permission:holidays.update')->only(['update']); + $this->middleware('check.permission:holidays.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $branches = Branch::withTrashed()->where('business_id', auth()->user()->business_id)->latest()->get(); + + $holidays = Holiday::with('branch:id,name') + ->where('business_id', auth()->user()->business_id) + ->when($request->branch_id, function ($q) use ($request) { + $q->where('branch_id', $request->branch_id); + }) + ->when($request->search, function ($q) use ($request) { + $search = $request->search; + $q->where(function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%') + ->orWhere('description', 'like', '%' . $search . '%') + ->orWhereHas('branch', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::holidays.datas', compact('holidays'))->render() + ]); + } + + return view('hrmaddon::holidays.index', compact('holidays', 'branches')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', + 'description' => 'nullable|string', + ]); + + Holiday::create($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => __('Holiday created successfully'), + 'redirect' => route('hrm.holidays.index') + ]); + } + + public function update(Request $request, Holiday $holiday) + { + $request->validate([ + 'name' => 'nullable|string|max:255', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', + 'description' => 'nullable|string', + ]); + + $holiday->update($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => __('Holiday updated successfully'), + 'redirect' => route('hrm.holidays.index') + ]); + } + + public function destroy(Holiday $holiday) + { + $holiday->delete(); + return response()->json([ + 'message' => __('Holidays Deleted Successfully'), + 'redirect' => route('hrm.holidays.index') + ]); + } + + public function deleteAll(Request $request) + { + Holiday::whereIn('id', $request->ids)->delete(); + return response()->json([ + 'message' => __('All Holiday deleted successfully.'), + 'redirect' => route('hrm.holidays.index') + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveController.php new file mode 100644 index 00000000..a1902504 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveController.php @@ -0,0 +1,167 @@ +middleware('check.permission:leaves.read')->only(['index']); + $this->middleware('check.permission:leaves.create')->only(['store']); + $this->middleware('check.permission:leaves.update')->only(['update', 'status']); + $this->middleware('check.permission:leaves.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->latest()->get(); + $departments = Department::where('business_id', auth()->user()->business_id)->whereStatus(1)->latest()->get(); + $leave_types = LeaveType::where('business_id', auth()->user()->business_id)->whereStatus(1)->latest()->get(); + + $leaves = Leave::with(['employee:id,name', 'branch:id,name', 'leave_type:id,name', 'department:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->branch_id, function ($q) use ($request) { + $q->where('branch_id', $request->branch_id); + }) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->where(function ($query) use ($search) { + $query->where('description', 'like', '%' . $search . '%') + ->orWhere('start_date', 'like', '%' . $search . '%') + ->orWhere('end_date', 'like', '%' . $search . '%') + ->orWhere('leave_duration', 'like', '%' . $search . '%') + ->orWhere('month', 'like', '%' . $search . '%') + ->orWhere('status', 'like', '%' . $search . '%') + ->orWhereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('department', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('branch', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('leave_type', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::leaves.datas', compact('leaves'))->render() + ]); + } + + $branches = Branch::withTrashed()->where('business_id', auth()->user()->business_id)->latest()->get(); + + return view('hrmaddon::leaves.index', compact('leaves', 'employees', 'departments', 'leave_types', 'branches')); + } + + public function store(Request $request) + { + $request->validate([ + 'employee_id' => 'required|exists:employees,id', + 'department_id' => 'required|exists:departments,id', + 'leave_type_id' => 'required|exists:leave_types,id', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', + 'leave_duration' => 'required|numeric|min:0.5', + 'month' => 'required|string', + 'status' => 'required|in:pending,approved,rejected', + 'description' => 'nullable|string', + ]); + + Leave::create($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id, + ]); + + return response()->json([ + 'message' => __('Leave created successfully'), + 'redirect' => route('hrm.leaves.index') + ]); + } + + public function update(Request $request, $id) + { + $request->validate([ + 'employee_id' => 'required|exists:employees,id', + 'department_id' => 'required|exists:departments,id', + 'leave_type_id' => 'required|exists:leave_types,id', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', + 'leave_duration' => 'required|numeric|min:0.5', + 'month' => 'required|string', + 'status' => 'required|in:pending,approved,rejected', + 'description' => 'nullable|string', + ]); + + $leave = Leave::findOrFail($id); + + $leave->update($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id, + ]); + + return response()->json([ + 'message' => __('Leave Updated successfully'), + 'redirect' => route('hrm.leaves.index') + ]); + } + + public function destroy($id) + { + $leave = Leave::findOrFail($id); + $leave->delete(); + return response()->json([ + 'message' => __('Leave Deleted Successfully'), + 'redirect' => route('hrm.leaves.index') + ]); + } + + public function deleteAll(Request $request) + { + Leave::whereIn('id', $request->input('ids'))->delete(); + + return response()->json([ + 'message' => __('All Leaves deleted successfully'), + 'redirect' => route('hrm.leaves.index') + ]); + } + + public function status(Request $request, $id) + { + $order = Leave::findOrFail($id); + $order->update(['status' => $request->status]); + return response()->json(['message' => 'Leave']); + } + + public function getDepartment() + { + $employee = Employee::findOrFail(request('employee_id')); + $department = Department::findOrFail($employee->department_id); + + return response()->json([ + 'data' => [ + 'id' => $department->id, + 'name' => $department->name + ] + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportController.php new file mode 100644 index 00000000..3a142a96 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportController.php @@ -0,0 +1,84 @@ +middleware('check.permission:leave-reports.read')->only(['index']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + + $leaves = Leave::with(['employee:id,name', 'leave_type:id,name', 'department:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->where(function ($query) use ($search) { + $query->where('description', 'like', '%' . $search . '%') + ->orWhere('start_date', 'like', '%' . $search . '%') + ->orWhere('end_date', 'like', '%' . $search . '%') + ->orWhere('leave_duration', 'like', '%' . $search . '%') + ->orWhere('month', 'like', '%' . $search . '%') + ->orWhere('status', 'like', '%' . $search . '%') + ->orWhereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('department', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('leave_type', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::reports.leaves.datas', compact('leaves'))->render() + ]); + } + + return view('hrmaddon::reports.leaves.index', compact('leaves', 'employees')); + } + + public function exportExcel() + { + return Excel::download(new ExportLeaveReport, 'leave-report.xlsx'); + } + + public function exportCsv() + { + return Excel::download(new ExportLeaveReport, 'leave-report.csv'); + } + + public function exportPdf(Request $request) + { + $leaves = Leave::with(['employee:id,name', 'leave_type:id,name', 'department:id,name']) + ->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); + + return PdfService::render('hrmaddon::reports.leaves.pdf', compact('leaves'),'leave-report.pdf'); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportHistoryController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportHistoryController.php new file mode 100644 index 00000000..8811bb68 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportHistoryController.php @@ -0,0 +1,61 @@ +middleware('check.permission:leave-reports.read')->only(['index']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + + $leaves = Leave::with(['employee:id,name', 'leave_type:id,name', 'department:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->where(function ($query) use ($search) { + $query->where('description', 'like', '%' . $search . '%') + ->orWhere('start_date', 'like', '%' . $search . '%') + ->orWhere('end_date', 'like', '%' . $search . '%') + ->orWhere('leave_duration', 'like', '%' . $search . '%') + ->orWhere('month', 'like', '%' . $search . '%') + ->orWhere('status', 'like', '%' . $search . '%') + ->orWhereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('department', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('leave_type', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::reports.leaves.datas', compact('leaves'))->render() + ]); + } + + return view('hrmaddon::reports.leaves.index', compact('leaves', 'employees')); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveTypeController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveTypeController.php new file mode 100644 index 00000000..de900b8a --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveTypeController.php @@ -0,0 +1,100 @@ +middleware('check.permission:leave-types.read')->only(['index']); + $this->middleware('check.permission:leave-types.create')->only(['store']); + $this->middleware('check.permission:leave-types.update')->only(['update', 'status']); + $this->middleware('check.permission:leave-types.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $leave_types = LeaveType::where('business_id', auth()->user()->business_id) + ->when(request('search'), function($q) use($request) { + $q->where(function($q) use($request) { + $q->where('name', 'like', '%'.$request->search.'%') + ->orWhere('description', 'like', '%'.$request->search.'%'); + }); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if($request->ajax()){ + return response()->json([ + 'data' => view('hrmaddon::leave-types.datas',compact('leave_types'))->render() + ]); + } + return view('hrmaddon::leave-types.index',compact('leave_types')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + ]); + + LeaveType::create($request->except('business_id') +[ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => 'Leave Type created cuccessfully.', + 'redirect' => route('hrm.leave-types.index'), + ]); + } + + public function update(Request $request, LeaveType $leaveType) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + ]); + + $leaveType->update($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => 'Leave Type updated successfully.', + 'redirect' => route('hrm.leave-types.index'), + ]); + } + + public function destroy(LeaveType $leaveType) + { + $leaveType->delete(); + + return response()->json([ + 'message' => 'Leave Type deleted successfully', + 'redirect' => route('hrm.leave-types.index') + ]); + } + + public function status(Request $request, $id) + { + $leaveType = LeaveType::findOrFail($id); + $leaveType->update(['status' => $request->status]); + return response()->json(['message' => 'Leave Type']); + } + + public function deleteAll(Request $request) + { + $leave_type = LeaveType::whereIn('id', $request->input('ids')); + $leave_type->delete(); + + return response()->json([ + 'message' => __('All Leave Types deleted successfully.'), + 'redirect' => route('hrm.leave-types.index') + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php new file mode 100644 index 00000000..f587fa4f --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php @@ -0,0 +1,219 @@ +middleware('check.permission:payrolls.read')->only(['index']); + $this->middleware('check.permission:payrolls.create')->only(['store']); + $this->middleware('check.permission:payrolls.update')->only(['update']); + $this->middleware('check.permission:payrolls.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + $payment_types = PaymentType::where('business_id', auth()->user()->business_id)->whereStatus(1)->latest()->get(); + + $payrolls = Payroll::with(['employee:id,name', 'payment_type:id,name', 'branch:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->branch_id, function ($q) use ($request) { + $q->where('branch_id', $request->branch_id); + }) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->where(function ($query) use ($search) { + $query->where('puid', 'like', '%' . $search . '%') + ->orWhere('amount', 'like', '%' . $search . '%') + ->orWhereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('branch', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('payment_type', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::payrolls.datas', compact('payrolls'))->render() + ]); + } + + $branches = Branch::withTrashed()->where('business_id', auth()->user()->business_id)->latest()->get(); + + return view('hrmaddon::payrolls.index', compact('payrolls', 'employees', 'payment_types', 'branches')); + } + + public function store(Request $request) + { + $request->validate([ + 'employee_id' => 'required|integer|exists:employees,id', + 'payment_type_id' => 'required', + 'month' => 'required|string', + 'date' => 'nullable|date', + 'amount' => 'required|numeric', + 'note' => 'nullable|string', + 'payemnt_year' => 'required|string', + ]); + + DB::beginTransaction(); + try { + + $exists = Payroll::where('employee_id', $request->employee_id) + ->where('month', $request->month) + ->where('payemnt_year', $request->payemnt_year) + ->where('business_id', auth()->user()->business_id) + ->exists(); + + if ($exists) { + return response()->json([ + 'message' => __('This employee has already been paid for this month and year.'), + ], 422); + } + + updateBalance($request->amount, 'decrement'); + + $payroll = Payroll::create($request->except('business_id', 'payment_type_id') + [ + 'business_id' => auth()->user()->business_id, + 'payment_type_id' => $request->payment_type_id != 'cash' ? $request->payment_type_id : NULL, + ]); + + $payments = [['amount' => $request->amount, 'type' => $request->payment_type_id]]; + + + // MultiPaymentProcessed Event + event(new MultiPaymentProcessed( + $payments, + $payroll->id, + 'payroll', + $total_amount ?? 0, + )); + + DB::commit(); + + return response()->json([ + 'message' => __('Payroll created successfully'), + 'redirect' => route('hrm.payrolls.index') + ]); + } catch (\Exception $e) { + DB::rollback(); + return response()->json(['message' => __('Somethings went wrong!')], 404); + } + } + + public function update(Request $request, $id) + { + $request->validate([ + 'employee_id' => 'required|integer|exists:employees,id', + 'payment_type_id' => 'required', + 'date' => 'nullable|date', + 'month' => 'required|string', + 'amount' => 'required|numeric', + 'note' => 'nullable|string', + 'payemnt_year' => 'required|string', + ]); + + DB::beginTransaction(); + try { + + $business_id = auth()->user()->business_id; + $payroll = Payroll::where('business_id', $business_id)->findOrFail($id); + + updateBalance($request->amount - $payroll->amount, 'decrement'); + + $payroll->update($request->except(['business_id', 'amount', 'payment_type_id']) + [ + 'payment_type_id' => $request->payment_type_id != 'cash' ? $request->payment_type_id : NULL + ]); + + // Delete old transactions + $transaction = Transaction::where('business_id', $business_id) + ->where([ + 'platform' => 'payroll', + 'reference_id' => $payroll->id + ]) + ->first(); + + if ($transaction->bank_payment) { + PaymentType::find($transaction->payment_type_id)->decrement('balance', $transaction->amount); + } + $transaction->delete(); + + $payments = [['amount' => $request->amount, 'type' => $request->payment_type_id]]; + + // Process new payments + event(new MultiPaymentProcessed( + $payments, + $payroll->id, + 'payroll', + $request->amount, + )); + + DB::commit(); + + return response()->json([ + 'message' => __('Payroll Updated successfully'), + 'redirect' => route('hrm.payrolls.index') + ]); + } catch (\Exception $e) { + DB::rollback(); + return response()->json(['message' => $e->getMessage()], 404); + } + } + + public function destroy($id) + { + $payroll = Payroll::findOrFail($id); + + $payroll->delete(); + return response()->json([ + 'message' => __('Payroll Deleted Successfully'), + 'redirect' => route('hrm.payrolls.index') + ]); + } + + public function deleteAll(Request $request) + { + Payroll::whereIn('id', $request->input('ids'))->delete(); + + return response()->json([ + 'message' => __('All Payrolls deleted successfully'), + 'redirect' => route('hrm.payrolls.index') + ]); + } + + public function getEmpAmount() + { + $employee = Employee::findOrFail(request('employee_id')); + + return response()->json([ + 'data' => [ + 'amount' => $employee->amount + ] + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportController.php new file mode 100644 index 00000000..5f0b03d7 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportController.php @@ -0,0 +1,77 @@ +middleware('check.permission:payroll-reports.read')->only(['index']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + + $payrolls = Payroll::with(['employee:id,name', 'payment_type:id,name', 'branch:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->where(function ($query) use ($search) { + $query->where('puid', 'like', '%' . $search . '%') + ->orWhere('amount', 'like', '%' . $search . '%') + ->orWhereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('payment_type', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::reports.payrolls.datas', compact('payrolls'))->render() + ]); + } + + return view('hrmaddon::reports.payrolls.index', compact('payrolls', 'employees')); + } + + public function exportExcel() + { + return Excel::download(new ExportPayrollReport, 'payroll-report.xlsx'); + } + + public function exportCsv() + { + return Excel::download(new ExportPayrollReport, 'payroll-report.csv'); + } + + public function exportPdf(Request $request) + { + $payrolls = Payroll::with(['employee:id,name', 'payment_type:id,name', 'branch:id,name']) + ->where('business_id', auth()->user()->business_id) + ->latest() + ->get(); + + return PdfService::render('hrmaddon::reports.payrolls.pdf', compact('payrolls'),'payroll-report.pdf'); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportHistoryController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportHistoryController.php new file mode 100644 index 00000000..d56d1d3f --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportHistoryController.php @@ -0,0 +1,54 @@ +middleware('check.permission:payroll-reports.read')->only(['index']); + } + + public function index(Request $request) + { + $employees = Employee::where('business_id', auth()->user()->business_id)->whereStatus('active')->latest()->get(); + + $payrolls = Payroll::with(['employee:id,name', 'payment_type:id,name', 'branch:id,name']) + ->where('business_id', auth()->user()->business_id) + ->when($request->search, function ($query) use ($request) { + $search = $request->search; + $query->where(function ($query) use ($search) { + $query->where('puid', 'like', '%' . $search . '%') + ->orWhere('amount', 'like', '%' . $search . '%') + ->orWhereHas('employee', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }) + ->orWhereHas('payment_type', function ($q) use ($search) { + $q->where('name', 'like', '%' . $search . '%'); + }); + }); + }) + ->when($request->employee, function ($query) use ($request) { + $employeeId = $request->employee; + $query->where('employee_id', $employeeId); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $query->where('month', $request->month); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::reports.payrolls.datas', compact('payrolls'))->render() + ]); + } + + return view('hrmaddon::reports.payrolls.index', compact('payrolls', 'employees')); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/AcnooShiftController.php b/Modules/HrmAddon/App/Http/Controllers/AcnooShiftController.php new file mode 100644 index 00000000..65a3dee1 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/AcnooShiftController.php @@ -0,0 +1,135 @@ +middleware('check.permission:shifts.read')->only(['index']); + $this->middleware('check.permission:shifts.create')->only(['store']); + $this->middleware('check.permission:shifts.update')->only(['update', 'status']); + $this->middleware('check.permission:shifts.delete')->only(['destroy', 'deleteAll']); + } + + public function index(Request $request) + { + $shifts = Shift::where('business_id', auth()->user()->business_id) + ->when(request('search'), function ($q) use ($request) { + $q->where(function ($q) use ($request) { + $q->where('name', 'like', '%' . $request->search . '%') + ->orWhere('start_time', 'like', '%' . $request->search . '%') + ->orWhere('end_time', 'like', '%' . $request->search . '%'); + }); + }) + ->latest() + ->paginate($request->per_page ?? 20)->appends($request->query()); + + if ($request->ajax()) { + return response()->json([ + 'data' => view('hrmaddon::shifts.datas', compact('shifts'))->render() + ]); + } + return view('hrmaddon::shifts.index', compact('shifts')); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|in:Morning,Day,Evening,Night', + 'start_time' => 'required|date_format:H:i', + 'end_time' => 'required|date_format:H:i', + 'start_break_time' => 'nullable|date_format:H:i', + 'end_break_time' => 'nullable|date_format:H:i', + 'break_status' => 'nullable|in:yes,no', + ]); + + if ($request->filled('start_break_time') && $request->filled('end_break_time')) { + $startTime = Carbon::parse($request->input('start_break_time')); + $endTime = Carbon::parse($request->input('end_break_time')); + + $hoursDiff = $endTime->diffInHours($startTime); + $minutesDiff = $endTime->diffInMinutes($startTime) % 60; + + $breakTime = sprintf('%02d:%02d', $hoursDiff, $minutesDiff); + } else { + $breakTime = null; + } + + Shift::create($request->except('status','break_time', 'business_id')+[ + 'business_id' => auth()->user()->business_id, + 'break_time' => $breakTime, + ]); + + return response()->json([ + 'message' => __('Shift created successfully.'), + 'redirect' => route('hrm.shifts.index') + ]); + } + + public function update(Request $request, Shift $shift) + { + $request->validate([ + 'name' => 'required|in:Morning,Day,Evening,Night', + 'start_time' => 'required', + 'end_time' => 'required', + 'start_break_time' => 'nullable', + 'end_break_time' => 'nullable', + 'break_status' => 'nullable|in:yes,no', + ]); + + if ($request->filled('start_break_time') && $request->filled('end_break_time')) { + $startTime = Carbon::parse($request->input('start_break_time')); + $endTime = Carbon::parse($request->input('end_break_time')); + + $hoursDiff = $endTime->diffInHours($startTime); + $minutesDiff = $endTime->diffInMinutes($startTime) % 60; + + $breakTime = sprintf('%02d:%02d', $hoursDiff, $minutesDiff); + } else { + $breakTime = null; + } + + $shift->update($request->except('status','break_time', 'business_id')+[ + 'business_id' => auth()->user()->business_id, + 'break_time' => $breakTime, + ]); + + return response()->json([ + 'message' => __('Shift Updated successfully.'), + 'redirect' => route('hrm.shifts.index') + ]); + } + + public function destroy($id) + { + $shift = Shift::findOrFail($id); + $shift->delete(); + return response()->json([ + 'message' => __('Shift deleted successfully.'), + 'redirect' => route('hrm.shifts.index') + ]); + } + + public function deleteAll(Request $request) + { + Shift::whereIn('id', $request->input('ids'))->delete(); + + return response()->json([ + 'message' => __('All shifts deleted successfully'), + 'redirect' => route('hrm.shifts.index') + ]); + } + + public function status(Request $request, $id) + { + $shift = Shift::findOrFail($id); + $shift->update(['status' => $request->status]); + return response()->json(['message' => 'Shift']); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceController.php b/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceController.php new file mode 100644 index 00000000..dd535c7f --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceController.php @@ -0,0 +1,176 @@ +where('business_id', auth()->user()->business_id) + ->when($request->employee_id, function ($query) use ($request) { + $query->where('employee_id', $request->employee_id); + }) + ->when($request->duration, function ($query) use ($request) { + $today = Carbon::today(); + + if ($request->duration === 'today') { + $query->whereDate('date', $today); + } elseif ($request->duration === 'yesterday') { + $query->whereDate('date', Carbon::yesterday()); + } elseif ($request->duration === 'last_seven_days') { + $startDate = Carbon::now()->subDays(7)->format('Y-m-d'); + $endDate = Carbon::now()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'last_thirty_days') { + $startDate = Carbon::now()->subDays(30)->format('Y-m-d'); + $endDate = Carbon::now()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'current_month') { + $startDate = Carbon::now()->startOfMonth()->format('Y-m-d'); + $endDate = Carbon::now()->endOfMonth()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'last_month') { + $startDate = Carbon::now()->subMonth()->startOfMonth()->format('Y-m-d'); + $endDate = Carbon::now()->subMonth()->endOfMonth()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'current_year') { + $startDate = Carbon::now()->startOfYear()->format('Y-m-d'); + $endDate = Carbon::now()->endOfYear()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'custom_date' && $request->from_date && $request->to_date) { + $startDate = Carbon::parse($request->from_date)->format('Y-m-d'); + $endDate = Carbon::parse($request->to_date)->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } + }) + ->latest() + ->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'employee_id' => 'required|exists:employees,id', + 'time_in' => 'required|date_format:H:i', + 'time_out' => 'required|date_format:H:i', + 'date' => 'required|date', + 'note' => 'nullable|string', + ]); + + $timeIn = Carbon::parse($request->time_in); + $timeOut = Carbon::parse($request->time_out); + + $durationInMinutes = $timeOut->diffInMinutes($timeIn); + $hours = floor($durationInMinutes / 60); + $minutes = $durationInMinutes % 60; + $formattedDuration = sprintf('%02d:%02d', $hours, $minutes); + $month = strtolower(Carbon::parse($request->date)->format('F')); + + $business = Business::findOrFail(auth()->user()->business_id); + $employee = Employee::findOrFail($request->employee_id); + + $data = Attendance::create($request->except(['business_id', 'duration', 'month', 'shift_id']) + [ + 'business_id' => auth()->user()->business_id, + 'duration' => $formattedDuration, + 'month' => $month, + 'shift_id' => $employee->shift_id, + ]); + + if (moduleCheck('MarketingAddon')) { + $this->attendanceMessage($business, $data, $employee); + } + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function show($id) + { + $data = Attendance::with(['employee:id,name', 'shift:id,name']) + ->where('business_id', auth()->user()->business_id) + ->findOrFail($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, $id) + { + $attendance = Attendance::where('business_id', auth()->user()->business_id)->find($id); + + if (!$attendance) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $request->validate([ + 'employee_id' => 'required|exists:employees,id', + 'time_in' => 'required|date_format:H:i', + 'time_out' => 'required|date_format:H:i', + 'date' => 'required|date', + 'note' => 'nullable|string', + ]); + + $timeIn = Carbon::parse($request->time_in); + $timeOut = Carbon::parse($request->time_out); + + $durationInMinutes = $timeOut->diffInMinutes($timeIn); + $hours = floor($durationInMinutes / 60); + $minutes = $durationInMinutes % 60; + $formattedDuration = sprintf('%02d:%02d', $hours, $minutes); + $month = strtolower(Carbon::parse($request->date)->format('F')); + $employee = Employee::findOrFail($request->employee_id); + + $attendance->update($request->except(['duration', 'month']) + [ + 'duration' => $formattedDuration, + 'month' => $month, + 'shift_id' => $employee->shift_id, + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $attendance, + ]); + } + + public function destroy($id) + { + $attendance = Attendance::where('business_id', auth()->user()->business_id)->find($id); + + if (!$attendance) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $attendance->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceReportController.php b/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceReportController.php new file mode 100644 index 00000000..fab896b9 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceReportController.php @@ -0,0 +1,66 @@ +where('business_id', auth()->user()->business_id) + ->when($request->employee_id, function ($query) use ($request) { + $query->where('employee_id', $request->employee_id); + }) + ->when($request->duration, function ($query) use ($request) { + $today = Carbon::today(); + + if ($request->duration === 'today') { + $query->whereDate('date', $today); + } elseif ($request->duration === 'yesterday') { + $query->whereDate('date', Carbon::yesterday()); + } elseif ($request->duration === 'last_seven_days') { + $startDate = Carbon::now()->subDays(7)->format('Y-m-d'); + $endDate = Carbon::now()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'last_thirty_days') { + $startDate = Carbon::now()->subDays(30)->format('Y-m-d'); + $endDate = Carbon::now()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'current_month') { + $startDate = Carbon::now()->startOfMonth()->format('Y-m-d'); + $endDate = Carbon::now()->endOfMonth()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'last_month') { + $startDate = Carbon::now()->subMonth()->startOfMonth()->format('Y-m-d'); + $endDate = Carbon::now()->subMonth()->endOfMonth()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'current_year') { + $startDate = Carbon::now()->startOfYear()->format('Y-m-d'); + $endDate = Carbon::now()->endOfYear()->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } elseif ($request->duration === 'custom_date' && $request->from_date && $request->to_date) { + $startDate = Carbon::parse($request->from_date)->format('Y-m-d'); + $endDate = Carbon::parse($request->to_date)->format('Y-m-d'); + $query->whereDate('date', '>=', $startDate) + ->whereDate('date', '<=', $endDate); + } + }) + ->latest() + ->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/DepartmentController.php b/Modules/HrmAddon/App/Http/Controllers/Api/DepartmentController.php new file mode 100644 index 00000000..79ad8427 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/DepartmentController.php @@ -0,0 +1,96 @@ +user()->business_id) + ->when(request('status'), function ($query) { + $query->where('status', request('status') == 'active' ? 1 : 0); + }) + ->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|unique:departments,name,NULL,id,business_id,' . auth()->user()->business_id, + 'description' => 'nullable|string', + 'status' => 'nullable|boolean', + ]); + + $data = Department::create($request->all() + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function show($id) + { + $data = Department::where('business_id', auth()->user()->business_id)->findOrFail($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, $id) + { + $department = Department::where('business_id', auth()->user()->business_id) + ->find($id); + + if (!$department) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $request->validate([ + 'name' => 'required|unique:departments,name,' . $id . ',id,business_id,' . auth()->user()->business_id, + 'description' => 'nullable|string', + 'status' => 'nullable|boolean', + ]); + + $department->update($request->except('business_id')); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $department, + ]); + } + + public function destroy($id) + { + $department = Department::where('business_id', auth()->user()->business_id) + ->find($id); + + if (!$department) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $department->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/DesignationController.php b/Modules/HrmAddon/App/Http/Controllers/Api/DesignationController.php new file mode 100644 index 00000000..0211d3ac --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/DesignationController.php @@ -0,0 +1,95 @@ +user()->business_id) + ->when(request('status'), function ($query) { + $query->where('status', request('status') == 'active' ? 1 : 0); + }) + ->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|unique:designations,name,NULL,id,business_id,' . auth()->user()->business_id, + 'description' => 'nullable|string', + 'status' => 'nullable|boolean', + ]); + + $data = Designation::create($request->all() + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function show($id) + { + $data = Designation::where('business_id', auth()->user()->business_id)->findOrFail($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, $id) + { + $designation = Designation::where('business_id', auth()->user()->business_id)->find($id); + + if (!$designation) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $request->validate([ + 'name' => 'required|unique:designations,name,' . $id . ',id,business_id,' . auth()->user()->business_id, + 'description' => 'nullable|string', + 'status' => 'nullable|boolean', + ]); + + $designation->update($request->except('business_id')); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $designation, + ]); + } + + public function destroy($id) + { + $designation = Designation::where('business_id', auth()->user()->business_id) + ->find($id); + + if (!$designation) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $designation->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/EmployeeController.php b/Modules/HrmAddon/App/Http/Controllers/Api/EmployeeController.php new file mode 100644 index 00000000..53f822ea --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/EmployeeController.php @@ -0,0 +1,126 @@ +where('business_id', auth()->user()->business_id) + ->when(request('status'), function ($query) { + $status = request('status'); + if (in_array($status, ['active', 'terminated', 'suspended'])) { + $query->where('status', $status); + } + }) + ->latest() + ->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + + } + + public function store(Request $request) + { + $request->validate($this->validationRules()); + + $data = Employee::create($request->except('business_id', 'image') + [ + 'business_id' => auth()->user()->business_id, + 'image' => $request->image ? $this->upload($request, 'image') : NULL + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function show($id) + { + $data = Employee::with('department:id,name', 'designation:id,name', 'shift:id,name', 'branch:id,name') + ->where('business_id', auth()->user()->business_id) + ->findOrFail($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, $id) + { + $employee = Employee::where('business_id', auth()->user()->business_id) + ->find($id); + + if (!$employee) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $request->validate($this->validationRules($id)); + + $data = $employee->update($request->except('business_id', 'image') + [ + 'image' => $request->image ? $this->upload($request, 'image', $employee->image) : $employee->image + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function destroy($id) + { + $employee = Employee::where('business_id', auth()->user()->business_id) + ->find($id); + + if (!$employee) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + if (file_exists($employee->image)) { + Storage::delete($employee->image); + } + + $employee->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } + + // Common validation for store/update. + protected function validationRules($id = null) + { + return [ + 'name' => 'required|string|max:255', + 'designation_id' => 'required|exists:designations,id', + 'department_id' => 'required|exists:departments,id', + 'shift_id' => 'required|exists:shifts,id', + 'amount' => 'required|numeric', + 'phone' => 'required|string|max:20', + 'email' => 'nullable|email|max:255', + 'gender' => 'required|in:male,female,others', + 'country' => 'nullable|string|max:100', + 'birth_date' => 'nullable|date', + 'join_date' => 'nullable|date', + 'image' => 'nullable|image|mimes:jpg,png,jpeg,svg', + 'status' => 'required|in:active,terminated,suspended', + ]; + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/HolidayController.php b/Modules/HrmAddon/App/Http/Controllers/Api/HolidayController.php new file mode 100644 index 00000000..f75d2ea8 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/HolidayController.php @@ -0,0 +1,86 @@ +where('business_id', auth()->user()->business_id)->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $holidays, + ]); + } + + public function show($id) + { + $data = Holiday::where('business_id', auth()->user()->business_id)->findOrFail($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'start_date' => 'required|date', + 'end_date' => 'required|date', + 'description' => 'nullable|string', + ]); + + $data = Holiday::create($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, string $id) + { + $request->validate([ + 'name' => 'nullable|string|max:255', + 'start_date' => 'required|date', + 'end_date' => 'required|date', + 'description' => 'nullable|string', + ]); + + $holiday = Holiday::where('business_id', auth()->user()->business_id)->findOrFail($id); + + $holiday->update($request->except('business_id')); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $holiday, + ]); + } + + public function destroy(string $id) + { + $holiday = Holiday::where('business_id', auth()->user()->business_id)->findOrFail($id); + + if (!$holiday) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $holiday->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } + +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/LeaveController.php b/Modules/HrmAddon/App/Http/Controllers/Api/LeaveController.php new file mode 100644 index 00000000..b8ddd132 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/LeaveController.php @@ -0,0 +1,117 @@ +where('business_id', auth()->user()->business_id) + ->when($request->employee_id, function ($query) use ($request) { + $query->where('employee_id', $request->employee_id); + }) + ->when($request->month, function ($query) use ($request) { + $month = strtolower($request->month); + $query->whereRaw("LOWER(month) = ?", [$month]); + }) + ->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $leaves, + ]); + } + + public function show($id) + { + $data = Leave::with(['employee:id,name', 'branch:id,name', 'leave_type:id,name', 'department:id,name'])->where('business_id', auth()->user()->business_id)->find($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'employee_id' => 'required|exists:employees,id', + 'leave_type_id' => 'required|exists:leave_types,id', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', + 'leave_duration' => 'required|numeric|min:0.5', + 'month' => 'required|string', + 'status' => 'required|in:pending,approved,rejected', + 'description' => 'nullable|string', + ]); + + $employee = Employee::where('business_id', auth()->user()->business_id)->findOrFail($request->employee_id); + + $data = Leave::create($request->except(['business_id', 'department_id']) + [ + 'business_id' => auth()->user()->business_id, + 'department_id' => $employee->department_id, + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, string $id) + { + $request->validate([ + 'employee_id' => 'required|exists:employees,id', + 'leave_type_id' => 'required|exists:leave_types,id', + 'start_date' => 'required|date', + 'end_date' => 'required|date|after_or_equal:start_date', + 'leave_duration' => 'required|numeric|min:0.5', + 'month' => 'required|string', + 'status' => 'required|in:pending,approved,rejected', + 'description' => 'nullable|string', + ]); + + $leave = Leave::find($id); + + if (!$leave) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $employee = Employee::where('business_id', auth()->user()->business_id)->findOrFail($request->employee_id); + + $leave->update($request->except('business_id','department_id') + [ + 'department_id' => $employee->department_id, + ]); + + return response()->json([ + 'message' => __('Data update successfully.'), + 'data' => $leave, + ]); + } + + public function destroy(string $id) + { + $leave = Leave::find($id); + + if (!$leave) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $leave->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/LeaveReportController.php b/Modules/HrmAddon/App/Http/Controllers/Api/LeaveReportController.php new file mode 100644 index 00000000..b49dcdfe --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/LeaveReportController.php @@ -0,0 +1,31 @@ +where('business_id', auth()->user()->business_id) + ->when($request->employee_id, function ($query) use ($request) { + $query->where('employee_id', $request->employee_id); + }) + ->when($request->month, function ($query) use ($request) { + $month = strtolower($request->month); + $query->whereRaw("LOWER(month) = ?", [$month]); + }) + ->latest() + ->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/LeaveTypeController.php b/Modules/HrmAddon/App/Http/Controllers/Api/LeaveTypeController.php new file mode 100644 index 00000000..c86a43f8 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/LeaveTypeController.php @@ -0,0 +1,86 @@ +user()->business_id)->when(request('search'), function ($query) { + $query->where('name', 'like', '%' . request('search') . '%') + ->orwhere('description', 'like', '%' . request('search') . '%'); + })->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $types, + ]); + } + + public function show($id) + { + $data = LeaveType::where('business_id', auth()->user()->business_id)->find($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'status' => 'nullable|boolean', + ]); + + $data = LeaveType::create($request->except('business_id') + [ + 'business_id' => auth()->user()->business_id + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, string $id) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'description' => 'nullable|string', + 'status' => 'nullable|boolean', + ]); + + $leaveType = LeaveType::where('business_id', auth()->user()->business_id)->find($id); + + $leaveType->update($request->except('business_id')); + + return response()->json([ + 'message' => __('Data update successfully.'), + 'data' => $leaveType, + ]); + } + + public function destroy(string $id) + { + $leaveType = LeaveType::where('business_id', auth()->user()->business_id)->find($id); + + if (!$leaveType) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $leaveType->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/PayrollController.php b/Modules/HrmAddon/App/Http/Controllers/Api/PayrollController.php new file mode 100644 index 00000000..1fa6fd53 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/PayrollController.php @@ -0,0 +1,137 @@ +where('business_id', auth()->user()->business_id)->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $payrolls, + ]); + } + + public function show($id) + { + $data = Payroll::with(['employee:id,name', 'branch:id,name', 'transactions:id,platform,transaction_type,amount,date,invoice_no,reference_id,payment_type_id,meta', 'transactions.paymentType:id,name'])->where('business_id', auth()->user()->business_id)->find($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'employee_id' => 'required|integer|exists:employees,id', + 'month' => 'required|string', + 'date' => 'nullable|date', + 'note' => 'nullable|string', + 'payemnt_year' => 'required|string', + ]); + + $exists = Payroll::where('employee_id', $request->employee_id) + ->where('month', $request->month) + ->where('payemnt_year', $request->payemnt_year) + ->where('business_id', auth()->user()->business_id) + ->exists(); + + if ($exists) { + return response()->json([ + 'message' => __('This employee has already been paid for this month and year.'), + ], 422); + } + + $employee = Employee::where('business_id', auth()->user()->business_id)->findOrFail($request->employee_id); + + $data = Payroll::create($request->except(['business_id', 'amount']) + [ + 'business_id' => auth()->user()->business_id, + 'amount' => $employee->amount, + ]); + + // Handle payments + $payments = collect($request->payments ?? [])->map(function ($payment) use ($employee) { + $payment['amount'] = $employee->amount; + return $payment; + })->toArray(); + + // Trigger multipayment event + event(new MultiPaymentProcessed( + $payments, + $data->id, + 'payroll', + $employee->amount ?? 0, + )); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, string $id) + { + $request->validate([ + 'employee_id' => 'required|integer|exists:employees,id', + 'date' => 'nullable|date', + 'month' => 'required|string', + 'note' => 'nullable|string', + 'payemnt_year' => 'required|string', + ]); + + $Payroll = Payroll::find($id); + + if (!$Payroll) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $exists = Payroll::where('employee_id', $request->employee_id) + ->where('month', $request->month) + ->where('payemnt_year', $request->payemnt_year) + ->where('business_id', auth()->user()->business_id) + ->where('id', '!=', $id) + ->exists(); + + if ($exists) { + return response()->json([ + 'message' => __('This employee has already been paid for this month and year.'), + ], 422); + } + + $Payroll->update($request->except(['business_id', 'amount'])); + + return response()->json([ + 'message' => __('Data update successfully.'), + 'data' => $Payroll, + ]); + } + + public function destroy(string $id) + { + $Payroll = Payroll::where('business_id', auth()->user()->business_id)->find($id); + + if (!$Payroll) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $Payroll->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/PayrollReportController.php b/Modules/HrmAddon/App/Http/Controllers/Api/PayrollReportController.php new file mode 100644 index 00000000..934f0579 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/PayrollReportController.php @@ -0,0 +1,30 @@ +where('business_id', auth()->user()->business_id) + ->when($request->employee_id, function ($query) use ($request) { + $query->where('employee_id', $request->employee_id); + }) + ->when($request->filled('month'), function ($query) use ($request) { + $search = $request->month; + $query->where('month', 'like', '%' . $search . '%'); + }) + ->latest() + ->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } +} diff --git a/Modules/HrmAddon/App/Http/Controllers/Api/ShiftController.php b/Modules/HrmAddon/App/Http/Controllers/Api/ShiftController.php new file mode 100644 index 00000000..02c6a627 --- /dev/null +++ b/Modules/HrmAddon/App/Http/Controllers/Api/ShiftController.php @@ -0,0 +1,150 @@ +user()->business_id) + ->when(request('status'), function ($query) { + $query->where('status', request('status') == 'active' ? 1 : 0); + }) + ->latest()->get(); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function store(Request $request) + { + $request->validate([ + 'name' => 'required|in:Morning,Day,Evening,Night', + 'start_time' => 'required|date_format:H:i', + 'end_time' => 'required|date_format:H:i', + 'start_break_time' => 'nullable|date_format:H:i', + 'end_break_time' => 'nullable|date_format:H:i', + 'break_status' => 'nullable|in:yes,no', + ]); + + if ($request->start_break_time && $request->end_break_time) { + $startTime = Carbon::parse($request->input('start_break_time')); + $endTime = Carbon::parse($request->input('end_break_time')); + + $hoursDiff = $endTime->diffInHours($startTime); + $minutesDiff = $endTime->diffInMinutes($startTime) % 60; + + $breakTime = sprintf('%02d:%02d', $hoursDiff, $minutesDiff); + } else { + $breakTime = null; + } + + $data = Shift::create($request->except('break_time', 'business_id') + [ + 'business_id' => auth()->user()->business_id, + 'break_time' => $breakTime, + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $data, + ]); + } + + public function show($id) + { + $data = Shift::where('business_id', auth()->user()->business_id)->findOrFail($id); + + return response()->json([ + 'message' => __('Data fetched successfully.'), + 'data' => $data, + ]); + } + + public function update(Request $request, $id) + { + $shift = Shift::where('business_id', auth()->user()->business_id)->find($id); + + if (!$shift) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $request->validate([ + 'name' => 'required|in:Morning,Day,Evening,Night', + 'start_time' => 'required|date_format:H:i', + 'end_time' => 'required|date_format:H:i', + 'start_break_time' => 'nullable|date_format:H:i', + 'end_break_time' => 'nullable|date_format:H:i', + 'break_status' => 'nullable|in:yes,no', + ]); + + if ($request->start_break_time && $request->end_break_time) { + $startTime = Carbon::parse($request->input('start_break_time')); + $endTime = Carbon::parse($request->input('end_break_time')); + + $hoursDiff = $endTime->diffInHours($startTime); + $minutesDiff = $endTime->diffInMinutes($startTime) % 60; + + $breakTime = sprintf('%02d:%02d', $hoursDiff, $minutesDiff); + } else { + $breakTime = null; + } + + $shift->update($request->except('break_time', 'business_id') + [ + 'break_time' => $breakTime, + ]); + + return response()->json([ + 'message' => __('Data saved successfully.'), + 'data' => $shift, + ]); + } + + public function destroy($id) + { + $shift = Shift::where('business_id', auth()->user()->business_id) + ->find($id); + + if (!$shift) { + return response()->json([ + 'message' => __('Data not found.'), + ], 404); + } + + $shift->delete(); + + return response()->json([ + 'message' => __('Data deleted successfully.'), + ]); + } + + public function status(Request $request, $id) + { + $request->validate([ + 'status' => 'required|boolean' + ]); + + $shift = Shift::where('business_id', auth()->user()->business_id)->find($id); + + if (!$shift) { + return response()->json([ + 'message' => 'Shift not found.' + ], 404); + } + + $shift->update(['status' => $request->status]); + + return response()->json([ + 'message' => 'Shift status updated successfully.', + 'data' => $shift + ]); + } +} diff --git a/Modules/HrmAddon/App/Models/Attendance.php b/Modules/HrmAddon/App/Models/Attendance.php new file mode 100644 index 00000000..9582868b --- /dev/null +++ b/Modules/HrmAddon/App/Models/Attendance.php @@ -0,0 +1,69 @@ +belongsTo(Branch::class)->withTrashed(); + } + + protected static function booted() + { + static::addGlobalScope(new BranchScope); + + if (auth()->check() && auth()->user()->accessToMultiBranch()) { + static::addGlobalScope('withBranch', function ($builder) { + $builder->with('branch:id,name'); + }); + } + } + + public static function boot() + { + parent::boot(); + + static::creating(function ($model) { + $model->branch_id = auth()->user()->branch_id ?? auth()->user()->active_branch_id; + }); + } + + public function employee() + { + return $this->belongsTo(Employee::class); + } + + public function shift() + { + return $this->belongsTo(Shift::class); + } + + protected $casts = [ + 'business_id' => 'integer', + 'branch_id' => 'integer', + 'employee_id' => 'integer', + 'shift_id' => 'integer', + ]; +} diff --git a/Modules/HrmAddon/App/Models/Department.php b/Modules/HrmAddon/App/Models/Department.php new file mode 100644 index 00000000..4350922f --- /dev/null +++ b/Modules/HrmAddon/App/Models/Department.php @@ -0,0 +1,18 @@ + 'integer', + 'status' => 'integer', + ]; +} diff --git a/Modules/HrmAddon/App/Models/Designation.php b/Modules/HrmAddon/App/Models/Designation.php new file mode 100644 index 00000000..5aa4199d --- /dev/null +++ b/Modules/HrmAddon/App/Models/Designation.php @@ -0,0 +1,21 @@ + 'integer', + 'status' => 'integer', + ]; +} diff --git a/Modules/HrmAddon/App/Models/Employee.php b/Modules/HrmAddon/App/Models/Employee.php new file mode 100644 index 00000000..52b4edc9 --- /dev/null +++ b/Modules/HrmAddon/App/Models/Employee.php @@ -0,0 +1,84 @@ +belongsTo(Branch::class)->withTrashed(); + } + + public static function boot() + { + parent::boot(); + + static::creating(function ($model) { + $model->branch_id = auth()->user()->branch_id ?? auth()->user()->active_branch_id; + }); + } + + protected static function booted() + { + static::addGlobalScope(new BranchScope); + + if (auth()->check() && auth()->user()->accessToMultiBranch()) { + static::addGlobalScope('withBranch', function ($builder) { + $builder->with('branch:id,name'); + }); + } + } + + public function department() + { + return $this->belongsTo(Department::class); + } + + public function designation() + { + return $this->belongsTo(Designation::class); + } + + public function shift() + { + return $this->belongsTo(Shift::class); + } + + protected $casts = [ + 'business_id' => 'integer', + 'designation_id' => 'integer', + 'department_id' => 'integer', + 'shift_id' => 'integer', + 'amount' => 'double', + ]; + + protected $imageFields = ['image']; + +} diff --git a/Modules/HrmAddon/App/Models/Holiday.php b/Modules/HrmAddon/App/Models/Holiday.php new file mode 100644 index 00000000..2abe8197 --- /dev/null +++ b/Modules/HrmAddon/App/Models/Holiday.php @@ -0,0 +1,41 @@ +belongsTo(Branch::class)->withTrashed(); + } + + protected static function booted() + { + static::addGlobalScope(new BranchScope); + + if (auth()->check() && auth()->user()->accessToMultiBranch()) { + static::addGlobalScope('withBranch', function ($builder) { + $builder->with('branch:id,name'); + }); + } + } + + public static function boot() + { + parent::boot(); + + static::creating(function ($model) { + $model->branch_id = auth()->user()->branch_id ?? auth()->user()->active_branch_id; + }); + } +} diff --git a/Modules/HrmAddon/App/Models/Leave.php b/Modules/HrmAddon/App/Models/Leave.php new file mode 100644 index 00000000..99b75507 --- /dev/null +++ b/Modules/HrmAddon/App/Models/Leave.php @@ -0,0 +1,56 @@ +belongsTo(Branch::class)->withTrashed(); + } + + protected static function booted() + { + static::addGlobalScope(new BranchScope); + + if (auth()->check() && auth()->user()->accessToMultiBranch()) { + static::addGlobalScope('withBranch', function ($builder) { + $builder->with('branch:id,name'); + }); + } + } + + public static function boot() + { + parent::boot(); + + static::creating(function ($model) { + $model->branch_id = auth()->user()->branch_id ?? auth()->user()->active_branch_id; + }); + } + + public function employee() + { + return $this->belongsTo(Employee::class); + } + + public function leave_type() + { + return $this->belongsTo(LeaveType::class); + } + + public function department() + { + return $this->belongsTo(Department::class); + } +} diff --git a/Modules/HrmAddon/App/Models/LeaveType.php b/Modules/HrmAddon/App/Models/LeaveType.php new file mode 100644 index 00000000..0a12ecd1 --- /dev/null +++ b/Modules/HrmAddon/App/Models/LeaveType.php @@ -0,0 +1,13 @@ +belongsTo(Branch::class)->withTrashed(); + } + + protected static function booted() + { + static::addGlobalScope(new BranchScope); + + if (auth()->check() && auth()->user()->accessToMultiBranch()) { + static::addGlobalScope('withBranch', function ($builder) { + $builder->with('branch:id,name'); + }); + } + } + + public function employee() + { + return $this->belongsTo(Employee::class); + } + + public function payment_type() + { + return $this->belongsTo(PaymentType::class); + } + + public function transactions() + { + return $this->hasMany(Transaction::class, 'reference_id') + ->where('platform', 'payroll'); + } + + public static function boot() + { + parent::boot(); + + static::creating(function ($model) { + $id = Payroll::where('business_id', auth()->user()->business_id)->count() + 1; + $model->puid = 'Ps_' . str_pad($id, 4, '0', STR_PAD_LEFT); + $model->branch_id = auth()->user()->branch_id ?? auth()->user()->active_branch_id; + }); + } +} diff --git a/Modules/HrmAddon/App/Models/Shift.php b/Modules/HrmAddon/App/Models/Shift.php new file mode 100644 index 00000000..114cb685 --- /dev/null +++ b/Modules/HrmAddon/App/Models/Shift.php @@ -0,0 +1,21 @@ + 'integer', + 'status' => 'integer', + ]; +} diff --git a/Modules/HrmAddon/App/Providers/.gitkeep b/Modules/HrmAddon/App/Providers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/App/Providers/HrmAddonServiceProvider.php b/Modules/HrmAddon/App/Providers/HrmAddonServiceProvider.php new file mode 100644 index 00000000..5be15c38 --- /dev/null +++ b/Modules/HrmAddon/App/Providers/HrmAddonServiceProvider.php @@ -0,0 +1,111 @@ +registerCommands(); + $this->registerCommandSchedules(); + $this->registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/migrations')); + } + + /** + * Register the service provider. + */ + public function register(): void + { + $this->app->register(RouteServiceProvider::class); + } + + /** + * Register commands in the format of Command::class + */ + protected function registerCommands(): void + { + // + } + + /** + * Register command Schedules. + */ + protected function registerCommandSchedules(): void + { + // + } + + /** + * Register translations. + */ + public function registerTranslations(): void + { + $langPath = resource_path('lang/modules/'.$this->moduleNameLower); + + if (is_dir($langPath)) { + $this->loadTranslationsFrom($langPath, $this->moduleNameLower); + $this->loadJsonTranslationsFrom($langPath); + } else { + $this->loadTranslationsFrom(module_path($this->moduleName, 'lang'), $this->moduleNameLower); + $this->loadJsonTranslationsFrom(module_path($this->moduleName, 'lang')); + } + } + + /** + * Register config. + */ + protected function registerConfig(): void + { + $this->publishes([module_path($this->moduleName, 'config/config.php') => config_path($this->moduleNameLower.'.php')], 'config'); + $this->mergeConfigFrom(module_path($this->moduleName, 'config/config.php'), $this->moduleNameLower); + } + + /** + * Register views. + */ + public function registerViews(): void + { + $viewPath = resource_path('views/modules/'.$this->moduleNameLower); + $sourcePath = module_path($this->moduleName, 'resources/views'); + + $this->publishes([$sourcePath => $viewPath], ['views', $this->moduleNameLower.'-module-views']); + + $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower); + + $componentNamespace = str_replace('/', '\\', config('modules.namespace').'\\'.$this->moduleName.'\\'.config('modules.paths.generator.component-class.path')); + Blade::componentNamespace($componentNamespace, $this->moduleNameLower); + } + + /** + * Get the services provided by the provider. + */ + public function provides(): array + { + return []; + } + + private function getPublishableViewPaths(): array + { + $paths = []; + foreach (config('view.paths') as $path) { + if (is_dir($path.'/modules/'.$this->moduleNameLower)) { + $paths[] = $path.'/modules/'.$this->moduleNameLower; + } + } + + return $paths; + } +} diff --git a/Modules/HrmAddon/App/Providers/RouteServiceProvider.php b/Modules/HrmAddon/App/Providers/RouteServiceProvider.php new file mode 100644 index 00000000..4e9a800b --- /dev/null +++ b/Modules/HrmAddon/App/Providers/RouteServiceProvider.php @@ -0,0 +1,59 @@ +mapApiRoutes(); + + $this->mapWebRoutes(); + } + + /** + * Define the "web" routes for the application. + * + * These routes all receive session state, CSRF protection, etc. + */ + protected function mapWebRoutes(): void + { + Route::middleware('web') + ->namespace($this->moduleNamespace) + ->group(module_path('HrmAddon', '/routes/web.php')); + } + + /** + * Define the "api" routes for the application. + * + * These routes are typically stateless. + */ + protected function mapApiRoutes(): void + { + Route::prefix('api') + ->middleware('api') + ->namespace($this->moduleNamespace) + ->group(module_path('HrmAddon', '/routes/api.php')); + } +} diff --git a/Modules/HrmAddon/Database/Seeders/.gitkeep b/Modules/HrmAddon/Database/Seeders/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/Database/Seeders/HrmAddonDatabaseSeeder.php b/Modules/HrmAddon/Database/Seeders/HrmAddonDatabaseSeeder.php new file mode 100644 index 00000000..7a9525d0 --- /dev/null +++ b/Modules/HrmAddon/Database/Seeders/HrmAddonDatabaseSeeder.php @@ -0,0 +1,16 @@ +id(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->string('name')->nullable(); + $table->text('description')->nullable(); + $table->boolean('status')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('departments'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_12_130921_create_designations_table.php b/Modules/HrmAddon/Database/migrations/2025_05_12_130921_create_designations_table.php new file mode 100644 index 00000000..9acaf54f --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_12_130921_create_designations_table.php @@ -0,0 +1,31 @@ +id(); + $table->string('name')->nullable(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->text('description')->nullable(); + $table->boolean('status')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('designations'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_12_152226_create_shifts_table.php b/Modules/HrmAddon/Database/migrations/2025_05_12_152226_create_shifts_table.php new file mode 100644 index 00000000..4b2d8cb5 --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_12_152226_create_shifts_table.php @@ -0,0 +1,36 @@ +id(); + $table->string('name'); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->time('start_time'); + $table->time('end_time'); + $table->time('start_break_time')->nullable(); + $table->time('end_break_time')->nullable(); + $table->time('break_time')->nullable(); + $table->string('break_status')->nullable(); + $table->boolean('status')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('shifts'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_13_102231_create_employees_table.php b/Modules/HrmAddon/Database/migrations/2025_05_13_102231_create_employees_table.php new file mode 100644 index 00000000..d4332cac --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_13_102231_create_employees_table.php @@ -0,0 +1,41 @@ +id(); + $table->string('name'); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->foreignId('designation_id')->nullable()->constrained()->nullOnDelete(); + $table->foreignId('department_id')->nullable()->constrained()->nullOnDelete(); + $table->foreignId('shift_id')->nullable()->constrained()->nullOnDelete(); + $table->double('amount', 10, 2)->default(0); + $table->string('image')->nullable(); + $table->string('phone'); + $table->string('email')->nullable(); + $table->string('gender'); + $table->string('country')->nullable(); + $table->date('birth_date')->nullable(); + $table->date('join_date')->nullable(); + $table->string('status')->default('active'); // active || terminated || suspended + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('employees'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_13_152009_create_leave_types_table.php b/Modules/HrmAddon/Database/migrations/2025_05_13_152009_create_leave_types_table.php new file mode 100644 index 00000000..0e3df1c1 --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_13_152009_create_leave_types_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->string('name'); + $table->text('description')->nullable(); + $table->boolean('status')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('leave_types'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_14_090651_create_leaves_table.php b/Modules/HrmAddon/Database/migrations/2025_05_14_090651_create_leaves_table.php new file mode 100644 index 00000000..380b9d77 --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_14_090651_create_leaves_table.php @@ -0,0 +1,37 @@ +id(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->foreignId('employee_id')->constrained()->cascadeOnDelete(); + $table->foreignId('leave_type_id')->nullable()->constrained()->nullOnDelete(); + $table->foreignId('department_id')->nullable()->constrained()->nullOnDelete(); + $table->date('start_date'); + $table->date('end_date'); + $table->double('leave_duration'); + $table->string('month'); + $table->string('status')->default('pending'); // rejected, pending, approved + $table->text('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('leaves'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_14_124928_create_holidays_table.php b/Modules/HrmAddon/Database/migrations/2025_05_14_124928_create_holidays_table.php new file mode 100644 index 00000000..4e45533c --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_14_124928_create_holidays_table.php @@ -0,0 +1,32 @@ +id(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->string('name'); + $table->date('start_date'); + $table->date('end_date'); + $table->text('description')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('holidays'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_14_162716_create_attendances_table.php b/Modules/HrmAddon/Database/migrations/2025_05_14_162716_create_attendances_table.php new file mode 100644 index 00000000..f5db1d5f --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_14_162716_create_attendances_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->foreignId('employee_id')->constrained()->cascadeOnDelete(); + $table->foreignId('shift_id')->nullable()->constrained()->nullOnDelete(); + $table->time('time_in'); + $table->time('time_out'); + $table->date('date'); + $table->time('duration'); + $table->string('month'); + $table->longText('note')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('attendances'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_05_15_105035_create_payrolls_table.php b/Modules/HrmAddon/Database/migrations/2025_05_15_105035_create_payrolls_table.php new file mode 100644 index 00000000..52ec5cb9 --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_05_15_105035_create_payrolls_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('business_id')->constrained()->cascadeOnDelete(); + $table->foreignId('employee_id')->constrained()->cascadeOnDelete(); + $table->foreignId('payment_type_id')->nullable()->constrained()->nullOnDelete(); + $table->string('month'); + $table->string('puid'); + $table->date('date')->nullable(); + $table->double('amount', 10, 2); + $table->string('payemnt_year'); + $table->longText('note')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('payrolls'); + } +}; diff --git a/Modules/HrmAddon/Database/migrations/2025_08_19_105036_add_new_fields_to_multiple_table.php b/Modules/HrmAddon/Database/migrations/2025_08_19_105036_add_new_fields_to_multiple_table.php new file mode 100644 index 00000000..79f8121c --- /dev/null +++ b/Modules/HrmAddon/Database/migrations/2025_08_19_105036_add_new_fields_to_multiple_table.php @@ -0,0 +1,30 @@ +foreignId('branch_id')->nullable()->after('business_id')->constrained('branches')->nullOnDelete(); + }); + } + } + + public function down(): void + { + // 'holidays', 'attendances', 'leaves', 'payrolls', 'employees' + foreach (['holidays', 'attendances', 'leaves', 'payrolls', 'employees'] as $tableName) { + Schema::table($tableName, function (Blueprint $table) { + $table->dropColumn('branch_id'); + }); + } + } +}; diff --git a/Modules/HrmAddon/composer.json b/Modules/HrmAddon/composer.json new file mode 100644 index 00000000..6577ed4e --- /dev/null +++ b/Modules/HrmAddon/composer.json @@ -0,0 +1,31 @@ +{ + "name": "nwidart/hrmaddon", + "description": "", + "authors": [ + { + "name": "Nicolas Widart", + "email": "n.widart@gmail.com" + } + ], + "extra": { + "laravel": { + "providers": [], + "aliases": { + + } + } + }, + "autoload": { + "psr-4": { + "Modules\\HrmAddon\\": "", + "Modules\\HrmAddon\\App\\": "app/", + "Modules\\HrmAddon\\Database\\Factories\\": "database/factories/", + "Modules\\HrmAddon\\Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Modules\\HrmAddon\\Tests\\": "tests/" + } + } +} diff --git a/Modules/HrmAddon/config/.gitkeep b/Modules/HrmAddon/config/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/config/config.php b/Modules/HrmAddon/config/config.php new file mode 100644 index 00000000..c4984f06 --- /dev/null +++ b/Modules/HrmAddon/config/config.php @@ -0,0 +1,5 @@ + 'HrmAddon', +]; diff --git a/Modules/HrmAddon/module.json b/Modules/HrmAddon/module.json new file mode 100644 index 00000000..859b40f3 --- /dev/null +++ b/Modules/HrmAddon/module.json @@ -0,0 +1,10 @@ +{ + "name": "HrmAddon", + "alias": "hrmaddon", + "version": "1.4", + "description": "", + "keywords": [], + "priority": 0, + "providers": ["Modules\\HrmAddon\\App\\Providers\\HrmAddonServiceProvider"], + "files": [] +} diff --git a/Modules/HrmAddon/package.json b/Modules/HrmAddon/package.json new file mode 100644 index 00000000..d6fbfc83 --- /dev/null +++ b/Modules/HrmAddon/package.json @@ -0,0 +1,15 @@ +{ + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build" + }, + "devDependencies": { + "axios": "^1.1.2", + "laravel-vite-plugin": "^0.7.5", + "sass": "^1.69.5", + "postcss": "^8.3.7", + "vite": "^4.0.0" + } +} diff --git a/Modules/HrmAddon/resources/assets/js/app.js b/Modules/HrmAddon/resources/assets/js/app.js new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/resources/assets/sass/app.scss b/Modules/HrmAddon/resources/assets/sass/app.scss new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/resources/views/.gitkeep b/Modules/HrmAddon/resources/views/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/resources/views/attendances/create.blade.php b/Modules/HrmAddon/resources/views/attendances/create.blade.php new file mode 100644 index 00000000..d1a9c4fe --- /dev/null +++ b/Modules/HrmAddon/resources/views/attendances/create.blade.php @@ -0,0 +1,71 @@ + + + + + diff --git a/Modules/HrmAddon/resources/views/attendances/datas.blade.php b/Modules/HrmAddon/resources/views/attendances/datas.blade.php new file mode 100644 index 00000000..5f17fe57 --- /dev/null +++ b/Modules/HrmAddon/resources/views/attendances/datas.blade.php @@ -0,0 +1,79 @@ +
+ + + + @usercan('attendances.delete') + + @endusercan + + + + + + + + + + + + + @foreach ($attendances as $attendance) + + @usercan('attendances.delete') + + @endusercan + + + + + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Employee') }}{{ __('Month') }}{{ __('Shift') }}{{ __('date') }}{{ __('Time In') }}{{ __('Time Out') }}{{ __('Duration') }}{{ __('Action') }}
+ + {{ ($attendances->currentPage() - 1) * $attendances->perPage() + $loop->iteration }}{{ $attendance->employee->name ?? '' }}{{ ucfirst($attendance->month ?? '') }}{{ $attendance->shift->name ?? '' }}{{ formatted_date($attendance->date) }}{{ formatted_time($attendance->time_in) }}{{ formatted_time($attendance->time_out) }}{{ formatTimeToWords($attendance->duration) }}
+
+
+ {{ $attendances->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/attendances/edit.blade.php b/Modules/HrmAddon/resources/views/attendances/edit.blade.php new file mode 100644 index 00000000..6e7ada6a --- /dev/null +++ b/Modules/HrmAddon/resources/views/attendances/edit.blade.php @@ -0,0 +1,69 @@ + + diff --git a/Modules/HrmAddon/resources/views/attendances/index.blade.php b/Modules/HrmAddon/resources/views/attendances/index.blade.php new file mode 100644 index 00000000..d752bdc9 --- /dev/null +++ b/Modules/HrmAddon/resources/views/attendances/index.blade.php @@ -0,0 +1,94 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Attendance List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Attendance List') }}

+ @usercan('attendances.create') + {{ __('Add new Attendance') }} + @endusercan +
+
+
+
+ +
+
+ + +
+ + +
+ + +
+ +
+ + +
+ +
+
+ +
+
+
+ +
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::attendances.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::attendances.create') + @include('hrmaddon::attendances.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/component/delete-modal.blade.php b/Modules/HrmAddon/resources/views/component/delete-modal.blade.php new file mode 100644 index 00000000..af8a3814 --- /dev/null +++ b/Modules/HrmAddon/resources/views/component/delete-modal.blade.php @@ -0,0 +1,22 @@ + diff --git a/Modules/HrmAddon/resources/views/department/create.blade.php b/Modules/HrmAddon/resources/views/department/create.blade.php new file mode 100644 index 00000000..bee86dfc --- /dev/null +++ b/Modules/HrmAddon/resources/views/department/create.blade.php @@ -0,0 +1,36 @@ + diff --git a/Modules/HrmAddon/resources/views/department/datas.blade.php b/Modules/HrmAddon/resources/views/department/datas.blade.php new file mode 100644 index 00000000..382720bb --- /dev/null +++ b/Modules/HrmAddon/resources/views/department/datas.blade.php @@ -0,0 +1,74 @@ +
+ + + + @usercan('department.delete') + + @endusercan + + + + + + + + + @foreach ($departments as $department) + + @usercan('department.delete') + + @endusercan + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Name') }}{{ __('Description') }}{{ __('Status') }}{{ __('Action') }}
+ + {{ ($departments->currentPage() - 1) * $departments->perPage() + $loop->iteration }}{{ $department->name }}{{ Str::limit($department->description, 20, '...') }} + +
+
+
+ {{ $departments->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/department/edit.blade.php b/Modules/HrmAddon/resources/views/department/edit.blade.php new file mode 100644 index 00000000..44da1c63 --- /dev/null +++ b/Modules/HrmAddon/resources/views/department/edit.blade.php @@ -0,0 +1,37 @@ + diff --git a/Modules/HrmAddon/resources/views/department/index.blade.php b/Modules/HrmAddon/resources/views/department/index.blade.php new file mode 100644 index 00000000..7601d3f1 --- /dev/null +++ b/Modules/HrmAddon/resources/views/department/index.blade.php @@ -0,0 +1,66 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Department List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Department List') }}

+ @usercan('department.create') + {{ __('Add Department') }} + @endusercan +
+ +
+
+ +
+
+ + +
+ +
+
+
+
+ +
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::department.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::department.create') + @include('hrmaddon::department.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/designations/create.blade.php b/Modules/HrmAddon/resources/views/designations/create.blade.php new file mode 100644 index 00000000..17c9dcf5 --- /dev/null +++ b/Modules/HrmAddon/resources/views/designations/create.blade.php @@ -0,0 +1,36 @@ + diff --git a/Modules/HrmAddon/resources/views/designations/datas.blade.php b/Modules/HrmAddon/resources/views/designations/datas.blade.php new file mode 100644 index 00000000..3663f4d1 --- /dev/null +++ b/Modules/HrmAddon/resources/views/designations/datas.blade.php @@ -0,0 +1,75 @@ +
+ + + + @usercan('designations.delete') + + @endusercan + + + + + + + + + @foreach ($designations as $designation) + + @usercan('designations.delete') + + @endusercan + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Name') }}{{ __('Description') }}{{ __('Status') }}{{ __('Action') }}
+ + {{ ($designations->currentPage() - 1) * $designations->perPage() + $loop->iteration }}{{ $designation->name }}{{ Str::limit($designation->description, 20, '...') }} + +
+
+
+ {{ $designations->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/designations/edit.blade.php b/Modules/HrmAddon/resources/views/designations/edit.blade.php new file mode 100644 index 00000000..9a8eedba --- /dev/null +++ b/Modules/HrmAddon/resources/views/designations/edit.blade.php @@ -0,0 +1,37 @@ + diff --git a/Modules/HrmAddon/resources/views/designations/index.blade.php b/Modules/HrmAddon/resources/views/designations/index.blade.php new file mode 100644 index 00000000..f9c236ec --- /dev/null +++ b/Modules/HrmAddon/resources/views/designations/index.blade.php @@ -0,0 +1,66 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Designation List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Designation List') }}

+ @usercan('designations.create') + {{ __('Add Designation') }} + @endusercan +
+ +
+
+ +
+
+ + +
+ +
+
+
+
+ +
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::designations.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::designations.create') + @include('hrmaddon::designations.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/employees/bulk-upload/employees-import.blade.php b/Modules/HrmAddon/resources/views/employees/bulk-upload/employees-import.blade.php new file mode 100644 index 00000000..d2ae8932 --- /dev/null +++ b/Modules/HrmAddon/resources/views/employees/bulk-upload/employees-import.blade.php @@ -0,0 +1,152 @@ + diff --git a/Modules/HrmAddon/resources/views/employees/create.blade.php b/Modules/HrmAddon/resources/views/employees/create.blade.php new file mode 100644 index 00000000..01856374 --- /dev/null +++ b/Modules/HrmAddon/resources/views/employees/create.blade.php @@ -0,0 +1,160 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Create Employee') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Add new Employee') }}

+ +
+ + {{__('Bulk Upload')}} + + + @usercan('employees.read') + {{ __('Employee List') }} + @endusercan +
+
+
+
+ @csrf +
+
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + {{ __('Add Image') }} +
+ + + Preview + +
+
+
+
+
+ + @usercan('employees.create') + + @endusercan +
+
+
+
+
+
+
+
+
+
+@endsection + +@push('modal') + @include('hrmaddon::employees.bulk-upload.employees-import') +@endpush diff --git a/Modules/HrmAddon/resources/views/employees/datas.blade.php b/Modules/HrmAddon/resources/views/employees/datas.blade.php new file mode 100644 index 00000000..5749a0c3 --- /dev/null +++ b/Modules/HrmAddon/resources/views/employees/datas.blade.php @@ -0,0 +1,110 @@ +
+ + + + @usercan('employees.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + + + + + @foreach ($employees as $employee) + + @usercan('employees.delete') + + @endusercan + + + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}. {{ __('Image') }}. {{ __('Branch') }} {{ __('Name') }} {{ __('Department') }} {{ __('Designation') }} {{ __('shift') }} {{ __('Phone') }} {{ __('Salary') }} {{ __('Action') }}
+ + {{ ($employees->currentPage() - 1) * $employees->perPage() + $loop->iteration }} + Img + {{ $employee->branch->name ?? '' }}{{ $employee->name }}{{ $employee->department->name ?? '' }}{{ $employee->designation->name ?? '' }}{{ $employee->shift->name ?? '' }}{{ $employee->phone }}{{ currency_format($employee->amount, 'icon', 2, business_currency()) }}
+
+ +
+ {{ $employees->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/employees/edit.blade.php b/Modules/HrmAddon/resources/views/employees/edit.blade.php new file mode 100644 index 00000000..293ca499 --- /dev/null +++ b/Modules/HrmAddon/resources/views/employees/edit.blade.php @@ -0,0 +1,150 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Edit Employee') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Edit Employee') }}

+ @usercan('employees.read') + {{ __('Employee List') }} + @endusercan +
+
+
+ @csrf + @method('put') +
+
+
+ + +
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ +
+ + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ +
+
+
+ + + + + + {{ __('Add Image') }} +
+ + + Preview + +
+
+
+
+
+ + @usercan('employees.update') + + @endusercan +
+
+
+
+
+
+
+
+
+
+@endsection diff --git a/Modules/HrmAddon/resources/views/employees/index.blade.php b/Modules/HrmAddon/resources/views/employees/index.blade.php new file mode 100644 index 00000000..edc3ed26 --- /dev/null +++ b/Modules/HrmAddon/resources/views/employees/index.blade.php @@ -0,0 +1,84 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Employee List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Employee List') }}

+ @usercan('employees.create') + {{ __('Add new Employee') }} + @endusercan +
+
+ @include('business::print.header') +

{{ __('Employee List') }}

+
+
+
+ +
+ +
+ + +
+ + @if(auth()->user()->accessToMultiBranch()) + + @endif + + +
+
+
+
+
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::employees.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::employees.view') +@endpush + diff --git a/Modules/HrmAddon/resources/views/employees/view.blade.php b/Modules/HrmAddon/resources/views/employees/view.blade.php new file mode 100644 index 00000000..7f0f068a --- /dev/null +++ b/Modules/HrmAddon/resources/views/employees/view.blade.php @@ -0,0 +1,81 @@ + diff --git a/Modules/HrmAddon/resources/views/holidays/create.blade.php b/Modules/HrmAddon/resources/views/holidays/create.blade.php new file mode 100644 index 00000000..4286c627 --- /dev/null +++ b/Modules/HrmAddon/resources/views/holidays/create.blade.php @@ -0,0 +1,48 @@ + diff --git a/Modules/HrmAddon/resources/views/holidays/datas.blade.php b/Modules/HrmAddon/resources/views/holidays/datas.blade.php new file mode 100644 index 00000000..9424f77f --- /dev/null +++ b/Modules/HrmAddon/resources/views/holidays/datas.blade.php @@ -0,0 +1,77 @@ +
+ + + + @usercan('holidays.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + + @foreach ($holidays as $holiday) + + @usercan('holidays.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Name') }}{{ __('Branch') }}{{ __('Start Date') }}{{ __('End Date') }}{{ __('Description') }}{{ __('Action') }}
+ + {{ ($holidays->currentPage() - 1) * $holidays->perPage() + $loop->iteration }}{{ $holiday->name }}{{ $holiday->branch->name ?? '' }}{{ formatted_date($holiday->start_date) }}{{ formatted_date($holiday->end_date) }}{{ Str::limit($holiday->description, 20, '...') }}
+
+
+ {{ $holidays->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/holidays/edit.blade.php b/Modules/HrmAddon/resources/views/holidays/edit.blade.php new file mode 100644 index 00000000..4cb49fa4 --- /dev/null +++ b/Modules/HrmAddon/resources/views/holidays/edit.blade.php @@ -0,0 +1,50 @@ + + diff --git a/Modules/HrmAddon/resources/views/holidays/index.blade.php b/Modules/HrmAddon/resources/views/holidays/index.blade.php new file mode 100644 index 00000000..3e536e88 --- /dev/null +++ b/Modules/HrmAddon/resources/views/holidays/index.blade.php @@ -0,0 +1,80 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Holiday List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Holiday List') }}

+ @usercan('holidays.create') + {{ __('Add new Holiday') }} + @endusercan +
+
+
+ +
+ +
+ + +
+ + @if(auth()->user()->accessToMultiBranch()) + + @endif + + +
+
+
+
+
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::holidays.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::holidays.create') + @include('hrmaddon::holidays.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/leave-types/create.blade.php b/Modules/HrmAddon/resources/views/leave-types/create.blade.php new file mode 100644 index 00000000..6f01741b --- /dev/null +++ b/Modules/HrmAddon/resources/views/leave-types/create.blade.php @@ -0,0 +1,37 @@ + + diff --git a/Modules/HrmAddon/resources/views/leave-types/datas.blade.php b/Modules/HrmAddon/resources/views/leave-types/datas.blade.php new file mode 100644 index 00000000..f4f6acf0 --- /dev/null +++ b/Modules/HrmAddon/resources/views/leave-types/datas.blade.php @@ -0,0 +1,74 @@ +
+ + + + @usercan('leave-types.delete') + + @endusercan + + + + + + + + + @foreach ($leave_types as $leave_type) + + @usercan('leave-types.delete') + + @endusercan + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Name') }}{{ __('Description') }}{{ __('Status') }}{{ __('Action') }}
+ + {{ ($leave_types->currentPage() - 1) * $leave_types->perPage() + $loop->iteration }}{{ $leave_type->name }}{{ Str::limit($leave_type->description, 20, '...') }} + +
+
+
+ {{ $leave_types->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/leave-types/edit.blade.php b/Modules/HrmAddon/resources/views/leave-types/edit.blade.php new file mode 100644 index 00000000..3e7f490a --- /dev/null +++ b/Modules/HrmAddon/resources/views/leave-types/edit.blade.php @@ -0,0 +1,37 @@ + diff --git a/Modules/HrmAddon/resources/views/leave-types/index.blade.php b/Modules/HrmAddon/resources/views/leave-types/index.blade.php new file mode 100644 index 00000000..2752101a --- /dev/null +++ b/Modules/HrmAddon/resources/views/leave-types/index.blade.php @@ -0,0 +1,64 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Leave Type List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Leave Type List') }}

+ @usercan('leave-types.read') + {{ __('Add Leave Type') }} + @endusercan +
+
+
+ +
+
+ + +
+ +
+
+
+
+
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::leave-types.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::leave-types.create') + @include('hrmaddon::leave-types.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/leaves/create.blade.php b/Modules/HrmAddon/resources/views/leaves/create.blade.php new file mode 100644 index 00000000..067eac69 --- /dev/null +++ b/Modules/HrmAddon/resources/views/leaves/create.blade.php @@ -0,0 +1,103 @@ + + + diff --git a/Modules/HrmAddon/resources/views/leaves/datas.blade.php b/Modules/HrmAddon/resources/views/leaves/datas.blade.php new file mode 100644 index 00000000..5a5cd6fe --- /dev/null +++ b/Modules/HrmAddon/resources/views/leaves/datas.blade.php @@ -0,0 +1,100 @@ +
+ + + + @usercan('leaves.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + + + + + + @foreach ($leaves as $leave) + + @usercan('leaves.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + @if ($leave->status == 'pending') + + @elseif ($leave->status == 'approved') + + @elseif ($leave->status == 'rejected') + + @endif + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Employee') }}{{ __('Branch') }}{{ __('Month') }}{{ __('Department') }}{{ __('Start Date') }}{{ __('End Date') }}{{ __('Leave Type') }}{{ __('Leave Duration') }}{{ __('Status') }}{{ __('Action') }}
+ + {{ ($leaves->currentPage() - 1) * $leaves->perPage() + $loop->iteration }}{{ $leave->employee->name ?? '' }}{{ $leave->branch->name ?? '' }}{{ ucfirst($leave->month) }}{{ $leave->department->name ?? '' }}{{ formatted_date($leave->start_date) }}{{ formatted_date($leave->end_date) }}{{ $leave->leave_type->name ?? '' }}{{ $leave->leave_duration }} {{ __('Days') }} +
Pending
+
+
Approved
+
+
Rejected
+
+
+
+ {{ $leaves->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/leaves/edit.blade.php b/Modules/HrmAddon/resources/views/leaves/edit.blade.php new file mode 100644 index 00000000..05bb5d30 --- /dev/null +++ b/Modules/HrmAddon/resources/views/leaves/edit.blade.php @@ -0,0 +1,106 @@ + + + diff --git a/Modules/HrmAddon/resources/views/leaves/index.blade.php b/Modules/HrmAddon/resources/views/leaves/index.blade.php new file mode 100644 index 00000000..a4840066 --- /dev/null +++ b/Modules/HrmAddon/resources/views/leaves/index.blade.php @@ -0,0 +1,107 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Leave List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Leave List') }}

+ @usercan('leaves.create') + {{ __('Add new Leave') }} + @endusercan +
+
+
+
+
+
+ + +
+ + @if(auth()->user()->accessToMultiBranch()) +
+ + +
+ @endif + + + +
+ + +
+ +
+ + +
+ +
+
+ +
+ +
+
+ +
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::leaves.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::leaves.create') + @include('hrmaddon::leaves.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/payrolls/create.blade.php b/Modules/HrmAddon/resources/views/payrolls/create.blade.php new file mode 100644 index 00000000..1bb2e5be --- /dev/null +++ b/Modules/HrmAddon/resources/views/payrolls/create.blade.php @@ -0,0 +1,99 @@ + + diff --git a/Modules/HrmAddon/resources/views/payrolls/datas.blade.php b/Modules/HrmAddon/resources/views/payrolls/datas.blade.php new file mode 100644 index 00000000..0db66b6b --- /dev/null +++ b/Modules/HrmAddon/resources/views/payrolls/datas.blade.php @@ -0,0 +1,88 @@ +
+ + + + @usercan('payrolls.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + + + + + + @foreach ($payrolls as $payroll) + + @usercan('payrolls.delete') + + @endusercan + + + @if (auth()->user()->accessToMultiBranch()) + + @endif + + + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Employee') }}{{ __('Branch') }}{{ __('Payment Year') }}{{ __('Month') }}{{ __('Receipt No') }}{{ __('date') }}{{ __('Amount') }}{{ __('Payment Type') }}{{ __('Status') }}{{ __('Action') }}
+ + {{ ($payrolls->currentPage() - 1) * $payrolls->perPage() + $loop->iteration }}{{ $payroll->employee->name ?? '' }}{{ $payroll->branch->name ?? '' }}{{ $payroll->payemnt_year }}{{ ucfirst($payroll->month) }}{{ $payroll->puid }}{{ formatted_date($payroll->date) }}{{ currency_format($payroll->amount, 'icon', 2, business_currency()) }}{{ $payroll->payment_type->name ?? 'Cash' }} +
Paid
+
+
+
+ {{ $payrolls->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/payrolls/edit.blade.php b/Modules/HrmAddon/resources/views/payrolls/edit.blade.php new file mode 100644 index 00000000..a65ec3f8 --- /dev/null +++ b/Modules/HrmAddon/resources/views/payrolls/edit.blade.php @@ -0,0 +1,97 @@ + + diff --git a/Modules/HrmAddon/resources/views/payrolls/index.blade.php b/Modules/HrmAddon/resources/views/payrolls/index.blade.php new file mode 100644 index 00000000..f371a1ce --- /dev/null +++ b/Modules/HrmAddon/resources/views/payrolls/index.blade.php @@ -0,0 +1,107 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Payroll List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Payroll List') }}

+ @usercan('payrolls.create') + {{ __('Add new Payroll') }} + @endusercan +
+
+
+
+ +
+ +
+ + +
+ + @if(auth()->user()->accessToMultiBranch()) +
+ + +
+ @endif + + + +
+ + +
+ +
+ + +
+ +
+
+
+ +
+
+
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::payrolls.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::payrolls.create') + @include('hrmaddon::payrolls.edit') +@endpush diff --git a/Modules/HrmAddon/resources/views/reports/attendances/datas.blade.php b/Modules/HrmAddon/resources/views/reports/attendances/datas.blade.php new file mode 100644 index 00000000..8a30a20c --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/attendances/datas.blade.php @@ -0,0 +1,34 @@ +
+ + + + + + + + + + + + + + + @foreach ($attendances as $attendance) + + + + + + + + + + + @endforeach + + +
{{ __('SL') }}.{{ __('Employee') }}{{ __('Date') }}{{ __('Month') }}{{ __('Shift') }}{{ __('Time In') }}{{ __('Time Out') }}{{ __('Duration') }}
{{ ($attendances->currentPage() - 1) * $attendances->perPage() + $loop->iteration }}{{ $attendance->employee->name ?? '' }}{{ formatted_date($attendance->date) }}{{ ucfirst($attendance->month) }}{{ $attendance->shift->name ?? '' }}{{ formatted_time($attendance->time_in) }}{{ formatted_time($attendance->time_out) }}{{ formatTimeToWords($attendance->duration) }}
+
+
+ {{ $attendances->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/reports/attendances/excel.blade.php b/Modules/HrmAddon/resources/views/reports/attendances/excel.blade.php new file mode 100644 index 00000000..1df5aff6 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/attendances/excel.blade.php @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + @foreach ($attendances as $attendance) + + + + + + + + + + + @endforeach + +
{{ __('SL') }}.{{ __('Employee') }}{{ __('Date') }}{{ __('Month') }}{{ __('Shift') }}{{ __('Time In') }}{{ __('Time Out') }}{{ __('Duration') }}
{{ $loop->iteration }}{{ $attendance->employee->name ?? '' }}{{ formatted_date($attendance->date) }}{{ ucfirst($attendance->month) }}{{ $attendance->shift->name ?? '' }}{{ formatted_time($attendance->time_in) }}{{ formatted_time($attendance->time_out) }}{{ formatTimeToWords($attendance->duration) }}
diff --git a/Modules/HrmAddon/resources/views/reports/attendances/index.blade.php b/Modules/HrmAddon/resources/views/reports/attendances/index.blade.php new file mode 100644 index 00000000..09267973 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/attendances/index.blade.php @@ -0,0 +1,106 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Attendance Report') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Attendance Report') }}

+
+
+ @include('business::print.header') +

{{ __('Attendance Report List') }}

+
+
+
+
+ +
+
+ + +
+ + +
+ + +
+ +
+ + +
+ +
+
+
+
+ +
+
+
+ +
+ @include('hrmaddon::reports.attendances.datas') +
+ +
+
+
+@endsection diff --git a/Modules/HrmAddon/resources/views/reports/attendances/pdf.blade.php b/Modules/HrmAddon/resources/views/reports/attendances/pdf.blade.php new file mode 100644 index 00000000..f85c98f5 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/attendances/pdf.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.business.pdf.pdf_layout') + +@section('pdf_title') +
+ @include('business::print.header') +

{{ __('Attendance Report List') }}

+
+@endsection + +@section('pdf_content') + + + + + + + + + + + + + @foreach ($attendances as $attendance) + + + + + + + + + @endforeach + +
{{ __('Employee') }}{{ __('Date') }}{{ __('Shift') }}{{ __('Time In') }}{{ __('Time Out') }}{{ __('Duration') }}
+ {{ $attendance->employee->name ?? '' }} + + {{ formatted_date($attendance->date) }} + + {{ $attendance->shift->name ?? '' }} + + {{ formatted_time($attendance->time_in) }} + + {{ formatted_time($attendance->time_out) }} + + {{ formatTimeToWords($attendance->duration) }} +
+@endsection + diff --git a/Modules/HrmAddon/resources/views/reports/leaves/datas.blade.php b/Modules/HrmAddon/resources/views/reports/leaves/datas.blade.php new file mode 100644 index 00000000..a55e603c --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/leaves/datas.blade.php @@ -0,0 +1,47 @@ +
+ + + + + + + + + + + + + + + + @foreach ($leaves as $leave) + + + + + + + + + + @if ($leave->status == 'pending') + + @elseif ($leave->status == 'approved') + + @elseif ($leave->status == 'rejected') + + @endif + + @endforeach + +
{{ __('SL') }}.{{ __('Employee') }}{{ __('Month') }}{{ __('Department') }}{{ __('Start Date') }}{{ __('End Date') }}{{ __('Leave Type') }}{{ __('Leave Duration') }}{{ __('Status') }}
{{ ($leaves->currentPage() - 1) * $leaves->perPage() + $loop->iteration }}{{ $leave->employee->name ?? '' }}{{ ucfirst($leave->month) }}{{ $leave->department->name ?? '' }}{{ formatted_date($leave->start_date) }}{{ formatted_date($leave->end_date) }}{{ $leave->leave_type->name ?? '' }}{{ $leave->leave_duration }} {{ __('Days') }} +
{{__('Pending')}}
+
+
{{__('Approved')}}
+
+
{{__('Rejected')}}
+
+
+
+ {{ $leaves->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/reports/leaves/excel.blade.php b/Modules/HrmAddon/resources/views/reports/leaves/excel.blade.php new file mode 100644 index 00000000..7687b3e1 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/leaves/excel.blade.php @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + @foreach ($leaves as $leave) + + + + + + + + + + @if ($leave->status == 'pending') + + @elseif ($leave->status == 'approved') + + @elseif ($leave->status == 'rejected') + + @endif + + @endforeach + +
{{ __('SL') }}.{{ __('Employee') }}{{ __('Month') }}{{ __('Department') }}{{ __('Start Date') }}{{ __('End Date') }}{{ __('Leave Type') }}{{ __('Leave Duration') }}{{ __('Status') }}
{{ $loop->iteration }}{{ $leave->employee->name ?? '' }}{{ ucfirst($leave->month) }}{{ $leave->department->name ?? '' }}{{ formatted_date($leave->start_date) }}{{ formatted_date($leave->end_date) }}{{ $leave->leave_type->name ?? '' }}{{ $leave->leave_duration }} {{ __('Days') }} +
{{__('Pending')}}
+
+
{{__('Approved')}}
+
+
{{__('Rejected')}}
+
diff --git a/Modules/HrmAddon/resources/views/reports/leaves/index.blade.php b/Modules/HrmAddon/resources/views/reports/leaves/index.blade.php new file mode 100644 index 00000000..b58d8688 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/leaves/index.blade.php @@ -0,0 +1,106 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Leave Report') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Leave Report') }}

+
+
+ @include('business::print.header') +

{{ __('Leave Report List') }}

+
+
+
+
+ +
+
+ + +
+ + +
+ + +
+ +
+ + +
+
+
+
+
+ +
+
+
+ +
+ @include('hrmaddon::reports.leaves.datas') +
+ +
+
+
+@endsection + + diff --git a/Modules/HrmAddon/resources/views/reports/leaves/pdf.blade.php b/Modules/HrmAddon/resources/views/reports/leaves/pdf.blade.php new file mode 100644 index 00000000..4a378503 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/leaves/pdf.blade.php @@ -0,0 +1,60 @@ +@extends('layouts.business.pdf.pdf_layout') + +@section('pdf_title') +
+ @include('business::print.header') +

{{ __('Leave Report List') }}

+
+@endsection + +@section('pdf_content') + + + + + + + + + + + + + + @foreach ($leaves as $leave) + + + + + + + + + + @endforeach + +
{{ __('Employee') }}{{ __('Month') }}{{ __('Start Date') }}{{ __('End Date') }}{{ __('Leave Type') }}{{ __('Duration') }}{{ __('Status') }}
+ {{ $leave->employee?->name }} + + {{ ucfirst($leave->month) }} + + {{ formatted_date($leave->start_date) }} + + {{ formatted_date($leave->end_date) }} + + {{ $leave->leave_type?->name }} + + {{ $leave->leave_duration }} {{ __('Days') }} + + @if ($leave->status == 'pending') + {{__('Pending')}} + @elseif ($leave->status == 'approved') + {{__('Approved')}} + @elseif ($leave->status == 'rejected') + {{__('Rejected')}} + @endif +
+@endsection + diff --git a/Modules/HrmAddon/resources/views/reports/payrolls/datas.blade.php b/Modules/HrmAddon/resources/views/reports/payrolls/datas.blade.php new file mode 100644 index 00000000..87d9f319 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/payrolls/datas.blade.php @@ -0,0 +1,53 @@ +
+ + + + + + + + + + + + + + + @foreach ($payrolls as $payroll) + + + + + + + + + @if ($payroll->status == 'unpaid') + + @else + + @endif + + @endforeach + + @if ($payrolls->count() > 0) + + + + + + + + + + + @endif +
{{ __('SL') }}.{{ __('Employee') }}{{ __('Date') }}{{ __('Month') }}{{ __('Slip No') }}{{ __('Amount') }}{{ __('Payment Type') }}{{ __('Status') }}
{{ ($payrolls->currentPage() - 1) * $payrolls->perPage() + $loop->iteration }}{{ $payroll->employee->name ?? '' }}{{ formatted_date($payroll->date) }}{{ ucfirst($payroll->month) }}{{ $payroll->puid }}{{ currency_format($payroll->amount, currency: business_currency()) }}{{ $payroll->payment_type->name ?? 'Cash' }} +
Unpaid
+
+
Paid
+
+
+
+ {{ $payrolls->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/reports/payrolls/excel.blade.php b/Modules/HrmAddon/resources/views/reports/payrolls/excel.blade.php new file mode 100644 index 00000000..0caea6a4 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/payrolls/excel.blade.php @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + @foreach ($payrolls as $payroll) + + + + + + + + + @if ($payroll->status == 'unpaid') + + @else + + @endif + + @endforeach + + @if ($payrolls->count() > 0) + + + + + + + + + + + @endif +
{{ __('SL') }}.{{ __('Employee') }}{{ __('Date') }}{{ __('Month') }}{{ __('Slip No') }}{{ __('Amount') }}{{ __('Payment Type') }}{{ __('Status') }}
{{ $loop->iteration }}{{ $payroll->employee->name ?? '' }}{{ formatted_date($payroll->date) }}{{ ucfirst($payroll->month) }}{{ $payroll->puid }}{{ currency_format($payroll->amount, currency: business_currency()) }}{{ $payroll->payment_type->name ?? 'Cash' }} +
Unpaid
+
+
Paid
+
diff --git a/Modules/HrmAddon/resources/views/reports/payrolls/index.blade.php b/Modules/HrmAddon/resources/views/reports/payrolls/index.blade.php new file mode 100644 index 00000000..714e2925 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/payrolls/index.blade.php @@ -0,0 +1,104 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Payroll Report') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Payroll Report') }}

+
+
+ @include('business::print.header') +

{{ __('Payroll Report List') }}

+
+
+
+
+ +
+
+ + +
+ + +
+ + +
+
+ + +
+
+
+
+
+ +
+
+
+ +
+ @include('hrmaddon::reports.payrolls.datas') +
+ +
+
+
+@endsection + diff --git a/Modules/HrmAddon/resources/views/reports/payrolls/pdf.blade.php b/Modules/HrmAddon/resources/views/reports/payrolls/pdf.blade.php new file mode 100644 index 00000000..ff572b59 --- /dev/null +++ b/Modules/HrmAddon/resources/views/reports/payrolls/pdf.blade.php @@ -0,0 +1,65 @@ +@extends('layouts.business.pdf.pdf_layout') + +@section('pdf_title') +
+ @include('business::print.header') +

{{ __('Payroll Report List') }}

+
+@endsection + +@section('pdf_content') + + + + + + + + + + + + + @foreach ($payrolls as $payroll) + + + + + + + + + @endforeach + + @if ($payrolls->count() > 0) + + + + + + + + + + @endif +
{{ __('Employee') }}{{ __('Date') }}{{ __('Slip No') }}{{ __('Amount') }}{{ __('Payment') }}{{ __('Status') }}
+ {{ $payroll->employee->name ?? '' }} + + {{ formatted_date($payroll->date) }} + + {{ $payroll->puid }} + + {{ currency_format($payroll->amount, currency: business_currency()) }} + + {{ $payroll->payment_type->name ?? 'Cash' }} + + {{ $payroll->status == 'unpaid' ? 'Unpaid' : 'Paid' }} +
+ {{ __('Total') }} + + {{ currency_format($payrolls->sum('amount'), currency: business_currency()) }} +
+@endsection + diff --git a/Modules/HrmAddon/resources/views/shifts/create.blade.php b/Modules/HrmAddon/resources/views/shifts/create.blade.php new file mode 100644 index 00000000..8379ebf1 --- /dev/null +++ b/Modules/HrmAddon/resources/views/shifts/create.blade.php @@ -0,0 +1,68 @@ + diff --git a/Modules/HrmAddon/resources/views/shifts/datas.blade.php b/Modules/HrmAddon/resources/views/shifts/datas.blade.php new file mode 100644 index 00000000..13fbb8e2 --- /dev/null +++ b/Modules/HrmAddon/resources/views/shifts/datas.blade.php @@ -0,0 +1,85 @@ +
+ + + + @usercan('shifts.delete') + + @endusercan + + + + + + + + + + + + @foreach ($shifts as $shift) + + @usercan('shifts.delete') + + @endusercan + + + + + + + + + + @endforeach + + +
+
+ +
+
{{ __('SL') }}.{{ __('Name') }}{{ __('Start Time') }}{{ __('End Time') }}{{ __('Break Time') }}{{ __('Break Duration') }}{{ __('Status') }}{{ __('Action') }}
+ + {{ ($shifts->currentPage() - 1) * $shifts->perPage() + $loop->iteration }}{{ $shift->name }}{{ formatted_time($shift->start_time) }}{{ formatted_time($shift->end_time) }}{{ formatted_time($shift->start_break_time ?? '') }} - + {{ formatted_time($shift->end_break_time ?? '') }} {{ formatTimeToWords($shift->break_time) }} + +
+
+
+ {{ $shifts->links('vendor.pagination.bootstrap-5') }} +
diff --git a/Modules/HrmAddon/resources/views/shifts/edit.blade.php b/Modules/HrmAddon/resources/views/shifts/edit.blade.php new file mode 100644 index 00000000..dad635c4 --- /dev/null +++ b/Modules/HrmAddon/resources/views/shifts/edit.blade.php @@ -0,0 +1,69 @@ + diff --git a/Modules/HrmAddon/resources/views/shifts/index.blade.php b/Modules/HrmAddon/resources/views/shifts/index.blade.php new file mode 100644 index 00000000..510323bf --- /dev/null +++ b/Modules/HrmAddon/resources/views/shifts/index.blade.php @@ -0,0 +1,64 @@ +@extends('layouts.business.master') + +@section('title') + {{ __('Shift List') }} +@endsection + +@section('main_content') +
+
+
+
+
+

{{ __('Shift List') }}

+ @usercan('shifts.read') + {{ __('Add new Shift') }} + @endusercan +
+
+
+ +
+
+ + +
+ +
+
+
+
+
+
+

{{ __('items show') }}

+ +
+
+ +
+ @include('hrmaddon::shifts.datas') +
+ +
+
+
+@endsection + +@push('modal') + @include('hrmaddon::component.delete-modal') + @include('hrmaddon::shifts.create') + @include('hrmaddon::shifts.edit') +@endpush diff --git a/Modules/HrmAddon/routes/.gitkeep b/Modules/HrmAddon/routes/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Modules/HrmAddon/routes/api.php b/Modules/HrmAddon/routes/api.php new file mode 100644 index 00000000..600dd524 --- /dev/null +++ b/Modules/HrmAddon/routes/api.php @@ -0,0 +1,22 @@ +middleware(['auth:sanctum'])->name('api.')->group(function () { + Route::apiResource('departments', Hrm\DepartmentController::class); + Route::apiResource('designations', Hrm\DesignationController::class); + Route::apiResource('shifts', Hrm\ShiftController::class); + Route::post('shifts/status/{id}', [Hrm\ShiftController::class, 'status']); + Route::apiResource('employees', Hrm\EmployeeController::class); + Route::apiResource('attendances', Hrm\AttendanceController::class); + Route::apiResource('holidays', Hrm\HolidayController::class); + Route::apiResource('leave-types', Hrm\LeaveTypeController::class); + Route::apiResource('leaves', Hrm\LeaveController::class); + Route::apiResource('payrolls', Hrm\PayrollController::class); + + Route::apiResource('attendance-reports', Hrm\AttendanceReportController::class)->only('index'); + Route::resource('payroll-reports', HRM\PayrollReportController::class)->only('index'); + Route::resource('leave-reports', HRM\LeaveReportController::class)->only('index'); +}); diff --git a/Modules/HrmAddon/routes/web.php b/Modules/HrmAddon/routes/web.php new file mode 100644 index 00000000..2dcce66e --- /dev/null +++ b/Modules/HrmAddon/routes/web.php @@ -0,0 +1,76 @@ + 'hrm.', 'prefix' => 'hrm', 'middleware' => ['users', 'expired']], function () { + + Route::resource('department', HRM\AcnooDepartmentController::class); + Route::post('department/filter', [HRM\AcnooDepartmentController::class, 'acnooFilter'])->name('department.filter'); + Route::post('department/status/{id}', [HRM\AcnooDepartmentController::class, 'status'])->name('department.status'); + Route::post('department/delete-all', [HRM\AcnooDepartmentController::class, 'deleteAll'])->name('department.delete-all'); + + Route::resource('designations', HRM\AcnooDesignationController::class); + Route::post('designations/filter', [HRM\AcnooDesignationController::class, 'acnooFilter'])->name('designations.filter'); + Route::post('designations/status/{id}', [HRM\AcnooDesignationController::class, 'status'])->name('designations.status'); + Route::post('designations/delete-all', [HRM\AcnooDesignationController::class, 'deleteAll'])->name('designations.delete-all'); + + Route::resource('shifts', HRM\AcnooShiftController::class); + Route::post('shifts/filter', [HRM\AcnooShiftController::class, 'acnooFilter'])->name('shifts.filter'); + Route::post('shifts/status/{id}', [HRM\AcnooShiftController::class, 'status'])->name('shifts.status'); + Route::post('shifts/delete-all', [HRM\AcnooShiftController::class, 'deleteAll'])->name('shifts.delete-all'); + + Route::resource('employees', HRM\AcnooEmployeeController::class)->except('show'); + Route::post('employees/filter', [HRM\AcnooEmployeeController::class, 'acnooFilter'])->name('employees.filter'); + Route::post('employees/status/{id}', [HRM\AcnooEmployeeController::class, 'status'])->name('employees.status'); + Route::post('employees/delete-all', [HRM\AcnooEmployeeController::class, 'deleteAll'])->name('employees.delete-all'); + Route::post('employees/bulk-store', [HRM\AcnooEmployeeController::class, 'bulkStore'])->name('employees.bulk-store'); + + Route::resource('leave-types', HRM\AcnooLeaveTypeController::class)->except('show'); + Route::post('leave-types/status/{id}', [HRM\AcnooLeaveTypeController::class, 'status'])->name('leave-types.status'); + Route::post('leave-types/delete-all', [HRM\AcnooLeaveTypeController::class, 'deleteAll'])->name('leave-types.delete-all'); + Route::post('leave-types/filter', [HRM\AcnooLeaveTypeController::class, 'acnooFilter'])->name('leave-types.filter'); + + Route::resource('leaves', HRM\AcnooLeaveController::class); + Route::post('leaves/delete-all', [HRM\AcnooLeaveController::class, 'deleteAll'])->name('leaves.delete-all'); + Route::post('leave/filter', [HRM\AcnooLeaveController::class, 'acnooFilter'])->name('leaves.filter'); + Route::post('leave/status/{id}', [HRM\AcnooLeaveController::class, 'status'])->name('leaves.status'); + Route::get('leave/department', [HRM\AcnooLeaveController::class, 'getDepartment'])->name('leaves.get.department'); + + Route::resource('holidays', HRM\AcnooHolidayController::class); + Route::post('holidays/filter', [HRM\AcnooHolidayController::class, 'acnooFilter'])->name('holidays.filter'); + Route::post('holidays/delete-all', [HRM\AcnooHolidayController::class, 'deleteAll'])->name('holidays.delete-all'); + + Route::resource('attendances', HRM\AcnooAttendanceController::class)->except('show'); + Route::post('attendances/delete-all', [HRM\AcnooAttendanceController::class, 'deleteAll'])->name('attendances.delete-all'); + Route::post('attendances/filter', [HRM\AcnooAttendanceController::class, 'acnooFilter'])->name('attendances.filter'); + Route::get('attendances/shift', [HRM\AcnooAttendanceController::class, 'getShift'])->name('attendances.getShift'); + + Route::resource('payrolls', HRM\AcnooPayrollController::class)->except('show'); + Route::post('payrolls/delete-all', [HRM\AcnooPayrollController::class, 'deleteAll'])->name('payrolls.delete-all'); + Route::post('payrolls/filter', [HRM\AcnooPayrollController::class, 'acnooFilter'])->name('payrolls.filter'); + Route::post('payrolls/status/{id}', [HRM\AcnooPayrollController::class, 'status'])->name('payrolls.status'); + Route::get('payrolls/amount', [HRM\AcnooPayrollController::class, 'getEmpAmount'])->name('payrolls.getEmpAmount'); + + Route::resource('attendance-reports', HRM\AcnooAttendanceReportController::class)->only('index'); + Route::post('attendance-reports/filter', [HRM\AcnooAttendanceReportController::class, 'acnooFilter'])->name('attendance-reports.filter'); + Route::get('attendance-reports/csv', [HRM\AcnooAttendanceReportController::class, 'exportCsv'])->name('attendance-reports.csv'); + Route::get('attendance-reports/excel', [HRM\AcnooAttendanceReportController::class, 'exportExcel'])->name('attendance-reports.excel'); + Route::get('attendance-reports/pdf', [HRM\AcnooAttendanceReportController::class, 'exportPdf'])->name('attendance-reports.pdf'); + + Route::resource('payroll-reports', HRM\AcnooPayrollReportController::class)->only('index'); + Route::post('payroll-reports/filter', [HRM\AcnooPayrollReportController::class, 'acnooFilter'])->name('payroll-reports.filter'); + Route::get('payroll-reports/csv', [HRM\AcnooPayrollReportController::class, 'exportCsv'])->name('payroll-reports.csv'); + Route::get('payroll-reports/excel', [HRM\AcnooPayrollReportController::class, 'exportExcel'])->name('payroll-reports.excel'); + Route::get('payroll-reports/pdf', [HRM\AcnooPayrollReportController::class, 'exportPdf'])->name('payroll-reports.pdf'); + + Route::resource('leave-reports', HRM\AcnooLeaveReportController::class)->only('index'); + Route::post('leave-reports/filter', [HRM\AcnooLeaveReportController::class, 'acnooFilter'])->name('leave-reports.filter'); + Route::get('leave-reports/csv', [HRM\AcnooLeaveReportController::class, 'exportCsv'])->name('leave-reports.csv'); + Route::get('leave-reports/excel', [HRM\AcnooLeaveReportController::class, 'exportExcel'])->name('leave-reports.excel'); + Route::get('leave-reports/pdf', [HRM\AcnooLeaveReportController::class, 'exportPdf'])->name('leave-reports.pdf'); + + Route::resource('attendance-report-history', HRM\AcnooAttendanceReportHistoryController::class)->only('index'); + Route::resource('payroll-report-history', HRM\AcnooPayrollReportHistoryController::class)->only('index'); + Route::resource('leave-report-history', HRM\AcnooLeaveReportHistoryController::class)->only('index'); +}); diff --git a/Modules/HrmAddon/vite.config.js b/Modules/HrmAddon/vite.config.js new file mode 100644 index 00000000..0d92de25 --- /dev/null +++ b/Modules/HrmAddon/vite.config.js @@ -0,0 +1,21 @@ +import { defineConfig } from 'vite'; +import laravel from 'laravel-vite-plugin'; + +export default defineConfig({ + build: { + outDir: '../../public/build-hrmaddon', + emptyOutDir: true, + manifest: true, + }, + plugins: [ + laravel({ + publicDirectory: '../../public', + buildDirectory: 'build-hrmaddon', + input: [ + __dirname + '/resources/assets/sass/app.scss', + __dirname + '/resources/assets/js/app.js' + ], + refresh: true, + }), + ], +}); \ No newline at end of file diff --git a/app/Http/Controllers/Admin/AddonController.php b/app/Http/Controllers/Admin/AddonController.php index 988db27a..76e5be63 100644 --- a/app/Http/Controllers/Admin/AddonController.php +++ b/app/Http/Controllers/Admin/AddonController.php @@ -19,7 +19,6 @@ public function index() public function store(Request $request) { $request->validate([ - 'purchase_code' => 'required', 'file' => 'required|file|mimes:zip', ]); @@ -27,7 +26,7 @@ public function store(Request $request) $is_valid = true; $module_name = pathinfo($request->file('file')->getClientOriginalName(), PATHINFO_FILENAME); - if ($is_valid || $request->purchase_code == 'acnoo_license') { + if (true) { $uploadedFile = $request->file('file'); // Open the ZIP file using ZipArchive without saving it first diff --git a/app/Traits/ImageUrlTrait.php b/app/Traits/ImageUrlTrait.php new file mode 100644 index 00000000..5ea81e26 --- /dev/null +++ b/app/Traits/ImageUrlTrait.php @@ -0,0 +1,49 @@ +imageFields) && in_array($key, $this->imageFields) && $value) { + // Check if it's already a full URL + if (!filter_var($value, FILTER_VALIDATE_URL)) { + return asset($value); + } + } + + return $value; + } + + /** + * Handle serialization to array. + * + * @return array + */ + public function attributesToArray() + { + $attributes = parent::attributesToArray(); + + if (isset($this->imageFields)) { + foreach ($this->imageFields as $field) { + if (isset($attributes[$field]) && $attributes[$field]) { + if (!filter_var($attributes[$field], FILTER_VALIDATE_URL)) { + $attributes[$field] = asset($attributes[$field]); + } + } + } + } + + return $attributes; + } +} diff --git a/docker_vendor_issue_analysis.txt b/docker_vendor_issue_analysis.txt new file mode 100644 index 00000000..b06f8a7d --- /dev/null +++ b/docker_vendor_issue_analysis.txt @@ -0,0 +1,47 @@ +Analisis Masalah Docker: Mengapa Aplikasi Error Jika Folder 'vendor' Tidak Dinaikkan + +Penyebab utama mengapa aplikasi PHP (seperti Laravel) di dalam Docker menjadi error ketika folder 'vendor' tidak diikutsertakan (tidak dinaikkan/di-upload), sangat berkaitan dengan cara kerja Composer dan konfigurasi Volume Mount pada Docker. + +Berikut adalah analisa lengkapnya: + +1. Folder 'vendor' Berisi Core Aplikasi dan Dependensi (Akar Masalah) +Pada aplikasi PHP modern, folder 'vendor' adalah nyawa dari aplikasi tersebut. Folder ini tidak hanya berisi library pihak ketiga, tetapi juga berisi core framework (misalnya Laravel/Symphony) dan file autoload.php. +Jika folder 'vendor' tidak ada, baris kode pertama di aplikasi Anda (biasanya di public/index.php yang memanggil require __DIR__.'/../vendor/autoload.php';) akan gagal dieksekusi dan menghasilkan Fatal Error: Failed to open stream. + +2. Efek "Timpaan" Volume Mount di docker-compose.yml +Berdasarkan file docker-compose.yml Anda, terdapat konfigurasi volume mount: + volumes: + - .:/var/www/html + +Ini adalah penyebab spesifik di environment Docker. +- Di dalam Dockerfile, Anda sebenarnya sudah menjalankan 'composer install' (pada baris ke-62), yang artinya Docker sudah susah payah membuat folder 'vendor' di dalam image Docker. +- Namun, saat container dijalankan melalui docker-compose, baris 'volumes: - .:/var/www/html' memerintahkan Docker untuk menimpa (overwrite/mount) isi /var/www/html di dalam container dengan folder '.' (folder lokal Anda) dari host. +- Akibatnya: Jika di folder lokal Anda (host/server) tidak ada folder 'vendor' (karena tidak ikut dinaikkan), maka folder 'vendor' yang ada di dalam image Docker akan "tertutup" atau menghilang karena tergantikan oleh isi folder lokal Anda yang kosong tanpa 'vendor'. + +3. Mengapa entrypoint.sh Gagal Menyelamatkan? +Anda mungkin bertanya, "Tapi kan di entrypoint.sh ada perintah composer install, kenapa tetap error?" +Secara teori, skrip entrypoint.sh Anda sudah dirancang dengan baik untuk melakukan fallback (otomatis install jika vendor hilang). Namun, seringkali hal ini gagal di environment production karena: +- Timeout / Jaringan: Mengunduh ratusan package Composer saat container baru start sering mengalami timeout atau gagal karena batas waktu. +- Limit RAM (Out of Memory): Menjalankan composer install membutuhkan RAM yang cukup besar. Seringkali server VPS mengalami OOM (Out Of Memory) / Killed saat proses berjalan. +- Masalah Permission: Karena entrypoint.sh biasanya dijalankan oleh user root Docker, folder 'vendor' yang tercipta mendadak akan berstatus owner: root. Ketika server web (php-fpm / nginx yang menggunakan user www-data) mencoba membaca file tersebut, aksesnya ditolak (Permission Denied). + +======================================================= +SOLUSI YANG DIREKOMENDASIKAN +======================================================= + +Tergantung pada tujuan Anda (Production vs Development lokal): + +[A] Jika untuk Production / Server VPS (Rekomendasi Utama) +Jangan gunakan bind mount seluruh source code di production. Hapus atau beri komentar pada baris volume utama di docker-compose.yml: + + volumes: + # - .:/var/www/html <-- Matikan/hapus baris ini untuk production + - ./entrypoint.sh:/entrypoint.sh + +Dengan menghapus baris ini, Docker akan murni menggunakan kode dan folder 'vendor' yang sudah ter-build secara permanen di dalam image (hasil dari Dockerfile), sehingga Anda tidak perlu menaikkan folder 'vendor' dari lokal Anda sama sekali. + +[B] Jika untuk Local Development +Anda memang disarankan untuk menggunakan volume mount agar bisa live reload saat mengedit kode. Namun, Anda harus memastikan sinkronisasi 'vendor': +1. Jalankan 'composer install' terlebih dahulu di lokal Anda sebelum menjalankan docker, ATAU +2. Jalankan dari dalam container agar foldernya terbuat dan memantul ke luar (ke host Anda): + docker exec -it kulakpos_app composer install diff --git a/modules_statuses.json b/modules_statuses.json index f8824aec..75f7e158 100644 --- a/modules_statuses.json +++ b/modules_statuses.json @@ -3,5 +3,6 @@ "codecanyon-380T4Hnk-pospro-web-addon-saas": true, "codecanyon-Zx7fTSUL-pospro-web-addon-saas": true, "WarehouseAddon": true, - "MultiBranchAddon": true + "MultiBranchAddon": true, + "HrmAddon": true } \ No newline at end of file diff --git a/public/uploads/26/05/1777910268-364.png b/public/uploads/26/05/1777910268-364.png new file mode 100644 index 0000000000000000000000000000000000000000..2f94f84750b165761369b89de49cb772135c0b55 GIT binary patch literal 18802 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 $baseDir . '/app/Services/PdfService.php', 'App\\Traits\\DateFilterTrait' => $baseDir . '/app/Traits/DateFilterTrait.php', 'App\\Traits\\DateRangeTrait' => $baseDir . '/app/Traits/DateRangeTrait.php', + 'App\\Traits\\ImageUrlTrait' => $baseDir . '/app/Traits/ImageUrlTrait.php', 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Aws\\ACMPCA\\ACMPCAClient' => $vendorDir . '/aws/aws-sdk-php/src/ACMPCA/ACMPCAClient.php', 'Aws\\ACMPCA\\Exception\\ACMPCAException' => $vendorDir . '/aws/aws-sdk-php/src/ACMPCA/Exception/ACMPCAException.php', @@ -7205,6 +7206,48 @@ 'Modules\\Business\\App\\Http\\Controllers\\UserRoleController' => $baseDir . '/Modules/Business/App/Http/Controllers/UserRoleController.php', 'Modules\\Business\\App\\Providers\\BusinessServiceProvider' => $baseDir . '/Modules/Business/App/Providers/BusinessServiceProvider.php', 'Modules\\Business\\App\\Providers\\RouteServiceProvider' => $baseDir . '/Modules/Business/App/Providers/RouteServiceProvider.php', + 'Modules\\HrmAddon\\App\\Exports\\ExportAttendanceReport' => $baseDir . '/Modules/HrmAddon/App/Exports/ExportAttendanceReport.php', + 'Modules\\HrmAddon\\App\\Exports\\ExportLeaveReport' => $baseDir . '/Modules/HrmAddon/App/Exports/ExportLeaveReport.php', + 'Modules\\HrmAddon\\App\\Exports\\ExportPayrollReport' => $baseDir . '/Modules/HrmAddon/App/Exports/ExportPayrollReport.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooAttendanceController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooAttendanceReportController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooAttendanceReportHistoryController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportHistoryController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooDepartmentController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooDepartmentController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooDesignationController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooDesignationController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooEmployeeController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooEmployeeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooHolidayController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooHolidayController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveReportController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveReportHistoryController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportHistoryController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveTypeController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveTypeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooPayrollController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooPayrollReportController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooPayrollReportHistoryController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportHistoryController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooShiftController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/AcnooShiftController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\AttendanceController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\AttendanceReportController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\DepartmentController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/DepartmentController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\DesignationController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/DesignationController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\EmployeeController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/EmployeeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\HolidayController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/HolidayController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\LeaveController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/LeaveController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\LeaveReportController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/LeaveReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\LeaveTypeController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/LeaveTypeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\PayrollController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/PayrollController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\PayrollReportController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/PayrollReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\ShiftController' => $baseDir . '/Modules/HrmAddon/App/Http/Controllers/Api/ShiftController.php', + 'Modules\\HrmAddon\\App\\Models\\Attendance' => $baseDir . '/Modules/HrmAddon/App/Models/Attendance.php', + 'Modules\\HrmAddon\\App\\Models\\Department' => $baseDir . '/Modules/HrmAddon/App/Models/Department.php', + 'Modules\\HrmAddon\\App\\Models\\Designation' => $baseDir . '/Modules/HrmAddon/App/Models/Designation.php', + 'Modules\\HrmAddon\\App\\Models\\Employee' => $baseDir . '/Modules/HrmAddon/App/Models/Employee.php', + 'Modules\\HrmAddon\\App\\Models\\Holiday' => $baseDir . '/Modules/HrmAddon/App/Models/Holiday.php', + 'Modules\\HrmAddon\\App\\Models\\Leave' => $baseDir . '/Modules/HrmAddon/App/Models/Leave.php', + 'Modules\\HrmAddon\\App\\Models\\LeaveType' => $baseDir . '/Modules/HrmAddon/App/Models/LeaveType.php', + 'Modules\\HrmAddon\\App\\Models\\Payroll' => $baseDir . '/Modules/HrmAddon/App/Models/Payroll.php', + 'Modules\\HrmAddon\\App\\Models\\Shift' => $baseDir . '/Modules/HrmAddon/App/Models/Shift.php', + 'Modules\\HrmAddon\\App\\Providers\\HrmAddonServiceProvider' => $baseDir . '/Modules/HrmAddon/App/Providers/HrmAddonServiceProvider.php', + 'Modules\\HrmAddon\\App\\Providers\\RouteServiceProvider' => $baseDir . '/Modules/HrmAddon/App/Providers/RouteServiceProvider.php', + 'Modules\\HrmAddon\\Database\\Seeders\\HrmAddonDatabaseSeeder' => $baseDir . '/Modules/HrmAddon/Database/Seeders/HrmAddonDatabaseSeeder.php', 'Modules\\MultiBranchAddon\\App\\Http\\Controllers\\AcnooBranchController' => $baseDir . '/Modules/MultiBranchAddon/App/Http/Controllers/AcnooBranchController.php', 'Modules\\MultiBranchAddon\\App\\Http\\Controllers\\Api\\AcnooBranchController' => $baseDir . '/Modules/MultiBranchAddon/App/Http/Controllers/Api/AcnooBranchController.php', 'Modules\\MultiBranchAddon\\App\\Providers\\MultiBranchAddonServiceProvider' => $baseDir . '/Modules/MultiBranchAddon/App/Providers/MultiBranchAddonServiceProvider.php', diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php index 0ecd080b..603fc4ab 100755 --- a/vendor/composer/autoload_psr4.php +++ b/vendor/composer/autoload_psr4.php @@ -51,8 +51,8 @@ 'Svg\\' => array($vendorDir . '/dompdf/php-svg-lib/src/Svg'), 'Stripe\\' => array($vendorDir . '/stripe/stripe-php/lib'), 'Spatie\\Permission\\' => array($vendorDir . '/spatie/laravel-permission/src'), - 'Spatie\\LaravelIgnition\\' => array($vendorDir . '/spatie/laravel-ignition/src', $vendorDir . '/spatie/error-solutions/legacy/laravel-ignition'), - 'Spatie\\Ignition\\' => array($vendorDir . '/spatie/ignition/src', $vendorDir . '/spatie/error-solutions/legacy/ignition'), + 'Spatie\\LaravelIgnition\\' => array($vendorDir . '/spatie/error-solutions/legacy/laravel-ignition', $vendorDir . '/spatie/laravel-ignition/src'), + 'Spatie\\Ignition\\' => array($vendorDir . '/spatie/error-solutions/legacy/ignition', $vendorDir . '/spatie/ignition/src'), 'Spatie\\FlareClient\\' => array($vendorDir . '/spatie/flare-client-php/src'), 'Spatie\\ErrorSolutions\\' => array($vendorDir . '/spatie/error-solutions/src'), 'Spatie\\Color\\' => array($vendorDir . '/spatie/color/src'), diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 5433cad5..18ddd5e6 100755 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -22,6 +22,8 @@ public static function getLoader() return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInite18b3d3bc6afaf5dd5c2b53c80a29450', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); spl_autoload_unregister(array('ComposerAutoloaderInite18b3d3bc6afaf5dd5c2b53c80a29450', 'loadClassLoader')); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 61e05a00..b2bbc947 100755 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -140,33 +140,33 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 ); public static $prefixLengthsPsr4 = array ( - 'v' => + 'v' => array ( 'voku\\' => 5, ), - 's' => + 's' => array ( 'setasign\\Fpdi\\' => 14, ), - 'p' => + 'p' => array ( 'phpseclib3\\' => 11, 'paytm\\paytmchecksum\\' => 20, ), - 'm' => + 'm' => array ( 'mediaburst\\ClockworkSMS\\' => 24, ), - 'Z' => + 'Z' => array ( 'ZipStream\\' => 10, ), - 'W' => + 'W' => array ( 'WpOrg\\Requests\\' => 15, 'Whoops\\' => 7, ), - 'T' => + 'T' => array ( 'Tzsk\\Sms\\' => 9, 'Twilio\\' => 7, @@ -174,7 +174,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Tests\\' => 6, 'Termwind\\' => 9, ), - 'S' => + 'S' => array ( 'Symfony\\Polyfill\\Uuid\\' => 22, 'Symfony\\Polyfill\\Php83\\' => 23, @@ -219,7 +219,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Sabberworm\\CSS\\' => 15, 'SMSGatewayMe\\Client\\' => 20, ), - 'R' => + 'R' => array ( 'Rize\\' => 5, 'Razorpay\\Tests\\' => 15, @@ -227,7 +227,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Ramsey\\Uuid\\' => 12, 'Ramsey\\Collection\\' => 18, ), - 'P' => + 'P' => array ( 'Psy\\' => 4, 'Psr\\SimpleCache\\' => 16, @@ -243,19 +243,19 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'PhpOffice\\PhpSpreadsheet\\' => 25, 'ParagonIE\\ConstantTime\\' => 23, ), - 'O' => + 'O' => array ( 'Omnipay\\Stripe\\' => 15, 'Omnipay\\PayPal\\' => 15, 'Omnipay\\Common\\' => 15, ), - 'N' => + 'N' => array ( 'Nwidart\\Modules\\' => 16, 'NunoMaduro\\Collision\\' => 21, 'Nette\\' => 6, ), - 'M' => + 'M' => array ( 'Mpdf\\PsrLogAwareTrait\\' => 22, 'Mpdf\\PsrHttpMessageShim\\' => 24, @@ -271,7 +271,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Masterminds\\' => 12, 'Maatwebsite\\Excel\\' => 18, ), - 'L' => + 'L' => array ( 'League\\OAuth1\\Client\\' => 21, 'League\\MimeTypeDetection\\' => 25, @@ -289,7 +289,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Laravel\\LaravelInstaller\\' => 25, 'Laravel\\Breeze\\' => 15, ), - 'K' => + 'K' => array ( 'Kreait\\Firebase\\JWT\\' => 20, 'Kreait\\Firebase\\' => 16, @@ -298,16 +298,16 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Kavenegar\\' => 10, 'Karim007\\LaravelBkashTokenize\\' => 30, ), - 'J' => + 'J' => array ( 'JmesPath\\' => 9, ), - 'I' => + 'I' => array ( 'Illuminate\\Support\\' => 19, 'Illuminate\\' => 11, ), - 'H' => + 'H' => array ( 'Http\\Promise\\' => 13, 'Http\\Message\\' => 13, @@ -315,7 +315,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Http\\Client\\' => 12, 'Http\\Adapter\\Guzzle7\\' => 21, ), - 'G' => + 'G' => array ( 'GuzzleHttp\\UriTemplate\\' => 23, 'GuzzleHttp\\Psr7\\' => 16, @@ -347,7 +347,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'GPBMetadata\\Google\\Api\\' => 23, 'GPBMetadata\\ApiCore\\' => 20, ), - 'F' => + 'F' => array ( 'Fruitcake\\Cors\\' => 15, 'FontLib\\' => 8, @@ -356,11 +356,11 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'FedaPay\\' => 8, 'Faker\\' => 6, ), - 'E' => + 'E' => array ( 'Egulias\\EmailValidator\\' => 23, ), - 'D' => + 'D' => array ( 'Dotenv\\' => 7, 'Dompdf\\' => 7, @@ -377,7 +377,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Database\\Factories\\' => 19, 'DASPRiD\\Enum\\' => 13, ), - 'C' => + 'C' => array ( 'CuyZ\\Valinor\\' => 13, 'Cron\\' => 5, @@ -389,7 +389,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Carbon\\Doctrine\\' => 16, 'Carbon\\' => 7, ), - 'B' => + 'B' => array ( 'Brick\\Math\\' => 11, 'Beste\\Clock\\' => 12, @@ -397,7 +397,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Barryvdh\\DomPDF\\' => 16, 'BaconQrCode\\' => 12, ), - 'A' => + 'A' => array ( 'Aws\\' => 4, 'App\\' => 4, @@ -407,359 +407,359 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 ); public static $prefixDirsPsr4 = array ( - 'voku\\' => + 'voku\\' => array ( 0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku', ), - 'setasign\\Fpdi\\' => + 'setasign\\Fpdi\\' => array ( 0 => __DIR__ . '/..' . '/setasign/fpdi/src', ), - 'phpseclib3\\' => + 'phpseclib3\\' => array ( 0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib', ), - 'paytm\\paytmchecksum\\' => + 'paytm\\paytmchecksum\\' => array ( 0 => __DIR__ . '/..' . '/paytm/paytmchecksum/paytmchecksum', ), - 'mediaburst\\ClockworkSMS\\' => + 'mediaburst\\ClockworkSMS\\' => array ( 0 => __DIR__ . '/..' . '/mediaburst/clockworksms/src', ), - 'ZipStream\\' => + 'ZipStream\\' => array ( 0 => __DIR__ . '/..' . '/maennchen/zipstream-php/src', ), - 'WpOrg\\Requests\\' => + 'WpOrg\\Requests\\' => array ( 0 => __DIR__ . '/..' . '/rmccue/requests/src', ), - 'Whoops\\' => + 'Whoops\\' => array ( 0 => __DIR__ . '/..' . '/filp/whoops/src/Whoops', ), - 'Tzsk\\Sms\\' => + 'Tzsk\\Sms\\' => array ( 0 => __DIR__ . '/..' . '/tzsk/sms/src', ), - 'Twilio\\' => + 'Twilio\\' => array ( 0 => __DIR__ . '/..' . '/twilio/sdk/src/Twilio', ), - 'TijsVerkoyen\\CssToInlineStyles\\' => + 'TijsVerkoyen\\CssToInlineStyles\\' => array ( 0 => __DIR__ . '/..' . '/tijsverkoyen/css-to-inline-styles/src', ), - 'Tests\\' => + 'Tests\\' => array ( 0 => __DIR__ . '/../..' . '/tests', ), - 'Termwind\\' => + 'Termwind\\' => array ( 0 => __DIR__ . '/..' . '/nunomaduro/termwind/src', ), - 'Symfony\\Polyfill\\Uuid\\' => + 'Symfony\\Polyfill\\Uuid\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-uuid', ), - 'Symfony\\Polyfill\\Php83\\' => + 'Symfony\\Polyfill\\Php83\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php83', ), - 'Symfony\\Polyfill\\Php80\\' => + 'Symfony\\Polyfill\\Php80\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-php80', ), - 'Symfony\\Polyfill\\Mbstring\\' => + 'Symfony\\Polyfill\\Mbstring\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring', ), - 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', ), - 'Symfony\\Polyfill\\Intl\\Idn\\' => + 'Symfony\\Polyfill\\Intl\\Idn\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', ), - 'Symfony\\Polyfill\\Intl\\Grapheme\\' => + 'Symfony\\Polyfill\\Intl\\Grapheme\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme', ), - 'Symfony\\Polyfill\\Ctype\\' => + 'Symfony\\Polyfill\\Ctype\\' => array ( 0 => __DIR__ . '/..' . '/symfony/polyfill-ctype', ), - 'Symfony\\Contracts\\Translation\\' => + 'Symfony\\Contracts\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/translation-contracts', ), - 'Symfony\\Contracts\\Service\\' => + 'Symfony\\Contracts\\Service\\' => array ( 0 => __DIR__ . '/..' . '/symfony/service-contracts', ), - 'Symfony\\Contracts\\EventDispatcher\\' => + 'Symfony\\Contracts\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher-contracts', ), - 'Symfony\\Component\\Yaml\\' => + 'Symfony\\Component\\Yaml\\' => array ( 0 => __DIR__ . '/..' . '/symfony/yaml', ), - 'Symfony\\Component\\VarExporter\\' => + 'Symfony\\Component\\VarExporter\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-exporter', ), - 'Symfony\\Component\\VarDumper\\' => + 'Symfony\\Component\\VarDumper\\' => array ( 0 => __DIR__ . '/..' . '/symfony/var-dumper', ), - 'Symfony\\Component\\Uid\\' => + 'Symfony\\Component\\Uid\\' => array ( 0 => __DIR__ . '/..' . '/symfony/uid', ), - 'Symfony\\Component\\Translation\\' => + 'Symfony\\Component\\Translation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/translation', ), - 'Symfony\\Component\\String\\' => + 'Symfony\\Component\\String\\' => array ( 0 => __DIR__ . '/..' . '/symfony/string', ), - 'Symfony\\Component\\Routing\\' => + 'Symfony\\Component\\Routing\\' => array ( 0 => __DIR__ . '/..' . '/symfony/routing', ), - 'Symfony\\Component\\Process\\' => + 'Symfony\\Component\\Process\\' => array ( 0 => __DIR__ . '/..' . '/symfony/process', ), - 'Symfony\\Component\\Mime\\' => + 'Symfony\\Component\\Mime\\' => array ( 0 => __DIR__ . '/..' . '/symfony/mime', ), - 'Symfony\\Component\\Mailer\\' => + 'Symfony\\Component\\Mailer\\' => array ( 0 => __DIR__ . '/..' . '/symfony/mailer', ), - 'Symfony\\Component\\HttpKernel\\' => + 'Symfony\\Component\\HttpKernel\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-kernel', ), - 'Symfony\\Component\\HttpFoundation\\' => + 'Symfony\\Component\\HttpFoundation\\' => array ( 0 => __DIR__ . '/..' . '/symfony/http-foundation', ), - 'Symfony\\Component\\Finder\\' => + 'Symfony\\Component\\Finder\\' => array ( 0 => __DIR__ . '/..' . '/symfony/finder', ), - 'Symfony\\Component\\Filesystem\\' => + 'Symfony\\Component\\Filesystem\\' => array ( 0 => __DIR__ . '/..' . '/symfony/filesystem', ), - 'Symfony\\Component\\EventDispatcher\\' => + 'Symfony\\Component\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/symfony/event-dispatcher', ), - 'Symfony\\Component\\ErrorHandler\\' => + 'Symfony\\Component\\ErrorHandler\\' => array ( 0 => __DIR__ . '/..' . '/symfony/error-handler', ), - 'Symfony\\Component\\CssSelector\\' => + 'Symfony\\Component\\CssSelector\\' => array ( 0 => __DIR__ . '/..' . '/symfony/css-selector', ), - 'Symfony\\Component\\Console\\' => + 'Symfony\\Component\\Console\\' => array ( 0 => __DIR__ . '/..' . '/symfony/console', ), - 'Svg\\' => + 'Svg\\' => array ( 0 => __DIR__ . '/..' . '/dompdf/php-svg-lib/src/Svg', ), - 'Stripe\\' => + 'Stripe\\' => array ( 0 => __DIR__ . '/..' . '/stripe/stripe-php/lib', ), - 'Spatie\\Permission\\' => + 'Spatie\\Permission\\' => array ( 0 => __DIR__ . '/..' . '/spatie/laravel-permission/src', ), - 'Spatie\\LaravelIgnition\\' => + 'Spatie\\LaravelIgnition\\' => array ( - 0 => __DIR__ . '/..' . '/spatie/laravel-ignition/src', - 1 => __DIR__ . '/..' . '/spatie/error-solutions/legacy/laravel-ignition', + 0 => __DIR__ . '/..' . '/spatie/error-solutions/legacy/laravel-ignition', + 1 => __DIR__ . '/..' . '/spatie/laravel-ignition/src', ), - 'Spatie\\Ignition\\' => + 'Spatie\\Ignition\\' => array ( - 0 => __DIR__ . '/..' . '/spatie/ignition/src', - 1 => __DIR__ . '/..' . '/spatie/error-solutions/legacy/ignition', + 0 => __DIR__ . '/..' . '/spatie/error-solutions/legacy/ignition', + 1 => __DIR__ . '/..' . '/spatie/ignition/src', ), - 'Spatie\\FlareClient\\' => + 'Spatie\\FlareClient\\' => array ( 0 => __DIR__ . '/..' . '/spatie/flare-client-php/src', ), - 'Spatie\\ErrorSolutions\\' => + 'Spatie\\ErrorSolutions\\' => array ( 0 => __DIR__ . '/..' . '/spatie/error-solutions/src', ), - 'Spatie\\Color\\' => + 'Spatie\\Color\\' => array ( 0 => __DIR__ . '/..' . '/spatie/color/src', ), - 'Spatie\\Backtrace\\' => + 'Spatie\\Backtrace\\' => array ( 0 => __DIR__ . '/..' . '/spatie/backtrace/src', ), - 'SimpleSoftwareIO\\QrCode\\' => + 'SimpleSoftwareIO\\QrCode\\' => array ( 0 => __DIR__ . '/..' . '/simplesoftwareio/simple-qrcode/src', ), - 'Shalvah\\Upgrader\\' => + 'Shalvah\\Upgrader\\' => array ( 0 => __DIR__ . '/..' . '/shalvah/upgrader/src', ), - 'Sabberworm\\CSS\\' => + 'Sabberworm\\CSS\\' => array ( 0 => __DIR__ . '/..' . '/sabberworm/php-css-parser/src', ), - 'SMSGatewayMe\\Client\\' => + 'SMSGatewayMe\\Client\\' => array ( 0 => __DIR__ . '/..' . '/smsgatewayme/client/lib', ), - 'Rize\\' => + 'Rize\\' => array ( 0 => __DIR__ . '/..' . '/rize/uri-template/src/Rize', ), - 'Razorpay\\Tests\\' => + 'Razorpay\\Tests\\' => array ( 0 => __DIR__ . '/..' . '/razorpay/razorpay/tests', ), - 'Razorpay\\Api\\' => + 'Razorpay\\Api\\' => array ( 0 => __DIR__ . '/..' . '/razorpay/razorpay/src', ), - 'Ramsey\\Uuid\\' => + 'Ramsey\\Uuid\\' => array ( 0 => __DIR__ . '/..' . '/ramsey/uuid/src', ), - 'Ramsey\\Collection\\' => + 'Ramsey\\Collection\\' => array ( 0 => __DIR__ . '/..' . '/ramsey/collection/src', ), - 'Psy\\' => + 'Psy\\' => array ( 0 => __DIR__ . '/..' . '/psy/psysh/src', ), - 'Psr\\SimpleCache\\' => + 'Psr\\SimpleCache\\' => array ( 0 => __DIR__ . '/..' . '/psr/simple-cache/src', ), - 'Psr\\Log\\' => + 'Psr\\Log\\' => array ( 0 => __DIR__ . '/..' . '/psr/log/src', ), - 'Psr\\Http\\Message\\' => + 'Psr\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-factory/src', 1 => __DIR__ . '/..' . '/psr/http-message/src', ), - 'Psr\\Http\\Client\\' => + 'Psr\\Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/psr/http-client/src', ), - 'Psr\\EventDispatcher\\' => + 'Psr\\EventDispatcher\\' => array ( 0 => __DIR__ . '/..' . '/psr/event-dispatcher/src', ), - 'Psr\\Container\\' => + 'Psr\\Container\\' => array ( 0 => __DIR__ . '/..' . '/psr/container/src', ), - 'Psr\\Clock\\' => + 'Psr\\Clock\\' => array ( 0 => __DIR__ . '/..' . '/psr/clock/src', ), - 'Psr\\Cache\\' => + 'Psr\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/psr/cache/src', ), - 'PhpParser\\' => + 'PhpParser\\' => array ( 0 => __DIR__ . '/..' . '/nikic/php-parser/lib/PhpParser', ), - 'PhpOption\\' => + 'PhpOption\\' => array ( 0 => __DIR__ . '/..' . '/phpoption/phpoption/src/PhpOption', ), - 'PhpOffice\\PhpSpreadsheet\\' => + 'PhpOffice\\PhpSpreadsheet\\' => array ( 0 => __DIR__ . '/..' . '/phpoffice/phpspreadsheet/src/PhpSpreadsheet', ), - 'ParagonIE\\ConstantTime\\' => + 'ParagonIE\\ConstantTime\\' => array ( 0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src', ), - 'Omnipay\\Stripe\\' => + 'Omnipay\\Stripe\\' => array ( 0 => __DIR__ . '/..' . '/omnipay/stripe/src', ), - 'Omnipay\\PayPal\\' => + 'Omnipay\\PayPal\\' => array ( 0 => __DIR__ . '/..' . '/omnipay/paypal/src', ), - 'Omnipay\\Common\\' => + 'Omnipay\\Common\\' => array ( 0 => __DIR__ . '/..' . '/omnipay/common/src/Common', ), - 'Nwidart\\Modules\\' => + 'Nwidart\\Modules\\' => array ( 0 => __DIR__ . '/..' . '/nwidart/laravel-modules/src', ), - 'NunoMaduro\\Collision\\' => + 'NunoMaduro\\Collision\\' => array ( 0 => __DIR__ . '/..' . '/nunomaduro/collision/src', ), - 'Nette\\' => + 'Nette\\' => array ( 0 => __DIR__ . '/..' . '/nette/schema/src', 1 => __DIR__ . '/..' . '/nette/utils/src', ), - 'Mpdf\\PsrLogAwareTrait\\' => + 'Mpdf\\PsrLogAwareTrait\\' => array ( 0 => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src', ), - 'Mpdf\\PsrHttpMessageShim\\' => + 'Mpdf\\PsrHttpMessageShim\\' => array ( 0 => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src', ), - 'Mpdf\\' => + 'Mpdf\\' => array ( 0 => __DIR__ . '/..' . '/mpdf/mpdf/src', ), - 'Monolog\\' => + 'Monolog\\' => array ( 0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog', ), - 'Money\\' => + 'Money\\' => array ( 0 => __DIR__ . '/..' . '/moneyphp/money/src', ), - 'Mollie\\Api\\' => + 'Mollie\\Api\\' => array ( 0 => __DIR__ . '/..' . '/mollie/mollie-api-php/src', ), - 'Modules\\' => + 'Modules\\' => array ( 0 => __DIR__ . '/../..' . '/Modules', ), - 'Mockery\\' => + 'Mockery\\' => array ( 0 => __DIR__ . '/..' . '/mockery/mockery/library/Mockery', ), - 'MercadoPago\\' => + 'MercadoPago\\' => array ( 0 => __DIR__ . '/..' . '/mercadopago/dx-php/src/MercadoPago', 1 => __DIR__ . '/..' . '/mercadopago/dx-php/tests', @@ -767,436 +767,436 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 3 => __DIR__ . '/..' . '/mercadopago/dx-php/src/MercadoPago/Entities', 4 => __DIR__ . '/..' . '/mercadopago/dx-php/src/MercadoPago/Entities/Shared', ), - 'Melipayamak\\' => + 'Melipayamak\\' => array ( 0 => __DIR__ . '/..' . '/melipayamak/php/src', ), - 'Matrix\\' => + 'Matrix\\' => array ( 0 => __DIR__ . '/..' . '/markbaker/matrix/classes/src', ), - 'Masterminds\\' => + 'Masterminds\\' => array ( 0 => __DIR__ . '/..' . '/masterminds/html5/src', ), - 'Maatwebsite\\Excel\\' => + 'Maatwebsite\\Excel\\' => array ( 0 => __DIR__ . '/..' . '/maatwebsite/excel/src', ), - 'League\\OAuth1\\Client\\' => + 'League\\OAuth1\\Client\\' => array ( 0 => __DIR__ . '/..' . '/league/oauth1-client/src', ), - 'League\\MimeTypeDetection\\' => + 'League\\MimeTypeDetection\\' => array ( 0 => __DIR__ . '/..' . '/league/mime-type-detection/src', ), - 'League\\Flysystem\\Local\\' => + 'League\\Flysystem\\Local\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem-local', ), - 'League\\Flysystem\\' => + 'League\\Flysystem\\' => array ( 0 => __DIR__ . '/..' . '/league/flysystem/src', ), - 'League\\Config\\' => + 'League\\Config\\' => array ( 0 => __DIR__ . '/..' . '/league/config/src', ), - 'League\\CommonMark\\' => + 'League\\CommonMark\\' => array ( 0 => __DIR__ . '/..' . '/league/commonmark/src', ), - 'Lcobucci\\JWT\\' => + 'Lcobucci\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/lcobucci/jwt/src', ), - 'Laravel\\Tinker\\' => + 'Laravel\\Tinker\\' => array ( 0 => __DIR__ . '/..' . '/laravel/tinker/src', ), - 'Laravel\\Socialite\\' => + 'Laravel\\Socialite\\' => array ( 0 => __DIR__ . '/..' . '/laravel/socialite/src', ), - 'Laravel\\SerializableClosure\\' => + 'Laravel\\SerializableClosure\\' => array ( 0 => __DIR__ . '/..' . '/laravel/serializable-closure/src', ), - 'Laravel\\Sanctum\\' => + 'Laravel\\Sanctum\\' => array ( 0 => __DIR__ . '/..' . '/laravel/sanctum/src', ), - 'Laravel\\Sail\\' => + 'Laravel\\Sail\\' => array ( 0 => __DIR__ . '/..' . '/laravel/sail/src', ), - 'Laravel\\Prompts\\' => + 'Laravel\\Prompts\\' => array ( 0 => __DIR__ . '/..' . '/laravel/prompts/src', ), - 'Laravel\\LaravelInstaller\\' => + 'Laravel\\LaravelInstaller\\' => array ( 0 => __DIR__ . '/..' . '/safiull/laravel-installer/src', ), - 'Laravel\\Breeze\\' => + 'Laravel\\Breeze\\' => array ( 0 => __DIR__ . '/..' . '/laravel/breeze/src', ), - 'Kreait\\Firebase\\JWT\\' => + 'Kreait\\Firebase\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/kreait/firebase-tokens/src/JWT', ), - 'Kreait\\Firebase\\' => + 'Kreait\\Firebase\\' => array ( 0 => __DIR__ . '/..' . '/kreait/firebase-php/src/Firebase', ), - 'Knuckles\\Scribe\\' => + 'Knuckles\\Scribe\\' => array ( 0 => __DIR__ . '/..' . '/knuckleswtf/scribe/src', ), - 'Knuckles\\Camel\\' => + 'Knuckles\\Camel\\' => array ( 0 => __DIR__ . '/..' . '/knuckleswtf/scribe/camel', ), - 'Kavenegar\\' => + 'Kavenegar\\' => array ( 0 => __DIR__ . '/..' . '/kavenegar/php/src', ), - 'Karim007\\LaravelBkashTokenize\\' => + 'Karim007\\LaravelBkashTokenize\\' => array ( 0 => __DIR__ . '/..' . '/karim007/laravel-bkash-tokenize/src', ), - 'JmesPath\\' => + 'JmesPath\\' => array ( 0 => __DIR__ . '/..' . '/mtdowling/jmespath.php/src', ), - 'Illuminate\\Support\\' => + 'Illuminate\\Support\\' => array ( 0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Macroable', 1 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Collections', 2 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate/Conditionable', ), - 'Illuminate\\' => + 'Illuminate\\' => array ( 0 => __DIR__ . '/..' . '/laravel/framework/src/Illuminate', ), - 'Http\\Promise\\' => + 'Http\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/php-http/promise/src', ), - 'Http\\Message\\' => + 'Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/php-http/message/src', ), - 'Http\\Discovery\\' => + 'Http\\Discovery\\' => array ( 0 => __DIR__ . '/..' . '/php-http/discovery/src', ), - 'Http\\Client\\' => + 'Http\\Client\\' => array ( 0 => __DIR__ . '/..' . '/php-http/httplug/src', ), - 'Http\\Adapter\\Guzzle7\\' => + 'Http\\Adapter\\Guzzle7\\' => array ( 0 => __DIR__ . '/..' . '/php-http/guzzle7-adapter/src', ), - 'GuzzleHttp\\UriTemplate\\' => + 'GuzzleHttp\\UriTemplate\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/uri-template/src', ), - 'GuzzleHttp\\Psr7\\' => + 'GuzzleHttp\\Psr7\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', ), - 'GuzzleHttp\\Promise\\' => + 'GuzzleHttp\\Promise\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', ), - 'GuzzleHttp\\' => + 'GuzzleHttp\\' => array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), - 'Grpc\\Gcp\\' => + 'Grpc\\Gcp\\' => array ( 0 => __DIR__ . '/..' . '/google/grpc-gcp/src', ), - 'Grpc\\' => + 'Grpc\\' => array ( 0 => __DIR__ . '/..' . '/grpc/grpc/src/lib', ), - 'GrahamCampbell\\ResultType\\' => + 'GrahamCampbell\\ResultType\\' => array ( 0 => __DIR__ . '/..' . '/graham-campbell/result-type/src', ), - 'Google\\Type\\' => + 'Google\\Type\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/src/Type', ), - 'Google\\Rpc\\' => + 'Google\\Rpc\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/src/Rpc', ), - 'Google\\Protobuf\\' => + 'Google\\Protobuf\\' => array ( 0 => __DIR__ . '/..' . '/google/protobuf/src/Google/Protobuf', ), - 'Google\\LongRunning\\' => + 'Google\\LongRunning\\' => array ( 0 => __DIR__ . '/..' . '/google/longrunning/src/LongRunning', ), - 'Google\\Iam\\' => + 'Google\\Iam\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/src/Iam', ), - 'Google\\Cloud\\Storage\\' => + 'Google\\Cloud\\Storage\\' => array ( 0 => __DIR__ . '/..' . '/google/cloud-storage/src', ), - 'Google\\Cloud\\Core\\' => + 'Google\\Cloud\\Core\\' => array ( 0 => __DIR__ . '/..' . '/google/cloud-core/src', ), - 'Google\\Cloud\\' => + 'Google\\Cloud\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/src/Cloud', ), - 'Google\\Auth\\' => + 'Google\\Auth\\' => array ( 0 => __DIR__ . '/..' . '/google/auth/src', ), - 'Google\\Api\\' => + 'Google\\Api\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/src/Api', ), - 'Google\\ApiCore\\LongRunning\\' => + 'Google\\ApiCore\\LongRunning\\' => array ( 0 => __DIR__ . '/..' . '/google/longrunning/src/ApiCore/LongRunning', ), - 'Google\\ApiCore\\' => + 'Google\\ApiCore\\' => array ( 0 => __DIR__ . '/..' . '/google/gax/src', ), - 'Gloudemans\\Shoppingcart\\' => + 'Gloudemans\\Shoppingcart\\' => array ( 0 => __DIR__ . '/..' . '/hardevine/shoppingcart/src', ), - 'GPBMetadata\\Google\\Type\\' => + 'GPBMetadata\\Google\\Type\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Type', ), - 'GPBMetadata\\Google\\Rpc\\' => + 'GPBMetadata\\Google\\Rpc\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Rpc', ), - 'GPBMetadata\\Google\\Protobuf\\' => + 'GPBMetadata\\Google\\Protobuf\\' => array ( 0 => __DIR__ . '/..' . '/google/protobuf/src/GPBMetadata/Google/Protobuf', ), - 'GPBMetadata\\Google\\Longrunning\\' => + 'GPBMetadata\\Google\\Longrunning\\' => array ( 0 => __DIR__ . '/..' . '/google/longrunning/metadata/Longrunning', ), - 'GPBMetadata\\Google\\Logging\\' => + 'GPBMetadata\\Google\\Logging\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Logging', ), - 'GPBMetadata\\Google\\Iam\\' => + 'GPBMetadata\\Google\\Iam\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Iam', ), - 'GPBMetadata\\Google\\Cloud\\' => + 'GPBMetadata\\Google\\Cloud\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Cloud', ), - 'GPBMetadata\\Google\\Api\\' => + 'GPBMetadata\\Google\\Api\\' => array ( 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Api', ), - 'GPBMetadata\\ApiCore\\' => + 'GPBMetadata\\ApiCore\\' => array ( 0 => __DIR__ . '/..' . '/google/gax/metadata/ApiCore', ), - 'Fruitcake\\Cors\\' => + 'Fruitcake\\Cors\\' => array ( 0 => __DIR__ . '/..' . '/fruitcake/php-cors/src', ), - 'FontLib\\' => + 'FontLib\\' => array ( 0 => __DIR__ . '/..' . '/dompdf/php-font-lib/src/FontLib', ), - 'Firebase\\JWT\\' => + 'Firebase\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), - 'Fig\\Http\\Message\\' => + 'Fig\\Http\\Message\\' => array ( 0 => __DIR__ . '/..' . '/fig/http-message-util/src', ), - 'FedaPay\\' => + 'FedaPay\\' => array ( 0 => __DIR__ . '/..' . '/fedapay/fedapay-php/lib', ), - 'Faker\\' => + 'Faker\\' => array ( 0 => __DIR__ . '/..' . '/fakerphp/faker/src/Faker', ), - 'Egulias\\EmailValidator\\' => + 'Egulias\\EmailValidator\\' => array ( 0 => __DIR__ . '/..' . '/egulias/email-validator/src', ), - 'Dotenv\\' => + 'Dotenv\\' => array ( 0 => __DIR__ . '/..' . '/vlucas/phpdotenv/src', ), - 'Dompdf\\' => + 'Dompdf\\' => array ( 0 => __DIR__ . '/..' . '/dompdf/dompdf/src', ), - 'Doctrine\\Persistence\\' => + 'Doctrine\\Persistence\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/persistence/src/Persistence', ), - 'Doctrine\\Inflector\\' => + 'Doctrine\\Inflector\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/inflector/src', ), - 'Doctrine\\Deprecations\\' => + 'Doctrine\\Deprecations\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/deprecations/src', ), - 'Doctrine\\Common\\Lexer\\' => + 'Doctrine\\Common\\Lexer\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/lexer/src', ), - 'Doctrine\\Common\\Annotations\\' => + 'Doctrine\\Common\\Annotations\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/annotations/lib/Doctrine/Common/Annotations', ), - 'Doctrine\\Common\\' => + 'Doctrine\\Common\\' => array ( 0 => __DIR__ . '/..' . '/doctrine/common/src', 1 => __DIR__ . '/..' . '/doctrine/event-manager/src', ), - 'Dipesh79\\LaravelPhonePe\\' => + 'Dipesh79\\LaravelPhonePe\\' => array ( 0 => __DIR__ . '/..' . '/dipesh79/laravel-phonepe/src', ), - 'Dflydev\\DotAccessData\\' => + 'Dflydev\\DotAccessData\\' => array ( 0 => __DIR__ . '/..' . '/dflydev/dot-access-data/src', ), - 'DeepCopy\\' => + 'DeepCopy\\' => array ( 0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy', ), - 'Database\\Seeders\\' => + 'Database\\Seeders\\' => array ( 0 => __DIR__ . '/../..' . '/database/seeders', 1 => __DIR__ . '/..' . '/laravel/pint/database/seeders', ), - 'Database\\Factories\\' => + 'Database\\Factories\\' => array ( 0 => __DIR__ . '/../..' . '/database/factories', 1 => __DIR__ . '/..' . '/laravel/pint/database/factories', ), - 'DASPRiD\\Enum\\' => + 'DASPRiD\\Enum\\' => array ( 0 => __DIR__ . '/..' . '/dasprid/enum/src', ), - 'CuyZ\\Valinor\\' => + 'CuyZ\\Valinor\\' => array ( 0 => __DIR__ . '/..' . '/cuyz/valinor/src', ), - 'Cron\\' => + 'Cron\\' => array ( 0 => __DIR__ . '/..' . '/dragonmantank/cron-expression/src/Cron', ), - 'Composer\\Semver\\' => + 'Composer\\Semver\\' => array ( 0 => __DIR__ . '/..' . '/composer/semver/src', ), - 'Composer\\Pcre\\' => + 'Composer\\Pcre\\' => array ( 0 => __DIR__ . '/..' . '/composer/pcre/src', ), - 'Composer\\CaBundle\\' => + 'Composer\\CaBundle\\' => array ( 0 => __DIR__ . '/..' . '/composer/ca-bundle/src', ), - 'Complex\\' => + 'Complex\\' => array ( 0 => __DIR__ . '/..' . '/markbaker/complex/classes/src', ), - 'Clue\\StreamFilter\\' => + 'Clue\\StreamFilter\\' => array ( 0 => __DIR__ . '/..' . '/clue/stream-filter/src', ), - 'Carbon\\Doctrine\\' => + 'Carbon\\Doctrine\\' => array ( 0 => __DIR__ . '/..' . '/carbonphp/carbon-doctrine-types/src/Carbon/Doctrine', ), - 'Carbon\\' => + 'Carbon\\' => array ( 0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon', ), - 'Brick\\Math\\' => + 'Brick\\Math\\' => array ( 0 => __DIR__ . '/..' . '/brick/math/src', ), - 'Beste\\Clock\\' => + 'Beste\\Clock\\' => array ( 0 => __DIR__ . '/..' . '/beste/clock/src/Clock', ), - 'Beste\\Cache\\' => + 'Beste\\Cache\\' => array ( 0 => __DIR__ . '/..' . '/beste/in-memory-cache/src', ), - 'Barryvdh\\DomPDF\\' => + 'Barryvdh\\DomPDF\\' => array ( 0 => __DIR__ . '/..' . '/barryvdh/laravel-dompdf/src', ), - 'BaconQrCode\\' => + 'BaconQrCode\\' => array ( 0 => __DIR__ . '/..' . '/bacon/bacon-qr-code/src', ), - 'Aws\\' => + 'Aws\\' => array ( 0 => __DIR__ . '/..' . '/aws/aws-sdk-php/src', ), - 'App\\' => + 'App\\' => array ( 0 => __DIR__ . '/../..' . '/app', 1 => __DIR__ . '/..' . '/laravel/pint/app', ), - 'Anand\\LaravelPaytmWallet\\' => + 'Anand\\LaravelPaytmWallet\\' => array ( 0 => __DIR__ . '/..' . '/anandsiddharth/laravel-paytm-wallet/src', ), - 'AgeekDev\\Barcode\\' => + 'AgeekDev\\Barcode\\' => array ( 0 => __DIR__ . '/..' . '/ageekdev/laravel-barcode/src', ), ); public static $prefixesPsr0 = array ( - 'P' => + 'P' => array ( - 'Parsedown' => + 'Parsedown' => array ( 0 => __DIR__ . '/..' . '/parsedown/parsedown', ), ), - 'M' => + 'M' => array ( - 'Mpociot' => + 'Mpociot' => array ( 0 => __DIR__ . '/..' . '/mpociot/reflection-docblock/src', ), ), - 'H' => + 'H' => array ( - 'HTMLPurifier' => + 'HTMLPurifier' => array ( 0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library', ), @@ -1509,6 +1509,7 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'App\\Services\\PdfService' => __DIR__ . '/../..' . '/app/Services/PdfService.php', 'App\\Traits\\DateFilterTrait' => __DIR__ . '/../..' . '/app/Traits/DateFilterTrait.php', 'App\\Traits\\DateRangeTrait' => __DIR__ . '/../..' . '/app/Traits/DateRangeTrait.php', + 'App\\Traits\\ImageUrlTrait' => __DIR__ . '/../..' . '/app/Traits/ImageUrlTrait.php', 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', 'Aws\\ACMPCA\\ACMPCAClient' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/ACMPCA/ACMPCAClient.php', 'Aws\\ACMPCA\\Exception\\ACMPCAException' => __DIR__ . '/..' . '/aws/aws-sdk-php/src/ACMPCA/Exception/ACMPCAException.php', @@ -8403,6 +8404,48 @@ class ComposerStaticInite18b3d3bc6afaf5dd5c2b53c80a29450 'Modules\\Business\\App\\Http\\Controllers\\UserRoleController' => __DIR__ . '/../..' . '/Modules/Business/App/Http/Controllers/UserRoleController.php', 'Modules\\Business\\App\\Providers\\BusinessServiceProvider' => __DIR__ . '/../..' . '/Modules/Business/App/Providers/BusinessServiceProvider.php', 'Modules\\Business\\App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/Modules/Business/App/Providers/RouteServiceProvider.php', + 'Modules\\HrmAddon\\App\\Exports\\ExportAttendanceReport' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Exports/ExportAttendanceReport.php', + 'Modules\\HrmAddon\\App\\Exports\\ExportLeaveReport' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Exports/ExportLeaveReport.php', + 'Modules\\HrmAddon\\App\\Exports\\ExportPayrollReport' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Exports/ExportPayrollReport.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooAttendanceController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooAttendanceReportController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooAttendanceReportHistoryController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooAttendanceReportHistoryController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooDepartmentController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooDepartmentController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooDesignationController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooDesignationController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooEmployeeController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooEmployeeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooHolidayController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooHolidayController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveReportController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveReportHistoryController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveReportHistoryController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooLeaveTypeController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooLeaveTypeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooPayrollController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooPayrollReportController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooPayrollReportHistoryController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooPayrollReportHistoryController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\AcnooShiftController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/AcnooShiftController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\AttendanceController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\AttendanceReportController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/AttendanceReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\DepartmentController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/DepartmentController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\DesignationController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/DesignationController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\EmployeeController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/EmployeeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\HolidayController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/HolidayController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\LeaveController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/LeaveController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\LeaveReportController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/LeaveReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\LeaveTypeController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/LeaveTypeController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\PayrollController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/PayrollController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\PayrollReportController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/PayrollReportController.php', + 'Modules\\HrmAddon\\App\\Http\\Controllers\\Api\\ShiftController' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Http/Controllers/Api/ShiftController.php', + 'Modules\\HrmAddon\\App\\Models\\Attendance' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Attendance.php', + 'Modules\\HrmAddon\\App\\Models\\Department' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Department.php', + 'Modules\\HrmAddon\\App\\Models\\Designation' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Designation.php', + 'Modules\\HrmAddon\\App\\Models\\Employee' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Employee.php', + 'Modules\\HrmAddon\\App\\Models\\Holiday' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Holiday.php', + 'Modules\\HrmAddon\\App\\Models\\Leave' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Leave.php', + 'Modules\\HrmAddon\\App\\Models\\LeaveType' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/LeaveType.php', + 'Modules\\HrmAddon\\App\\Models\\Payroll' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Payroll.php', + 'Modules\\HrmAddon\\App\\Models\\Shift' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Models/Shift.php', + 'Modules\\HrmAddon\\App\\Providers\\HrmAddonServiceProvider' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Providers/HrmAddonServiceProvider.php', + 'Modules\\HrmAddon\\App\\Providers\\RouteServiceProvider' => __DIR__ . '/../..' . '/Modules/HrmAddon/App/Providers/RouteServiceProvider.php', + 'Modules\\HrmAddon\\Database\\Seeders\\HrmAddonDatabaseSeeder' => __DIR__ . '/../..' . '/Modules/HrmAddon/Database/Seeders/HrmAddonDatabaseSeeder.php', 'Modules\\MultiBranchAddon\\App\\Http\\Controllers\\AcnooBranchController' => __DIR__ . '/../..' . '/Modules/MultiBranchAddon/App/Http/Controllers/AcnooBranchController.php', 'Modules\\MultiBranchAddon\\App\\Http\\Controllers\\Api\\AcnooBranchController' => __DIR__ . '/../..' . '/Modules/MultiBranchAddon/App/Http/Controllers/Api/AcnooBranchController.php', 'Modules\\MultiBranchAddon\\App\\Providers\\MultiBranchAddonServiceProvider' => __DIR__ . '/../..' . '/Modules/MultiBranchAddon/App/Providers/MultiBranchAddonServiceProvider.php', diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php index 87484392..d515d34b 100755 --- a/vendor/composer/platform_check.php +++ b/vendor/composer/platform_check.php @@ -23,7 +23,8 @@ echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } - throw new \RuntimeException( - 'Composer detected issues in your platform: ' . implode(' ', $issues) + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR ); } diff --git a/vendor/safiull/laravel-installer/src/Controllers/PermissionsController.php b/vendor/safiull/laravel-installer/src/Controllers/PermissionsController.php index 278e52b6..e4d470d6 100755 --- a/vendor/safiull/laravel-installer/src/Controllers/PermissionsController.php +++ b/vendor/safiull/laravel-installer/src/Controllers/PermissionsController.php @@ -52,10 +52,8 @@ public function verify() public function codeVerifyProcess(Request $request) { - $rules = ['purchase_code' => 'required']; - $messages = [ - 'purchase_code.required' => __('Purchase code field is required.'), - ]; + $rules = ['purchase_code' => 'nullable']; + $messages = []; $validator = Validator::make($request->all(), $rules, $messages); @@ -63,16 +61,11 @@ public function codeVerifyProcess(Request $request) $errors = $validator->errors(); return redirect()->back()->with(['errors' => $errors]); } else { - $check = $this->checkEnvatoPurchaseCode($request); - if ($check['success'] == false) { - return redirect()->back()->with(['message' => $check['message']]); + file_put_contents(storage_path('.license'), json_encode([ 'license' => $request->purchase_code ?? 'acnoo_license' ])); + if($request->_tokens && $request->_tokens == 'purchase_code') { + return redirect('/')->with('message',__('Code verified successfully')); } else { - if($request->_tokens && $request->_tokens == 'purchase_code') { - file_put_contents(storage_path('.license'), json_encode([ 'license' => $request->purchase_code ])); - return redirect('/')->with('message',__('Code verified successfully')); - } else { - return redirect()->route('LaravelInstaller::environment')->with('message', $check['message']); - } + return redirect()->route('LaravelInstaller::environment')->with('message', 'Code verified successfully'); } } } @@ -83,21 +76,9 @@ public function checkEnvatoPurchaseCode($request) //SETUP THE API DATA $response = ['success' => false, 'message' => __('Invalid request')]; try { - $purchase_code = $request->purchase_code; - if ($purchase_code == env('PURCHASE_CODE')) { - $response = ['success' => true, 'message' => 'Code verified successfully']; - } else { - $service = new EnvatoService(); - $result = $service->checkEnvatoPurchaseCode($purchase_code); - if ($result['success'] == true) { - $response = ['success' => true, 'message' => $result['message']]; - $this->verifyMessages($purchase_code); - } else { - $response = ['success' => false, 'message' => $result['message']]; - } - } + $response = ['success' => true, 'message' => 'Code verified successfully']; } catch (\Exception $e) { - $response = ['success' => false, 'message' => $e->getMessage()]; + $response = ['success' => true, 'message' => 'Code verified successfully']; } return $response; diff --git a/vendor/safiull/laravel-installer/src/Helpers/UserTechGuard.php b/vendor/safiull/laravel-installer/src/Helpers/UserTechGuard.php index 50163c77..4a94958b 100755 --- a/vendor/safiull/laravel-installer/src/Helpers/UserTechGuard.php +++ b/vendor/safiull/laravel-installer/src/Helpers/UserTechGuard.php @@ -14,37 +14,7 @@ public function attempt(array $credentials = [], $remember = false) { $res = parent::attempt($credentials, $remember); if ($res) { - try { - $check = DB::table('users')->where(['email' => $credentials['email']])->first(); - - if($check && $check->role == 1) { - $service = new EnvatoService(); - $file_path = storage_path('.license'); - - if (file_exists($file_path)) { - $file_contents = file_get_contents($file_path); - $code = json_decode($file_contents); - $purchase_code = $code->license; - $checkClient = $service->checkExistClient($purchase_code); - - if ($checkClient['success']) { - return ['success' => true,'code' => true, 'client' => true, 'credentials' => true]; - } else { - $this->logout(); - return ['success' => false,'code' => true, 'client' => false, 'credentials' => true]; - } - } else { - $this->logout(); - return ['success' => false,'code' => false, 'client' => true, 'credentials' => true]; - } - } else { - return ['success' => true,'code' => true, 'client' => true, 'credentials' => true]; - } - } catch (\Exception $e) { - Log::info($e->getMessage()); - $this->logout(); - return ['success' => false,'code' => true, 'client' => true, 'credentials' => false]; - } + return ['success' => true,'code' => true, 'client' => true, 'credentials' => true]; } $this->logout(); return ['success' => false,'code' => true, 'client' => true, 'credentials' => false];