SMS service

This commit is contained in:
Simon Pocrnjič
2025-10-24 21:39:10 +02:00
parent 3a2eed7dda
commit 930ac83604
52 changed files with 3830 additions and 36 deletions
+56
View File
@@ -26,6 +26,39 @@
Route::redirect('/', 'login');
// SMS provider webhook (delivery reports and replies)
Route::match(['GET', 'POST'], 'webhooks/sms/smsapi-si', \App\Http\Controllers\SmsWebhookController::class)
->name('webhooks.sms.smsapi-si');
// Admin SMS endpoints (under manage-settings)
Route::middleware([
'auth:sanctum',
config('jetstream.auth_session'),
'verified',
'permission:manage-settings',
])->prefix('admin')->name('admin.')->group(function () {
Route::get('sms-profiles', [\App\Http\Controllers\Admin\SmsProfileController::class, 'index'])->name('sms-profiles.index');
Route::post('sms-profiles', [\App\Http\Controllers\Admin\SmsProfileController::class, 'store'])->name('sms-profiles.store');
Route::post('sms-profiles/{smsProfile}/test-send', [\App\Http\Controllers\Admin\SmsProfileController::class, 'testSend'])->name('sms-profiles.test-send');
Route::post('sms-profiles/{smsProfile}/balance', [\App\Http\Controllers\Admin\SmsProfileController::class, 'balance'])->name('sms-profiles.balance');
Route::post('sms-profiles/{smsProfile}/price', [\App\Http\Controllers\Admin\SmsProfileController::class, 'price'])->name('sms-profiles.price');
// SMS senders management
Route::get('sms-senders', [\App\Http\Controllers\Admin\SmsSenderController::class, 'index'])->name('sms-senders.index');
Route::post('sms-senders', [\App\Http\Controllers\Admin\SmsSenderController::class, 'store'])->name('sms-senders.store');
Route::put('sms-senders/{smsSender}', [\App\Http\Controllers\Admin\SmsSenderController::class, 'update'])->name('sms-senders.update');
Route::post('sms-senders/{smsSender}/toggle', [\App\Http\Controllers\Admin\SmsSenderController::class, 'toggle'])->name('sms-senders.toggle');
Route::delete('sms-senders/{smsSender}', [\App\Http\Controllers\Admin\SmsSenderController::class, 'destroy'])->name('sms-senders.destroy');
// SMS templates management
Route::get('sms-templates', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'index'])->name('sms-templates.index');
Route::post('sms-templates', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'store'])->name('sms-templates.store');
Route::put('sms-templates/{smsTemplate}', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'update'])->name('sms-templates.update');
Route::post('sms-templates/{smsTemplate}/toggle', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'toggle'])->name('sms-templates.toggle');
Route::delete('sms-templates/{smsTemplate}', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'destroy'])->name('sms-templates.destroy');
Route::post('sms-templates/{smsTemplate}/send-test', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'sendTest'])->name('sms-templates.send-test');
});
Route::middleware([
'auth:sanctum',
config('jetstream.auth_session'),
@@ -99,6 +132,27 @@
// Email logs
Route::get('email-logs', [\App\Http\Controllers\Admin\EmailLogController::class, 'index'])->name('email-logs.index');
Route::get('email-logs/{emailLog}', [\App\Http\Controllers\Admin\EmailLogController::class, 'show'])->name('email-logs.show');
// SMS senders
Route::get('sms-senders', [\App\Http\Controllers\Admin\SmsSenderController::class, 'index'])->name('sms-senders.index');
Route::post('sms-senders', [\App\Http\Controllers\Admin\SmsSenderController::class, 'store'])->name('sms-senders.store');
Route::put('sms-senders/{smsSender}', [\App\Http\Controllers\Admin\SmsSenderController::class, 'update'])->name('sms-senders.update');
Route::post('sms-senders/{smsSender}/toggle', [\App\Http\Controllers\Admin\SmsSenderController::class, 'toggle'])->name('sms-senders.toggle');
Route::delete('sms-senders/{smsSender}', [\App\Http\Controllers\Admin\SmsSenderController::class, 'destroy'])->name('sms-senders.destroy');
// SMS templates
Route::get('sms-templates', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'index'])->name('sms-templates.index');
Route::get('sms-templates/create', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'create'])->name('sms-templates.create');
Route::post('sms-templates', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'store'])->name('sms-templates.store');
Route::get('sms-templates/{smsTemplate}/edit', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'edit'])->name('sms-templates.edit');
Route::put('sms-templates/{smsTemplate}', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'update'])->name('sms-templates.update');
Route::post('sms-templates/{smsTemplate}/toggle', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'toggle'])->name('sms-templates.toggle');
Route::delete('sms-templates/{smsTemplate}', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'destroy'])->name('sms-templates.destroy');
Route::post('sms-templates/{smsTemplate}/send-test', [\App\Http\Controllers\Admin\SmsTemplateController::class, 'sendTest'])->name('sms-templates.send-test');
// SMS logs
Route::get('sms-logs', [\App\Http\Controllers\Admin\SmsLogController::class, 'index'])->name('sms-logs.index');
Route::get('sms-logs/{smsLog}', [\App\Http\Controllers\Admin\SmsLogController::class, 'show'])->name('sms-logs.show');
});
// Contract document generation (JSON) - protected by auth+verified; permission enforced inside controller service
@@ -271,6 +325,8 @@
Route::get('client-cases/{client_case:uuid}/documents/{document:uuid}/view', [ClientCaseContoller::class, 'viewDocument'])->name('clientCase.document.view');
Route::get('client-cases/{client_case:uuid}/documents/{document:uuid}/download', [ClientCaseContoller::class, 'downloadDocument'])->name('clientCase.document.download');
Route::delete('client-cases/{client_case:uuid}/documents/{document:uuid}', [ClientCaseContoller::class, 'deleteDocument'])->name('clientCase.document.delete');
// client-case / person phone - send SMS
Route::post('client-cases/{client_case:uuid}/phone/{phone_id}/sms', [ClientCaseContoller::class, 'sendSmsToPhone'])->name('clientCase.phone.sms');
// contract / documents (direct access by contract)
Route::get('contracts/{contract:uuid}/documents/{document:uuid}/view', [ClientCaseContoller::class, 'viewContractDocument'])->name('contract.document.view');
Route::get('contracts/{contract:uuid}/documents/{document:uuid}/download', [ClientCaseContoller::class, 'downloadContractDocument'])->name('contract.document.download');