From 9351e215e4f179ed698eaccee7f38a03ad56baf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Fri, 20 Feb 2026 19:26:42 +0900 Subject: [PATCH] =?UTF-8?q?feat:=ED=86=B5=ED=95=A9=EC=A0=95=EC=82=B0=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=EC=83=81=EC=84=B8=20=EC=8A=B9=EC=9D=B8?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Finance/SalesCommissionController.php | 21 +++++++++++++++++++ app/Models/Sales/SalesCommission.php | 16 ++++++++++++++ app/Services/SalesCommissionService.php | 14 +++++++++++++ .../views/finance/settlement/index.blade.php | 17 +++++++++++++++ .../commission/detail-modal.blade.php | 1 + routes/web.php | 1 + 6 files changed, 70 insertions(+) diff --git a/app/Http/Controllers/Finance/SalesCommissionController.php b/app/Http/Controllers/Finance/SalesCommissionController.php index 0692b5cd..3f915077 100644 --- a/app/Http/Controllers/Finance/SalesCommissionController.php +++ b/app/Http/Controllers/Finance/SalesCommissionController.php @@ -232,6 +232,27 @@ public function bulkMarkPaid(Request $request): JsonResponse } } + /** + * 승인취소 처리 + */ + public function unapprove(int $id): JsonResponse + { + try { + $commission = $this->service->unapprove($id); + + return response()->json([ + 'success' => true, + 'message' => '승인이 취소되었습니다.', + 'data' => $commission, + ]); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => $e->getMessage(), + ], 400); + } + } + /** * 취소 처리 */ diff --git a/app/Models/Sales/SalesCommission.php b/app/Models/Sales/SalesCommission.php index 3db745f3..663384ff 100644 --- a/app/Models/Sales/SalesCommission.php +++ b/app/Models/Sales/SalesCommission.php @@ -255,6 +255,22 @@ public function markAsPaid(?string $bankReference = null): bool ]); } + /** + * 승인취소 처리 (approved → pending) + */ + public function unapprove(): bool + { + if ($this->status !== self::STATUS_APPROVED) { + return false; + } + + return $this->update([ + 'status' => self::STATUS_PENDING, + 'approved_by' => null, + 'approved_at' => null, + ]); + } + /** * 취소 처리 */ diff --git a/app/Services/SalesCommissionService.php b/app/Services/SalesCommissionService.php index 464550ae..861a3fef 100644 --- a/app/Services/SalesCommissionService.php +++ b/app/Services/SalesCommissionService.php @@ -350,6 +350,20 @@ public function bulkMarkAsPaid(array $ids, ?string $bankReference = null): int return $count; } + /** + * 승인취소 처리 + */ + public function unapprove(int $commissionId): SalesCommission + { + $commission = SalesCommission::findOrFail($commissionId); + + if (!$commission->unapprove()) { + throw new \Exception('승인취소할 수 없는 상태입니다.'); + } + + return $commission->fresh(['tenant', 'partner.user', 'manager']); + } + /** * 취소 처리 */ diff --git a/resources/views/finance/settlement/index.blade.php b/resources/views/finance/settlement/index.blade.php index 851934c5..3cf53929 100644 --- a/resources/views/finance/settlement/index.blade.php +++ b/resources/views/finance/settlement/index.blade.php @@ -337,6 +337,23 @@ function bulkMarkPaid() { }); } + function unapproveCommission(id) { + if (!confirm('승인을 취소하시겠습니까?')) return; + + fetch('{{ url("finance/sales-commissions") }}/' + id + '/unapprove', { + method: 'POST', + headers: { + 'X-CSRF-TOKEN': '{{ csrf_token() }}', + 'Accept': 'application/json', + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { alert(data.message); location.reload(); } + else { alert(data.message || '오류가 발생했습니다.'); } + }); + } + function cancelCommission(id) { if (!confirm('취소하시겠습니까?')) return; diff --git a/resources/views/finance/settlement/partials/commission/detail-modal.blade.php b/resources/views/finance/settlement/partials/commission/detail-modal.blade.php index 2a0dfcf7..92f1bc83 100644 --- a/resources/views/finance/settlement/partials/commission/detail-modal.blade.php +++ b/resources/views/finance/settlement/partials/commission/detail-modal.blade.php @@ -171,6 +171,7 @@ @elseif ($commission->status === 'approved') + @endif diff --git a/routes/web.php b/routes/web.php index 626297f3..f4ed2a33 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1030,6 +1030,7 @@ Route::get('/{id}/detail', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'detail'])->name('detail'); Route::post('/{id}/approve', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'approve'])->name('approve'); Route::post('/{id}/mark-paid', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'markPaid'])->name('mark-paid'); + Route::post('/{id}/unapprove', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'unapprove'])->name('unapprove'); Route::post('/{id}/cancel', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'cancel'])->name('cancel'); Route::put('/{id}/update-date', [\App\Http\Controllers\Finance\SalesCommissionController::class, 'updateCommissionDate'])->name('update-date'); });