feat: update services and controllers to include user information in transaction notifications for improved clarity
Some checks are pending
linter / quality (push) Waiting to run
tests / ci (8.3) (push) Waiting to run
tests / ci (8.4) (push) Waiting to run
tests / ci (8.5) (push) Waiting to run

This commit is contained in:
Yoga Pangestu 2026-07-14 21:41:39 +07:00
parent 08d3982aa5
commit 0489badf03
16 changed files with 51 additions and 51 deletions

View File

@ -47,14 +47,14 @@ public function update(CashTransactionRequest $request, CashTransaction $cashTra
abort(403); abort(403);
} }
$this->cashService->updateDeposit($cashTransaction, $request->validated()); $this->cashService->updateDeposit($cashTransaction, $request->validated(), $request->user());
$this->flashUpdated('Setor kas'); $this->flashUpdated('Setor kas');
return redirect()->route('admin.finance.cash.index'); return redirect()->route('admin.finance.cash.index');
} }
public function destroy(CashTransaction $cashTransaction): RedirectResponse public function destroy(Request $request, CashTransaction $cashTransaction): RedirectResponse
{ {
try { try {
$cashTransaction->ensureEditable(); $cashTransaction->ensureEditable();
@ -62,7 +62,7 @@ public function destroy(CashTransaction $cashTransaction): RedirectResponse
abort(403); abort(403);
} }
$this->cashService->deleteTransaction($cashTransaction); $this->cashService->deleteTransaction($cashTransaction, $request->user());
$this->flashDeleted('Setor kas'); $this->flashDeleted('Setor kas');

View File

@ -42,16 +42,16 @@ public function store(ExpenseRequest $request): RedirectResponse
public function update(ExpenseRequest $request, Expense $expense): RedirectResponse public function update(ExpenseRequest $request, Expense $expense): RedirectResponse
{ {
$this->expenseService->update($expense, $request->validated()); $this->expenseService->update($expense, $request->validated(), $request->user());
$this->flashUpdated('Pengeluaran'); $this->flashUpdated('Pengeluaran');
return redirect()->route('admin.finance.expenses.index'); return redirect()->route('admin.finance.expenses.index');
} }
public function destroy(Expense $expense): RedirectResponse public function destroy(Request $request, Expense $expense): RedirectResponse
{ {
$this->expenseService->delete($expense); $this->expenseService->delete($expense, $request->user());
$this->flashDeleted('Pengeluaran'); $this->flashDeleted('Pengeluaran');

View File

@ -51,9 +51,9 @@ public function checkOut(CheckOutRequest $request): RedirectResponse
return redirect()->route('admin.hr.attendances.index'); return redirect()->route('admin.hr.attendances.index');
} }
public function destroy(Attendance $attendance): RedirectResponse public function destroy(Request $request, Attendance $attendance): RedirectResponse
{ {
$this->attendanceService->delete($attendance); $this->attendanceService->delete($attendance, $request->user());
$this->flashDeleted('Presensi'); $this->flashDeleted('Presensi');

View File

@ -59,7 +59,7 @@ public function update(SubmitLeaveRequest $request, LeaveRequest $leaveRequest):
return redirect()->route('admin.hr.leave_requests.index'); return redirect()->route('admin.hr.leave_requests.index');
} }
public function destroy(LeaveRequest $leaveRequest): RedirectResponse public function destroy(Request $request, LeaveRequest $leaveRequest): RedirectResponse
{ {
try { try {
$leaveRequest->ensureEditable(); $leaveRequest->ensureEditable();
@ -67,7 +67,7 @@ public function destroy(LeaveRequest $leaveRequest): RedirectResponse
abort(403); abort(403);
} }
$this->leaveRequestService->delete($leaveRequest); $this->leaveRequestService->delete($leaveRequest, $request->user());
$this->flashDeleted('Pengajuan cuti'); $this->flashDeleted('Pengajuan cuti');

View File

@ -81,16 +81,16 @@ public function edit(Cutting $cutting): Response|RedirectResponse
public function update(CuttingRequest $request, Cutting $cutting): RedirectResponse public function update(CuttingRequest $request, Cutting $cutting): RedirectResponse
{ {
$this->cuttingService->update($cutting, $request->validated()); $this->cuttingService->update($cutting, $request->validated(), $request->user());
$this->flashUpdated('Proses cutting'); $this->flashUpdated('Proses cutting');
return redirect()->route('admin.manage.cuttings.index'); return redirect()->route('admin.manage.cuttings.index');
} }
public function destroy(Cutting $cutting): RedirectResponse public function destroy(Request $request, Cutting $cutting): RedirectResponse
{ {
$this->cuttingService->delete($cutting); $this->cuttingService->delete($cutting, $request->user());
$this->flashDeleted('Proses cutting'); $this->flashDeleted('Proses cutting');

View File

@ -97,16 +97,16 @@ public function edit(Order $order): Response|RedirectResponse
public function update(OrderRequest $request, Order $order): RedirectResponse public function update(OrderRequest $request, Order $order): RedirectResponse
{ {
$this->orderService->update($order, $request->validated()); $this->orderService->update($order, $request->validated(), $request->user());
$this->flashUpdated('Pesanan'); $this->flashUpdated('Pesanan');
return redirect()->route('admin.manage.orders.index'); return redirect()->route('admin.manage.orders.index');
} }
public function destroy(Order $order): RedirectResponse public function destroy(Request $request, Order $order): RedirectResponse
{ {
$this->orderService->delete($order); $this->orderService->delete($order, $request->user());
$this->flashDeleted('Pesanan'); $this->flashDeleted('Pesanan');
@ -117,7 +117,7 @@ public function transitionStatus(OrderStatusTransitionRequest $request, Order $o
{ {
$status = OrderStatus::from($request->validated('status')); $status = OrderStatus::from($request->validated('status'));
$this->orderService->transitionStatus($order, $status); $this->orderService->transitionStatus($order, $status, $request->user());
$this->flashSuccess($status->transitionStatusMessage()); $this->flashSuccess($status->transitionStatusMessage());

View File

@ -224,7 +224,7 @@ function () use ($reference, $amount, $description, $user, $cashAccount): CashTr
); );
} }
public function updateDeposit(CashTransaction $transaction, array $validated): void public function updateDeposit(CashTransaction $transaction, array $validated, User $user): void
{ {
$this->runInTransaction( $this->runInTransaction(
function () use ($transaction, $validated): void { function () use ($transaction, $validated): void {
@ -252,13 +252,13 @@ function () use ($transaction, $validated): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'✏️ Transaksi Kas Diperbarui', '✏️ Transaksi Kas Diperbarui',
"Transaksi kas dengan keterangan {$transaction->description} diperbarui menjadi senilai {$transaction->amount_formatted}.", "Transaksi kas dengan keterangan {$transaction->description} diperbarui menjadi senilai {$transaction->amount_formatted} oleh {$user->profile?->full_name}.",
['owner', 'developer', 'admin-toko'], ['owner', 'developer', 'admin-toko'],
route('admin.finance.cash.index'), route('admin.finance.cash.index'),
); );
} }
public function deleteTransaction(CashTransaction $transaction): void public function deleteTransaction(CashTransaction $transaction, User $user): void
{ {
$amountFormatted = $transaction->amount_formatted; $amountFormatted = $transaction->amount_formatted;
$description = $transaction->description; $description = $transaction->description;
@ -285,7 +285,7 @@ function () use ($transaction): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Transaksi Kas Dihapus', '🗑️ Transaksi Kas Dihapus',
"Transaksi kas senilai {$amountFormatted} dengan keterangan {$description} telah dihapus.", "Transaksi kas senilai {$amountFormatted} dengan keterangan {$description} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'admin-toko'], ['owner', 'developer', 'admin-toko'],
route('admin.finance.cash.index'), route('admin.finance.cash.index'),
); );

View File

@ -125,7 +125,7 @@ function () use ($employeeAdvance): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Kasbon Dihapus', '🗑️ Kasbon Dihapus',
"Kasbon sebesar {$amountFormatted} dengan keterangan {$description} telah dihapus.", "Kasbon sebesar {$amountFormatted} dengan keterangan {$description} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.finance.employee_advances.index'), route('admin.finance.employee_advances.index'),
); );

View File

@ -89,7 +89,7 @@ function () use ($validated, $user): Expense {
); );
} }
public function update(Expense $expense, array $validated): void public function update(Expense $expense, array $validated, User $user): void
{ {
$this->runInTransaction( $this->runInTransaction(
function () use ($expense, $validated): void { function () use ($expense, $validated): void {
@ -116,13 +116,13 @@ function () use ($expense, $validated): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'✏️ Pengeluaran Diperbarui', '✏️ Pengeluaran Diperbarui',
"Pengeluaran dengan keterangan {$expense->description} diperbarui menjadi sebesar {$expense->amount_formatted}.", "Pengeluaran dengan keterangan {$expense->description} diperbarui menjadi sebesar {$expense->amount_formatted} oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.finance.expenses.index'), route('admin.finance.expenses.index'),
); );
} }
public function delete(Expense $expense): void public function delete(Expense $expense, User $user): void
{ {
$amountFormatted = $expense->amount_formatted; $amountFormatted = $expense->amount_formatted;
$description = $expense->description; $description = $expense->description;
@ -141,7 +141,7 @@ function () use ($expense): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Pengeluaran Dihapus', '🗑️ Pengeluaran Dihapus',
"Pengeluaran sebesar {$amountFormatted} dengan keterangan {$description} telah dihapus.", "Pengeluaran sebesar {$amountFormatted} dengan keterangan {$description} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.finance.expenses.index'), route('admin.finance.expenses.index'),
); );

View File

@ -164,7 +164,7 @@ function () use ($employee, $validated): int {
); );
} }
public function delete(Attendance $attendance): void public function delete(Attendance $attendance, User $user): void
{ {
$attendance->loadMissing('employee.user.profile'); $attendance->loadMissing('employee.user.profile');
$employeeName = $attendance->employee?->user?->profile?->full_name; $employeeName = $attendance->employee?->user?->profile?->full_name;
@ -181,7 +181,7 @@ function () use ($attendance): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Presensi Dihapus', '🗑️ Presensi Dihapus',
"Data presensi {$employeeName} tanggal {$date?->toDateString()} telah dihapus.", "Data presensi {$employeeName} tanggal {$date?->toDateString()} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.hr.attendances.index'), route('admin.hr.attendances.index'),
); );

View File

@ -102,7 +102,7 @@ public function update(LeaveRequest $leaveRequest, array $validated, User $user)
); );
} }
public function delete(LeaveRequest $leaveRequest): void public function delete(LeaveRequest $leaveRequest, User $user): void
{ {
$totalDays = $leaveRequest->total_days; $totalDays = $leaveRequest->total_days;
$employeeName = $leaveRequest->employee?->user?->profile?->full_name; $employeeName = $leaveRequest->employee?->user?->profile?->full_name;
@ -116,7 +116,7 @@ function () use ($leaveRequest): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Pengajuan Cuti Dihapus', '🗑️ Pengajuan Cuti Dihapus',
"Pengajuan cuti {$totalDays} hari oleh {$employeeName} telah dihapus.", "Pengajuan cuti {$totalDays} hari oleh {$employeeName} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.hr.leave_requests.index'), route('admin.hr.leave_requests.index'),
); );

View File

@ -562,7 +562,7 @@ function () use ($validated, $user): Cutting {
return $cutting; return $cutting;
} }
public function update(Cutting $cutting, array $validated): void public function update(Cutting $cutting, array $validated, User $user): void
{ {
if (! $cutting->status->isEditable()) { if (! $cutting->status->isEditable()) {
throw ValidationException::withMessages([ throw ValidationException::withMessages([
@ -650,7 +650,7 @@ function () use ($cutting, $validated): void {
$description = $cutting->description ?? '-'; $description = $cutting->description ?? '-';
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'✏️ Proses Cutting Diperbarui', '✏️ Proses Cutting Diperbarui',
"Proses cutting dengan deskripsi '{$description}' telah diperbarui.", "Proses cutting dengan deskripsi '{$description}' telah diperbarui oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.cuttings.index'), route('admin.manage.cuttings.index'),
); );
@ -658,7 +658,7 @@ function () use ($cutting, $validated): void {
$this->cacheForgetByPattern('manage:cuttings:*'); $this->cacheForgetByPattern('manage:cuttings:*');
} }
public function delete(Cutting $cutting): void public function delete(Cutting $cutting, User $user): void
{ {
if (! in_array($cutting->status, [CuttingStatus::IN_PROGRESS, CuttingStatus::REJECTED], true)) { if (! in_array($cutting->status, [CuttingStatus::IN_PROGRESS, CuttingStatus::REJECTED], true)) {
throw ValidationException::withMessages([ throw ValidationException::withMessages([
@ -688,7 +688,7 @@ function () use ($cutting): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Proses Cutting Dihapus', '🗑️ Proses Cutting Dihapus',
"Proses cutting dengan deskripsi {$description} telah dihapus.", "Proses cutting dengan deskripsi {$description} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.cuttings.index'), route('admin.manage.cuttings.index'),
); );
@ -759,11 +759,11 @@ function () use ($cutting, $status, $verificationNote, $results, $resultPrices,
$description = $cutting->description ?? '-'; $description = $cutting->description ?? '-';
$message = match ($status) { $message = match ($status) {
CuttingStatus::COMPLETED => "Proses cutting dengan deskripsi '{$description}' telah selesai dan menunggu verifikasi.", CuttingStatus::COMPLETED => "Proses cutting dengan deskripsi '{$description}' telah selesai oleh {$user->profile?->full_name} dan menunggu verifikasi.",
CuttingStatus::VERIFIED => "Proses cutting dengan deskripsi '{$description}' telah diverifikasi.", CuttingStatus::VERIFIED => "Proses cutting dengan deskripsi '{$description}' telah diverifikasi oleh {$user->profile?->full_name}.",
CuttingStatus::REJECTED => "Proses cutting dengan deskripsi '{$description}' ditolak".($reason ? " dengan alasan: '{$reason}'" : '').'.', CuttingStatus::REJECTED => "Proses cutting dengan deskripsi '{$description}' ditolak oleh {$user->profile?->full_name}".($reason ? " dengan alasan: '{$reason}'" : '').'.',
CuttingStatus::IN_PROGRESS => "Proses cutting dengan deskripsi '{$description}' dikembalikan ke proses.", CuttingStatus::IN_PROGRESS => "Proses cutting dengan deskripsi '{$description}' dikembalikan ke proses oleh {$user->profile?->full_name}.",
default => "Status proses cutting dengan deskripsi '{$description}' telah diperbarui ke: {$status->label()}.", default => "Status proses cutting dengan deskripsi '{$description}' telah diperbarui ke: {$status->label()} oleh {$user->profile?->full_name}.",
}; };
$title = match ($status) { $title = match ($status) {

View File

@ -508,7 +508,7 @@ function () use ($validated, $user): Order {
return $order; return $order;
} }
public function update(Order $order, array $validated): void public function update(Order $order, array $validated, User $user): void
{ {
$order->ensureEditable(); $order->ensureEditable();
@ -589,7 +589,7 @@ function () use ($order, $validated): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'✏️ Pesanan Diperbarui', '✏️ Pesanan Diperbarui',
"Pesanan {$order->order_number} senilai {$order->total_amount_formatted} telah diperbarui.", "Pesanan {$order->order_number} senilai {$order->total_amount_formatted} telah diperbarui oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.orders.index'), route('admin.manage.orders.index'),
); );
@ -597,7 +597,7 @@ function () use ($order, $validated): void {
$this->cacheForgetByPattern('manage:orders:*'); $this->cacheForgetByPattern('manage:orders:*');
} }
public function delete(Order $order): void public function delete(Order $order, User $user): void
{ {
$orderNumber = $order->order_number; $orderNumber = $order->order_number;
$totalAmount = $order->total_amount; $totalAmount = $order->total_amount;
@ -624,7 +624,7 @@ function () use ($order): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'🗑️ Pesanan Dihapus', '🗑️ Pesanan Dihapus',
"Pesanan {$orderNumber} senilai {$order->total_amount_formatted} telah dihapus.", "Pesanan {$orderNumber} senilai {$order->total_amount_formatted} telah dihapus oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.orders.index'), route('admin.manage.orders.index'),
); );
@ -632,7 +632,7 @@ function () use ($order): void {
$this->cacheForgetByPattern('manage:orders:*'); $this->cacheForgetByPattern('manage:orders:*');
} }
public function transitionStatus(Order $order, OrderStatus $status): void public function transitionStatus(Order $order, OrderStatus $status, User $user): void
{ {
if (! $order->status->canTransitionTo($status)) { if (! $order->status->canTransitionTo($status)) {
throw ValidationException::withMessages([ throw ValidationException::withMessages([
@ -663,7 +663,7 @@ function () use ($order, $status): void {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'📦 Status Pesanan Diubah', '📦 Status Pesanan Diubah',
"Pesanan {$order->order_number} diubah statusnya menjadi {$status->label()}.", "Pesanan {$order->order_number} diubah statusnya menjadi {$status->label()} oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.orders.index'), route('admin.manage.orders.index'),
); );

View File

@ -273,7 +273,7 @@ public function rejectRequest(
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'❌ Pengajuan Ditolak', '❌ Pengajuan Ditolak',
"Pengajuan {$request->action->label()} {$subjectLabel} '{$title}' ditolak dengan alasan: '{$reason}'.", "Pengajuan {$request->action->label()} {$subjectLabel} '{$title}' ditolak oleh {$user->profile?->full_name} dengan alasan: '{$reason}'.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.dashboard'), route('admin.dashboard'),
); );

View File

@ -35,7 +35,7 @@ public function transfer(int $variantId, int $quantity, User $user, ?string $not
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'📦 Perubahan Stok Ecer', '📦 Perubahan Stok Ecer',
"Perubahan {$quantity} pcs stok ecer untuk varian '{$variant->name}' telah diterapkan.", "Perubahan {$quantity} pcs stok ecer untuk varian '{$variant->name}' telah diterapkan oleh {$user->profile?->full_name}.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.master.products.index', ['search_id' => $variant->product_id]), route('admin.master.products.index', ['search_id' => $variant->product_id]),
); );

View File

@ -142,14 +142,14 @@ public function submitVerification(
if ($isOwner) { if ($isOwner) {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'📦 Stok Cutting Diverifikasi', '📦 Stok Cutting Diverifikasi',
"Cutting dengan deskripsi '{$description}' telah disetujui owner dan stok produk telah ditambahkan ke toko.", "Cutting dengan deskripsi '{$description}' telah disetujui oleh {$user->profile?->full_name} dan stok produk telah ditambahkan ke toko.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.stocks.index'), route('admin.manage.stocks.index'),
); );
} else { } else {
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'📦 Verifikasi Stok Menunggu Persetujuan', '📦 Verifikasi Stok Menunggu Persetujuan',
"Cutting dengan deskripsi '{$description}' telah diajukan verifikasi dan menunggu persetujuan owner.", "Cutting dengan deskripsi '{$description}' telah diajukan verifikasi oleh {$user->profile?->full_name} dan menunggu persetujuan owner.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.stocks.index'), route('admin.manage.stocks.index'),
); );
@ -205,7 +205,7 @@ public function approveVerification(
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'📦 Stok Cutting Diverifikasi', '📦 Stok Cutting Diverifikasi',
"Cutting dengan deskripsi '{$description}' telah disetujui owner dan stok produk telah ditambahkan ke toko.", "Cutting dengan deskripsi '{$description}' telah disetujui oleh {$user->profile?->full_name} dan stok produk telah ditambahkan ke toko.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.stocks.index'), route('admin.manage.stocks.index'),
); );
@ -250,7 +250,7 @@ public function rejectVerification(
$description = $cutting->description ?? '-'; $description = $cutting->description ?? '-';
$this->pushNotificationService->sendToRoles( $this->pushNotificationService->sendToRoles(
'📦 Verifikasi Cutting Ditolak Owner', '📦 Verifikasi Cutting Ditolak Owner',
"Cutting dengan deskripsi '{$description}' ditolak oleh owner dengan alasan: '{$reason}'.", "Cutting dengan deskripsi '{$description}' ditolak oleh {$user->profile?->full_name} dengan alasan: '{$reason}'.",
['owner', 'developer', 'direktur'], ['owner', 'developer', 'direktur'],
route('admin.manage.stocks.index'), route('admin.manage.stocks.index'),
); );