big update all menus

This commit is contained in:
Wian Drs
2026-08-07 09:16:13 +07:00
parent 75342dc7b7
commit e7575ba1c0
101 changed files with 3451 additions and 89 deletions
+90 -2
View File
@@ -12,6 +12,10 @@ use App\Http\Controllers\Menu\MenuController;
use App\Http\Controllers\Menu\MenuGroupController;
use App\Http\Controllers\Menu\MenuListController;
use App\Http\Controllers\Nas\NasResourceController;
use App\Http\Controllers\Nas\PackageProfileDeploymentController;
use App\Http\Controllers\Nas\ScriptPolicyController;
use App\Http\Controllers\Nas\TenantNasSettingController;
use App\Http\Controllers\Nas\RadiusClusterController;
use App\Http\Controllers\Notification\NotificationController;
use App\Http\Controllers\Notification\NotificationWebhookController;
use App\Http\Controllers\Payment\PaymentGatewayController;
@@ -26,6 +30,9 @@ use App\Http\Controllers\User\UserController;
use App\Http\Controllers\Voucher\VoucherController;
use App\Http\Controllers\Wallet\WalletController;
use App\Http\Controllers\Wilayah\WilayahController;
use App\Http\Controllers\Warehouse\WarehouseController;
use App\Http\Controllers\Warehouse\WarehouseBatchController;
use App\Http\Controllers\Warehouse\WarehouseLocationController;
use Illuminate\Support\Facades\Route;
Route::post('/login', [AuthController::class, 'login']);
@@ -135,6 +142,33 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::delete('customers/{customer}/notification-contacts/{contact}', [NotificationController::class, 'destroyContact'])
->middleware('menu.permission:customers-active,update')->whereNumber('customer')->whereNumber('contact')->name('customers.notification-contacts.destroy');
Route::post('nas/mikrotiks/{id}/test-connection', [NasResourceController::class, 'testConnection'])
->defaults('nas_resource', 'mikrotik')
->middleware('menu.permission:nas-mikrotik,update')
->whereNumber('id')
->name('nas.mikrotiks.test-connection');
Route::get('nas/backend-setting', [TenantNasSettingController::class, 'show'])
->middleware('menu.permission:nas-mikrotik,view')->name('nas.backend-setting.show');
Route::put('nas/backend-setting', [TenantNasSettingController::class, 'update'])
->middleware('menu.permission:nas-mikrotik,update')->name('nas.backend-setting.update');
Route::get('nas/package-profiles/{profile}/targets', [PackageProfileDeploymentController::class, 'index'])
->middleware('menu.permission:nas-package-profiles,view')->name('nas.package-profiles.targets.index');
Route::get('nas/package-profile-script-options', [PackageProfileDeploymentController::class, 'scriptOptions'])
->middleware('menu.permission:nas-package-profiles,view')->name('nas.package-profiles.script-options');
Route::post('nas/package-profiles/{profile}/targets', [PackageProfileDeploymentController::class, 'store'])
->middleware('menu.permission:nas-package-profiles,update')->name('nas.package-profiles.targets.store');
Route::post('nas/package-profile-targets/{target}/sync', [PackageProfileDeploymentController::class, 'sync'])
->middleware('menu.permission:nas-package-profiles,update')->name('nas.package-profile-targets.sync');
Route::get('nas/script-policies', [ScriptPolicyController::class, 'index'])->name('nas.script-policies.index');
Route::post('nas/script-policies', [ScriptPolicyController::class, 'store'])->name('nas.script-policies.store');
Route::get('nas/script-policies/{policy}', [ScriptPolicyController::class, 'show'])->name('nas.script-policies.show');
Route::put('nas/script-policies/{policy}', [ScriptPolicyController::class, 'update'])->name('nas.script-policies.update');
Route::apiResource('nas/radius-clusters', RadiusClusterController::class)
->parameters(['radius-clusters' => 'radiusCluster'])
->middleware('access.level:master_admin');
foreach ([
'system' => ['channel' => 'system', 'menu' => 'notifications-system'],
'whatsapp-official' => ['channel' => 'whatsapp_official', 'menu' => 'notifications-wa-official'],
@@ -253,6 +287,10 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::get('customers/options', [CustomerController::class, 'options'])
->name('customers.options')
->middleware('menu.permission:customers-orders,view');
Route::get('customers/options/odp/{node}/ports', [CustomerController::class, 'odpPorts'])
->name('customers.options.odp-ports')->whereNumber('node')
->middleware('menu.permission:customers-orders,view');
foreach ([
'orders' => 'customers-orders',
@@ -275,6 +313,9 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::post('customers', [CustomerController::class, 'store'])
->name('customers.store')
->middleware('menu.permission:customers-orders,create');
Route::post('customers/ocr-ktp', [CustomerController::class, 'ocrKtp'])
->name('customers.ocr-ktp')
->middleware('menu.permission:customers-orders,create');
Route::put('customers/{id}', [CustomerController::class, 'update'])
->name('customers.update')
->whereNumber('id')
@@ -286,7 +327,15 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::post('customers/{id}/activate', [CustomerController::class, 'activate'])
->name('customers.activate')
->whereNumber('id')
->middleware('menu.permission:customers-orders,update');
->middleware('menu.permission:customers-orders,activate');
Route::put('customers/{id}/registration', [CustomerController::class, 'updateRegistration'])
->name('customers.registration.update')
->whereNumber('id')
->middleware('menu.permission:customers-orders,create');
Route::put('customers/{id}/activation-preparation', [CustomerController::class, 'prepareActivation'])
->name('customers.activation-preparation')
->whereNumber('id')
->middleware('menu.permission:customers-orders,activate');
Route::post('customers/{id}/deactivate', [CustomerController::class, 'deactivate'])
->name('customers.deactivate')
->whereNumber('id')
@@ -295,6 +344,10 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
->name('customers.destroy')
->whereNumber('id')
->middleware('menu.permission:customers-inactive,delete');
Route::delete('customers/{id}/cancel-order', [CustomerController::class, 'cancelOrder'])
->name('customers.cancel-order')
->whereNumber('id')
->middleware('menu.permission:customers-orders,delete');
Route::post('customers/{id}/restore', [CustomerController::class, 'restore'])
->name('customers.restore')
->whereNumber('id')
@@ -339,6 +392,11 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
});
}
Route::get('tickets/options', [TicketController::class, 'options'])->middleware('menu.permission:ticketing-ticket,view');
Route::post('tickets/{ticket}/materials', [TicketController::class, 'storeMaterial'])->middleware('menu.permission:ticketing-ticket,update');
Route::get('tickets/{ticket}/material-options', [TicketController::class, 'materialOptions'])->middleware('menu.permission:ticketing-ticket,update');
Route::get('tickets/{ticket}/installation-ports/{node}', [TicketController::class, 'installationPorts'])->middleware('menu.permission:ticketing-ticket,update');
Route::delete('tickets/{ticket}/materials/{material}', [TicketController::class, 'destroyMaterial'])->middleware('menu.permission:ticketing-ticket,update');
Route::apiResource('tickets', TicketController::class)
->middleware('menu.resource:ticketing-ticket');
@@ -377,6 +435,8 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::post('/close', 'close')
->middleware('menu.permission:ticketing-ticket,update');
Route::post('/verify', 'verify')->middleware('menu.permission:ticketing-ticket,approve');
Route::post('/installation-step', 'installationStep')->middleware('menu.permission:ticketing-ticket,update');
Route::post('/cancel', 'cancel')
->middleware('menu.permission:ticketing-ticket,delete');
@@ -399,6 +459,31 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::get('/history/{barcode_id}', 'history');
});
Route::middleware('menu.resource:warehouse-items')->group(function(){
Route::get('warehouse/items',[WarehouseBatchController::class,'index']);
Route::get('warehouse/options',[WarehouseController::class,'options']);
Route::post('warehouse/barcodes/{barcode}/issue',[WarehouseController::class,'issue']);
Route::get('warehouse/movements',[WarehouseController::class,'movements']);
});
Route::middleware('menu.resource:warehouse-pending')->group(function(){
Route::get('warehouse/pending',[WarehouseBatchController::class,'index']);
Route::post('warehouse/pending',[WarehouseBatchController::class,'store']);
Route::put('warehouse/pending/{item}/serials',[WarehouseBatchController::class,'updateSerials']);
Route::post('warehouse/pending/{item}/post',[WarehouseBatchController::class,'post']);
Route::delete('warehouse/pending/{item}',[WarehouseBatchController::class,'destroy']);
});
Route::get('warehouse/depleted',[WarehouseBatchController::class,'index'])->middleware('menu.resource:warehouse-depleted');
Route::get('warehouse/batches/{item}',[WarehouseBatchController::class,'show'])->middleware('menu.resource:warehouse-items');
Route::get('warehouse/batches/{item}/barcodes/{barcode}/movements',[WarehouseBatchController::class,'barcodeMovements'])->middleware('menu.resource:warehouse-items');
Route::apiResource('warehouse/locations',WarehouseLocationController::class)->parameters(['locations'=>'warehouse'])->except('show')->middleware('menu.resource:warehouse-locations');
Route::middleware('menu.resource:warehouse-codes')->group(function(){
Route::get('warehouse/item-codes',[WarehouseController::class,'codeIndex']);
Route::post('warehouse/item-codes',[WarehouseController::class,'codeStore']);
Route::put('warehouse/item-codes/{code}',[WarehouseController::class,'codeUpdate']);
Route::delete('warehouse/item-codes/{code}',[WarehouseController::class,'codeDestroy']);
});
Route::get('warehouse/technician-inventory',[WarehouseController::class,'technicianInventory'])->middleware('menu.resource:warehouse-technician-inventory');
Route::post('warehouse/technician-inventory/return',[WarehouseController::class,'returnFromTechnician'])->middleware('menu.resource:warehouse-technician-inventory');
Route::prefix('audit-logs')
->middleware('access.level:tenant_owner')
@@ -481,7 +566,7 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
]);
Route::apiResource('tenants', TenantController::class)
->only(['index', 'show'])
->middleware('access.level:tenant_owner');
->middleware('menu.resource:tenants');
Route::apiResource('tenants', TenantController::class)
->except(['index', 'show'])
->middleware('access.level:master_admin');
@@ -504,6 +589,9 @@ Route::middleware(['auth:sanctum', 'tenant.context'])->group(function () {
Route::put('/menus', 'syncMenus');
});
Route::get('tenants/{tenant}/installation-setting', [TenantController::class,'installationSetting'])->middleware('menu.permission:tenants,view');
Route::put('tenants/{tenant}/installation-setting', [TenantController::class,'updateInstallationSetting'])->middleware('menu.permission:tenants,update');
Route::prefix('users/{user}')
->middleware([
'access.level:tenant_owner',
+11
View File
@@ -19,3 +19,14 @@ Schedule::command('notifications:prune')
->timezone(config('app.timezone'))
->withoutOverlapping()
->onOneServer();
Schedule::command('nas:check-mikrotiks')
->everyMinute()
->withoutOverlapping()
->onOneServer();
Schedule::call(function () {
\App\Models\CustomerNasAccount::query()->whereIn('status', ['active','disabled'])
->where(fn ($q) => $q->whereNull('last_reconciled_at')->orWhere('last_reconciled_at','<=',now()->subMinutes(5)))
->select('id')->chunkById(200, fn ($rows) => $rows->each(fn ($row) => \App\Jobs\ReconcileCustomerNasAccount::dispatch($row->id)));
})->everyMinute()->name('nas-reconcile-accounts')->withoutOverlapping()->onOneServer();