From e406ecd63db4aec1b54d54c261033f7cdfc65e3b Mon Sep 17 00:00:00 2001 From: sky121113 Date: Tue, 24 Feb 2026 17:29:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AF=A6=E4=BD=9C=E6=87=89=E4=BB=98?= =?UTF-8?q?=E5=B8=B3=E6=AC=BE=E8=88=87=E9=8A=B7=E5=94=AE=E8=A8=82=E5=96=AE?= =?UTF-8?q?=E6=AC=8A=E9=99=90=E7=AE=A1=E7=90=86=E8=88=87=E9=80=B2=E8=B2=A8?= =?UTF-8?q?=E5=96=AE=E6=AC=8A=E9=99=90=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Core/Controllers/RoleController.php | 2 + app/Modules/Finance/Routes/web.php | 14 +++-- app/Modules/Integration/Routes/web.php | 6 ++- .../Controllers/GoodsReceiptController.php | 2 +- app/Modules/Inventory/Routes/web.php | 2 +- database/seeders/PermissionSeeder.php | 9 +++- resources/js/Pages/AccountPayable/Show.tsx | 53 +++++++++++-------- .../js/Pages/Inventory/GoodsReceipt/Show.tsx | 2 +- 8 files changed, 57 insertions(+), 33 deletions(-) diff --git a/app/Modules/Core/Controllers/RoleController.php b/app/Modules/Core/Controllers/RoleController.php index 30735a6..5497787 100644 --- a/app/Modules/Core/Controllers/RoleController.php +++ b/app/Modules/Core/Controllers/RoleController.php @@ -193,7 +193,9 @@ class RoleController extends Controller 'production_orders' => '生產工單管理', 'utility_fees' => '公共事業費管理', 'accounting' => '會計報表', + 'account_payables' => '應付帳款', 'sales_imports' => '銷售單匯入管理', + 'sales_orders' => '銷售訂單管理', 'store_requisitions' => '門市叫貨申請', 'users' => '使用者管理', 'roles' => '角色與權限', diff --git a/app/Modules/Finance/Routes/web.php b/app/Modules/Finance/Routes/web.php index dd0a8cd..1ec273d 100644 --- a/app/Modules/Finance/Routes/web.php +++ b/app/Modules/Finance/Routes/web.php @@ -9,10 +9,16 @@ use App\Modules\Finance\Controllers\AccountPayableController; Route::middleware('auth')->group(function () { // 應付帳款 Route::group(['prefix' => 'finance'], function () { - Route::get('/account-payables', [AccountPayableController::class, 'index'])->name('account-payables.index'); - Route::get('/account-payables/{accountPayable}', [AccountPayableController::class, 'show'])->name('account-payables.show'); - Route::post('/account-payables/{accountPayable}/invoice', [AccountPayableController::class, 'updateInvoice'])->name('account-payables.invoice'); - Route::post('/account-payables/{accountPayable}/pay', [AccountPayableController::class, 'pay'])->name('account-payables.pay'); + Route::middleware('permission:account_payables.view')->group(function () { + Route::get('/account-payables', [AccountPayableController::class, 'index'])->name('account-payables.index'); + Route::get('/account-payables/{accountPayable}', [AccountPayableController::class, 'show'])->name('account-payables.show'); + }); + Route::middleware('permission:account_payables.edit')->group(function () { + Route::post('/account-payables/{accountPayable}/invoice', [AccountPayableController::class, 'updateInvoice'])->name('account-payables.invoice'); + }); + Route::middleware('permission:account_payables.pay')->group(function () { + Route::post('/account-payables/{accountPayable}/pay', [AccountPayableController::class, 'pay'])->name('account-payables.pay'); + }); }); // 公共事業費管理 diff --git a/app/Modules/Integration/Routes/web.php b/app/Modules/Integration/Routes/web.php index 6139c1f..1165dd2 100644 --- a/app/Modules/Integration/Routes/web.php +++ b/app/Modules/Integration/Routes/web.php @@ -5,7 +5,9 @@ use Illuminate\Support\Facades\Route; Route::middleware(['web', 'auth', 'verified'])->group(function () { Route::prefix('integration')->name('integration.')->group(function () { - Route::get('sales-orders', [SalesOrderController::class, 'index'])->name('sales-orders.index'); - Route::get('sales-orders/{salesOrder}', [SalesOrderController::class, 'show'])->name('sales-orders.show'); + Route::middleware('permission:sales_orders.view')->group(function () { + Route::get('sales-orders', [SalesOrderController::class, 'index'])->name('sales-orders.index'); + Route::get('sales-orders/{salesOrder}', [SalesOrderController::class, 'show'])->name('sales-orders.show'); + }); }); }); diff --git a/app/Modules/Inventory/Controllers/GoodsReceiptController.php b/app/Modules/Inventory/Controllers/GoodsReceiptController.php index b3cfcde..e005793 100644 --- a/app/Modules/Inventory/Controllers/GoodsReceiptController.php +++ b/app/Modules/Inventory/Controllers/GoodsReceiptController.php @@ -185,7 +185,7 @@ class GoodsReceiptController extends Controller public function submit(GoodsReceipt $goodsReceipt) { - if (!auth()->user()->can('goods_receipts.update')) { + if (!auth()->user()->can('goods_receipts.edit')) { return back()->with('error', '您沒有權限確認點收'); } diff --git a/app/Modules/Inventory/Routes/web.php b/app/Modules/Inventory/Routes/web.php index 063d97f..c71d924 100644 --- a/app/Modules/Inventory/Routes/web.php +++ b/app/Modules/Inventory/Routes/web.php @@ -183,7 +183,7 @@ Route::middleware('auth')->group(function () { // 點收提交路由 Route::post('/goods-receipts/{goods_receipt}/submit', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'submit']) - ->middleware('permission:goods_receipts.update') + ->middleware('permission:goods_receipts.edit') ->name('goods-receipts.submit'); Route::delete('/goods-receipts/{goods_receipt}', [\App\Modules\Inventory\Controllers\GoodsReceiptController::class, 'destroy']) diff --git a/database/seeders/PermissionSeeder.php b/database/seeders/PermissionSeeder.php index 5004632..e518a7d 100644 --- a/database/seeders/PermissionSeeder.php +++ b/database/seeders/PermissionSeeder.php @@ -65,7 +65,7 @@ class PermissionSeeder extends Seeder // 進貨單管理 'goods_receipts.view' => '檢視', 'goods_receipts.create' => '建立', - 'goods_receipts.edit' => '編輯', + 'goods_receipts.edit' => '確認點收', 'goods_receipts.delete' => '刪除', // 出貨單管理 (Delivery Notes / Shipping Orders) @@ -126,6 +126,11 @@ class PermissionSeeder extends Seeder 'accounting.view' => '檢視', 'accounting.export' => '匯出', + // 應付帳款管理 + 'account_payables.view' => '檢視', + 'account_payables.edit' => '登記發票', + 'account_payables.pay' => '標記付款', + // 銷售匯入管理 'sales_imports.view' => '檢視', 'sales_imports.create' => '建立', @@ -184,6 +189,7 @@ class PermissionSeeder extends Seeder 'system.view_logs', 'utility_fees.view', 'utility_fees.create', 'utility_fees.edit', 'utility_fees.delete', 'accounting.view', 'accounting.export', + 'account_payables.view', 'account_payables.edit', 'account_payables.pay', 'sales_imports.view', 'sales_imports.create', 'sales_imports.confirm', 'sales_imports.delete', 'store_requisitions.view', 'store_requisitions.create', 'store_requisitions.edit', 'store_requisitions.delete', 'store_requisitions.approve', 'store_requisitions.cancel', @@ -225,6 +231,7 @@ class PermissionSeeder extends Seeder 'utility_fees.view', 'inventory_report.view', 'accounting.view', + 'account_payables.view', 'sales_orders.view', ]); diff --git a/resources/js/Pages/AccountPayable/Show.tsx b/resources/js/Pages/AccountPayable/Show.tsx index 45e47f8..6f23e91 100644 --- a/resources/js/Pages/AccountPayable/Show.tsx +++ b/resources/js/Pages/AccountPayable/Show.tsx @@ -10,6 +10,7 @@ import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogD import { Input } from '@/Components/ui/input'; import { Label } from '@/Components/ui/label'; import { toast } from 'sonner'; +import { Can } from '@/Components/Permission/Can'; const getStatusBadgeVariant = (status: string) => { switch (status) { @@ -117,23 +118,27 @@ export default function AccountPayableShow({ payable }: any) {
- + + + {payable.status !== 'paid' && ( - + + + )}
@@ -225,14 +230,16 @@ export default function AccountPayableShow({ payable }: any) { 發票資訊 - + + +
diff --git a/resources/js/Pages/Inventory/GoodsReceipt/Show.tsx b/resources/js/Pages/Inventory/GoodsReceipt/Show.tsx index 54c2d2a..259868f 100644 --- a/resources/js/Pages/Inventory/GoodsReceipt/Show.tsx +++ b/resources/js/Pages/Inventory/GoodsReceipt/Show.tsx @@ -250,7 +250,7 @@ function GoodsReceiptActions({ receipt }: { receipt: GoodsReceipt }) { // 權限判斷 const canView = isSuperAdmin || permissions.includes('goods_receipts.view'); - const canEdit = isSuperAdmin || permissions.includes('goods_receipts.update'); + const canEdit = isSuperAdmin || permissions.includes('goods_receipts.edit'); const canDelete = isSuperAdmin || permissions.includes('goods_receipts.delete'); const canSubmit = canEdit || canView;