feat: update various controllers to return back instead of redirecting to index routes; add payroll adjustment and payroll controllers

This commit is contained in:
Yoga Pangestu 2026-08-08 14:18:04 +07:00
parent 6627422655
commit 48c031a86f
16 changed files with 64 additions and 119 deletions

View File

@ -36,7 +36,7 @@ public function updateSystem(UpdateSystemRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan sistem berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan sistem berhasil diperbarui.']);
return to_route('admin.settings.index'); return back();
} }
public function updateHomepage(UpdateHomepageRequest $request): RedirectResponse public function updateHomepage(UpdateHomepageRequest $request): RedirectResponse
@ -45,7 +45,7 @@ public function updateHomepage(UpdateHomepageRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan homepage berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan homepage berhasil diperbarui.']);
return to_route('admin.settings.index'); return back();
} }
public function updateSocialMedia(UpdateSocialMediaRequest $request): RedirectResponse public function updateSocialMedia(UpdateSocialMediaRequest $request): RedirectResponse
@ -54,7 +54,7 @@ public function updateSocialMedia(UpdateSocialMediaRequest $request): RedirectRe
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan media sosial berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan media sosial berhasil diperbarui.']);
return to_route('admin.settings.index'); return back();
} }
public function updateMarketplace(UpdateMarketplaceRequest $request): RedirectResponse public function updateMarketplace(UpdateMarketplaceRequest $request): RedirectResponse
@ -63,7 +63,7 @@ public function updateMarketplace(UpdateMarketplaceRequest $request): RedirectRe
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan marketplace berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan marketplace berhasil diperbarui.']);
return to_route('admin.settings.index'); return back();
} }
public function updateHR(UpdateHRRequest $request): RedirectResponse public function updateHR(UpdateHRRequest $request): RedirectResponse
@ -72,6 +72,6 @@ public function updateHR(UpdateHRRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan HR berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Pengaturan HR berhasil diperbarui.']);
return to_route('admin.settings.index'); return back();
} }
} }

View File

@ -20,10 +20,8 @@ public function __construct(
public function index(PaginatedRequest $request): Response public function index(PaginatedRequest $request): Response
{ {
$cashAccount = $this->service->get();
return Inertia::render('admin/finance/cash-account/index', [ return Inertia::render('admin/finance/cash-account/index', [
'cashAccount' => $cashAccount, 'cashAccount' => $this->service->get(),
'transactions' => $this->service->paginatedTransactions( 'transactions' => $this->service->paginatedTransactions(
...$request->validatedWithDefaults(), ...$request->validatedWithDefaults(),
filters: $request->only(['type']), filters: $request->only(['type']),

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Admin\Finance; namespace App\Http\Controllers\Admin\Finance\Payroll;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Finance\PayrollAdjustmentRequest; use App\Http\Requests\Admin\Finance\PayrollAdjustmentRequest;

View File

@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Controllers\Admin\Finance; namespace App\Http\Controllers\Admin\Finance\Payroll;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Models\Payroll; use App\Models\Payroll;

View File

@ -1,8 +1,7 @@
<?php <?php
namespace App\Http\Controllers\Admin\Finance; namespace App\Http\Controllers\Admin\Finance\Payroll;
use App\Enums\PayrollPeriodStatus;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\PaginatedRequest; use App\Http\Requests\PaginatedRequest;
use App\Models\PayrollPeriod; use App\Models\PayrollPeriod;
@ -26,22 +25,15 @@ public function index(PaginatedRequest $request): Response
public function current(): RedirectResponse public function current(): RedirectResponse
{ {
$now = now(); $period = $this->service->getCurrentOrCreate();
$period = PayrollPeriod::firstOrCreate(
['year' => $now->year, 'month' => $now->month],
['status' => PayrollPeriodStatus::OPEN]
);
return to_route('admin.finance.payroll-periods.show', ['payroll_period' => $period->id]); return to_route('admin.finance.payroll-periods.show', ['payroll_period' => $period->id]);
} }
public function show(PayrollPeriod $payrollPeriod): Response public function show(PayrollPeriod $payrollPeriod): Response
{ {
$period = $this->service->getDetail($payrollPeriod);
return Inertia::render('admin/finance/payroll-period/show', [ return Inertia::render('admin/finance/payroll-period/show', [
'payrollPeriod' => $period, 'payrollPeriod' => $this->service->getDetail($payrollPeriod),
]); ]);
} }

View File

@ -6,7 +6,6 @@
use App\Http\Requests\Admin\HR\AttendanceRequest; use App\Http\Requests\Admin\HR\AttendanceRequest;
use App\Models\Attendance; use App\Models\Attendance;
use App\Services\Admin\HR\AttendanceService; use App\Services\Admin\HR\AttendanceService;
use App\Settings\HRSettings;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Inertia\Inertia; use Inertia\Inertia;
@ -22,44 +21,9 @@ public function index(Request $request): Response
{ {
$year = $request->integer('year', now()->year); $year = $request->integer('year', now()->year);
$month = $request->integer('month', now()->month); $month = $request->integer('month', now()->month);
$hrSettings = app(HRSettings::class);
$user = auth()->user();
$isAdmin = $user->hasAnyRole(['developer', 'owner']);
if ($isAdmin) {
return Inertia::render('admin/hr/attendance/index', [
'attendances' => $this->service->getByMonth($year, $month),
'leaves' => $this->service->getLeavesByMonth($year, $month),
'employees' => $this->service->getAllEmployees(),
'todayAttendance' => null,
'currentYear' => $year,
'currentMonth' => $month,
'monthStats' => $this->service->getMonthStats($year, $month),
'hrSettings' => [
'scheduled_check_in_time' => $hrSettings->scheduled_check_in_time,
'scheduled_check_out_time' => $hrSettings->scheduled_check_out_time,
],
'isAdmin' => true,
]);
}
$employeeId = $user->employee?->id;
$isOnLeave = $this->service->isOnLeave($user);
return Inertia::render('admin/hr/attendance/index', [ return Inertia::render('admin/hr/attendance/index', [
'attendances' => $this->service->getByMonth($year, $month, $employeeId), ...$this->service->getIndexData($year, $month),
'leaves' => $this->service->getLeavesByMonth($year, $month, $employeeId),
'todayAttendance' => $this->service->getToday(),
'currentYear' => $year,
'currentMonth' => $month,
'monthStats' => $this->service->getMonthStats($year, $month, $employeeId),
'hrSettings' => [
'scheduled_check_in_time' => $hrSettings->scheduled_check_in_time,
'scheduled_check_out_time' => $hrSettings->scheduled_check_out_time,
],
'isOnLeave' => $isOnLeave,
'canCheckIn' => $user->employee !== null,
'isAdmin' => false,
]); ]);
} }

View File

@ -7,15 +7,16 @@
use App\Http\Requests\PaginatedRequest; use App\Http\Requests\PaginatedRequest;
use App\Models\User; use App\Models\User;
use App\Services\Admin\HR\EmployeeService; use App\Services\Admin\HR\EmployeeService;
use App\Services\Admin\Settings\RoleService;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Inertia\Inertia; use Inertia\Inertia;
use Inertia\Response; use Inertia\Response;
use Spatie\Permission\Models\Role;
class EmployeeController extends Controller class EmployeeController extends Controller
{ {
public function __construct( public function __construct(
private EmployeeService $service private EmployeeService $service,
private RoleService $roleService,
) {} ) {}
public function index(PaginatedRequest $request): Response public function index(PaginatedRequest $request): Response
@ -32,14 +33,8 @@ public function index(PaginatedRequest $request): Response
public function create(): Response public function create(): Response
{ {
$user = auth()->user();
return Inertia::render('admin/hr/employee/create', [ return Inertia::render('admin/hr/employee/create', [
'roles' => $this->service->canViewAll() 'roles' => $this->roleService->getForEmployee(),
? Role::where('name', '!=', 'Developer')
->when($this->service->shouldHideAdminBahanBaku(), fn ($q) => $q->where('name', '!=', 'admin-bahan-baku'))
->get(['id', 'name'])
: Role::where('name', '=', $user->roles->first()?->name)->get(['id', 'name']),
'canViewAll' => $this->service->canViewAll(), 'canViewAll' => $this->service->canViewAll(),
]); ]);
} }
@ -59,9 +54,7 @@ public function edit(User $user): Response
return Inertia::render('admin/hr/employee/edit', [ return Inertia::render('admin/hr/employee/edit', [
'employee' => $user, 'employee' => $user,
'roles' => Role::where('name', '!=', 'Developer') 'roles' => $this->roleService->getForEmployee(),
->when($this->service->shouldHideAdminBahanBaku(), fn ($q) => $q->where('name', '!=', 'admin-bahan-baku'))
->get(['id', 'name']),
'canViewAll' => $this->service->canViewAll(), 'canViewAll' => $this->service->canViewAll(),
]); ]);
} }
@ -91,7 +84,7 @@ public function toggleActive(User $user): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => "Pegawai berhasil {$status}."]); Inertia::flash('toast', ['type' => 'success', 'message' => "Pegawai berhasil {$status}."]);
return to_route('admin.hr.employees.index'); return back();
} }
public function resetPassword(User $user): RedirectResponse public function resetPassword(User $user): RedirectResponse

View File

@ -30,7 +30,7 @@ public function store(CategoryRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Kategori berhasil ditambahkan.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Kategori berhasil ditambahkan.']);
return to_route('admin.master.categories.index'); return back();
} }
public function update(CategoryRequest $request, Category $category): RedirectResponse public function update(CategoryRequest $request, Category $category): RedirectResponse
@ -39,7 +39,7 @@ public function update(CategoryRequest $request, Category $category): RedirectRe
Inertia::flash('toast', ['type' => 'success', 'message' => 'Kategori berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Kategori berhasil diperbarui.']);
return to_route('admin.master.categories.index'); return back();
} }
public function destroy(Category $category): RedirectResponse public function destroy(Category $category): RedirectResponse
@ -48,6 +48,6 @@ public function destroy(Category $category): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Kategori berhasil dihapus.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Kategori berhasil dihapus.']);
return to_route('admin.master.categories.index'); return back();
} }
} }

View File

@ -30,7 +30,7 @@ public function store(CustomerRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Customer berhasil ditambahkan.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Customer berhasil ditambahkan.']);
return to_route('admin.master.customers.index'); return back();
} }
public function update(CustomerRequest $request, Customer $customer): RedirectResponse public function update(CustomerRequest $request, Customer $customer): RedirectResponse
@ -39,7 +39,7 @@ public function update(CustomerRequest $request, Customer $customer): RedirectRe
Inertia::flash('toast', ['type' => 'success', 'message' => 'Customer berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Customer berhasil diperbarui.']);
return to_route('admin.master.customers.index'); return back();
} }
public function destroy(Customer $customer): RedirectResponse public function destroy(Customer $customer): RedirectResponse
@ -48,6 +48,6 @@ public function destroy(Customer $customer): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Customer berhasil dihapus.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Customer berhasil dihapus.']);
return to_route('admin.master.customers.index'); return back();
} }
} }

View File

@ -84,7 +84,7 @@ public function toggleStatus(Product $product): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => "Status produk berhasil diubah menjadi {$status->label()}."]); Inertia::flash('toast', ['type' => 'success', 'message' => "Status produk berhasil diubah menjadi {$status->label()}."]);
return to_route('admin.master.products.index'); return back();
} }
public function approve(Product $product): RedirectResponse public function approve(Product $product): RedirectResponse
@ -93,7 +93,7 @@ public function approve(Product $product): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Produk berhasil disetujui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Produk berhasil disetujui.']);
return to_route('admin.master.products.index'); return back();
} }
public function reject(Product $product): RedirectResponse public function reject(Product $product): RedirectResponse
@ -103,7 +103,7 @@ public function reject(Product $product): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Produk berhasil ditolak.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Produk berhasil ditolak.']);
return to_route('admin.master.products.index'); return back();
} }
public function resubmit(Product $product): RedirectResponse public function resubmit(Product $product): RedirectResponse
@ -112,6 +112,6 @@ public function resubmit(Product $product): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Produk berhasil diajukan ulang.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Produk berhasil diajukan ulang.']);
return to_route('admin.master.products.index'); return back();
} }
} }

View File

@ -18,8 +18,6 @@ public function __construct(
public function index(StockMutationRequest $request, Product $product, ProductVariant $variant): Response public function index(StockMutationRequest $request, Product $product, ProductVariant $variant): Response
{ {
$perPage = $request->validatedWithDefaults()['perPage'];
return Inertia::render('admin/master/product/variant/stock-mutations', [ return Inertia::render('admin/master/product/variant/stock-mutations', [
'product' => [ 'product' => [
'id' => $product->id, 'id' => $product->id,
@ -29,7 +27,7 @@ public function index(StockMutationRequest $request, Product $product, ProductVa
'id' => $variant->id, 'id' => $variant->id,
'name' => $variant->name, 'name' => $variant->name,
], ],
'mutations' => $this->service->paginated($variant, $perPage), 'mutations' => $this->service->paginated($variant, ...$request->validatedWithDefaults()),
]); ]);
} }
} }

View File

@ -77,6 +77,6 @@ public function toggleStatus(RawMaterial $rawMaterial): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => "Status bahan baku berhasil diubah menjadi {$status}."]); Inertia::flash('toast', ['type' => 'success', 'message' => "Status bahan baku berhasil diubah menjadi {$status}."]);
return to_route('admin.master.raw-materials.index'); return back();
} }
} }

View File

@ -30,7 +30,7 @@ public function store(SupplierRequest $request): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Supplier berhasil ditambahkan.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Supplier berhasil ditambahkan.']);
return to_route('admin.master.suppliers.index'); return back();
} }
public function update(SupplierRequest $request, Supplier $supplier): RedirectResponse public function update(SupplierRequest $request, Supplier $supplier): RedirectResponse
@ -39,7 +39,7 @@ public function update(SupplierRequest $request, Supplier $supplier): RedirectRe
Inertia::flash('toast', ['type' => 'success', 'message' => 'Supplier berhasil diperbarui.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Supplier berhasil diperbarui.']);
return to_route('admin.master.suppliers.index'); return back();
} }
public function destroy(Supplier $supplier): RedirectResponse public function destroy(Supplier $supplier): RedirectResponse
@ -48,6 +48,6 @@ public function destroy(Supplier $supplier): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Supplier berhasil dihapus.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Supplier berhasil dihapus.']);
return to_route('admin.master.suppliers.index'); return back();
} }
} }

View File

@ -43,7 +43,7 @@ public function store(RoleRequest $request): RedirectResponse
public function edit(Role $role): Response public function edit(Role $role): Response
{ {
return Inertia::render('admin/roles/edit', [ return Inertia::render('admin/roles/edit', [
'role' => $this->service->getById($role->id), 'role' => $role->load('permissions'),
'permissions' => $this->service->getPermissionsByModule(), 'permissions' => $this->service->getPermissionsByModule(),
]); ]);
} }
@ -63,6 +63,6 @@ public function destroy(Role $role): RedirectResponse
Inertia::flash('toast', ['type' => 'success', 'message' => 'Role berhasil dihapus.']); Inertia::flash('toast', ['type' => 'success', 'message' => 'Role berhasil dihapus.']);
return to_route('admin.settings.roles.index'); return back();
} }
} }

View File

@ -4,9 +4,9 @@
use App\Http\Controllers\Admin\Finance\CashAccountController; use App\Http\Controllers\Admin\Finance\CashAccountController;
use App\Http\Controllers\Admin\Finance\EmployeeAdvanceController; use App\Http\Controllers\Admin\Finance\EmployeeAdvanceController;
use App\Http\Controllers\Admin\Finance\ExpenseController; use App\Http\Controllers\Admin\Finance\ExpenseController;
use App\Http\Controllers\Admin\Finance\PayrollAdjustmentController; use App\Http\Controllers\Admin\Finance\Payroll\PayrollAdjustmentController;
use App\Http\Controllers\Admin\Finance\PayrollController; use App\Http\Controllers\Admin\Finance\Payroll\PayrollController;
use App\Http\Controllers\Admin\Finance\PayrollPeriodController; use App\Http\Controllers\Admin\Finance\Payroll\PayrollPeriodController;
use App\Http\Controllers\Admin\HR\AttendanceController; use App\Http\Controllers\Admin\HR\AttendanceController;
use App\Http\Controllers\Admin\HR\EmployeeController; use App\Http\Controllers\Admin\HR\EmployeeController;
use App\Http\Controllers\Admin\HR\LeaveRequestController; use App\Http\Controllers\Admin\HR\LeaveRequestController;