Package and individual mail sender, new report, and other changes

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Simon Pocrnjič
2026-05-11 21:32:30 +02:00
parent b6bfa17980
commit e3bc5da7e3
49 changed files with 4754 additions and 249 deletions
+34 -10
View File
@@ -139,6 +139,7 @@
// 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');
Route::get('email-logs/{emailLog}/body', [\App\Http\Controllers\Admin\EmailLogController::class, 'body'])->name('email-logs.body');
// SMS senders
Route::get('sms-senders', [\App\Http\Controllers\Admin\SmsSenderController::class, 'index'])->name('sms-senders.index');
@@ -163,17 +164,35 @@
});
// Packages (SMS batch sender) — accessible to users with manage-settings permission
// Packages — accessible to users with manage-settings permission
Route::middleware(['permission:manage-settings'])->prefix('packages')->name('packages.')->group(function () {
Route::get('/', [\App\Http\Controllers\Admin\PackageController::class, 'index'])->name('index');
Route::get('/create', [\App\Http\Controllers\Admin\PackageController::class, 'create'])->name('create');
Route::get('/{package}', [\App\Http\Controllers\Admin\PackageController::class, 'show'])->name('show');
Route::post('/', [\App\Http\Controllers\Admin\PackageController::class, 'store'])->name('store');
Route::post('/{package}/dispatch', [\App\Http\Controllers\Admin\PackageController::class, 'dispatch'])->name('dispatch');
Route::post('/{package}/cancel', [\App\Http\Controllers\Admin\PackageController::class, 'cancel'])->name('cancel');
Route::delete('/{package}', [\App\Http\Controllers\Admin\PackageController::class, 'destroy'])->name('destroy');
Route::get('/contracts/list', [\App\Http\Controllers\Admin\PackageController::class, 'contracts'])->name('contracts');
Route::post('/from-contracts', [\App\Http\Controllers\Admin\PackageController::class, 'storeFromContracts'])->name('store-from-contracts');
// Landing
Route::get('/', [\App\Http\Controllers\Admin\PackageController::class, 'landing'])->name('index');
// SMS packages
Route::prefix('sms')->name('sms.')->group(function () {
Route::get('/', [\App\Http\Controllers\Admin\PackageController::class, 'smsIndex'])->name('index');
Route::get('/create', [\App\Http\Controllers\Admin\PackageController::class, 'smsCreate'])->name('create');
Route::post('/', [\App\Http\Controllers\Admin\PackageController::class, 'store'])->name('store');
Route::get('/contracts/list', [\App\Http\Controllers\Admin\PackageController::class, 'contracts'])->name('contracts');
Route::post('/from-contracts', [\App\Http\Controllers\Admin\PackageController::class, 'storeFromContracts'])->name('store-from-contracts');
Route::get('/{package}', [\App\Http\Controllers\Admin\PackageController::class, 'smsShow'])->name('show');
Route::post('/{package}/dispatch', [\App\Http\Controllers\Admin\PackageController::class, 'dispatch'])->name('dispatch');
Route::post('/{package}/cancel', [\App\Http\Controllers\Admin\PackageController::class, 'cancel'])->name('cancel');
Route::delete('/{package}', [\App\Http\Controllers\Admin\PackageController::class, 'destroy'])->name('destroy');
});
// Email packages
Route::prefix('email')->name('email.')->group(function () {
Route::get('/', [\App\Http\Controllers\Admin\PackageController::class, 'emailIndex'])->name('index');
Route::get('/create', [\App\Http\Controllers\Admin\PackageController::class, 'emailCreate'])->name('create');
Route::get('/contracts/list', [\App\Http\Controllers\Admin\PackageController::class, 'contractsForEmail'])->name('contracts');
Route::post('/from-contracts', [\App\Http\Controllers\Admin\PackageController::class, 'storeEmailFromContracts'])->name('store-from-contracts');
Route::get('/{package}', [\App\Http\Controllers\Admin\PackageController::class, 'emailShow'])->name('show');
Route::post('/{package}/dispatch', [\App\Http\Controllers\Admin\PackageController::class, 'dispatch'])->name('dispatch');
Route::post('/{package}/cancel', [\App\Http\Controllers\Admin\PackageController::class, 'cancel'])->name('cancel');
Route::delete('/{package}', [\App\Http\Controllers\Admin\PackageController::class, 'destroy'])->name('destroy');
});
});
// Contract document generation (JSON) - protected by auth+verified; permission enforced inside controller service
@@ -374,6 +393,9 @@
});
// client-case / person phone - send SMS
Route::post('client-cases/{client_case:uuid}/phone/{phone_id}/sms', [ClientCaseContoller::class, 'sendSmsToPhone'])->name('clientCase.phone.sms');
// client-case / person email - preview & send
Route::post('client-cases/{client_case:uuid}/email/{email_id}/preview', [ClientCaseContoller::class, 'previewEmailForEmail'])->name('clientCase.email.preview');
Route::post('client-cases/{client_case:uuid}/email/{email_id}/send', [ClientCaseContoller::class, 'sendEmailToEmail'])->name('clientCase.email.send');
// client-case / contracts list for SMS dialog
Route::get('client-cases/{client_case:uuid}/contracts/list', [ClientCaseContoller::class, 'listContracts'])->name('clientCase.contracts.list');
// client-case / SMS template preview
@@ -538,6 +560,8 @@
// users/clients lookup must come before {slug} to avoid route conflicts
Route::get('reports/users', [\App\Http\Controllers\ReportController::class, 'users'])->name('reports.users');
Route::get('reports/clients', [\App\Http\Controllers\ReportController::class, 'clients'])->name('reports.clients');
Route::get('reports/actions', [\App\Http\Controllers\ReportController::class, 'actions'])->name('reports.actions');
Route::get('reports/decisions', [\App\Http\Controllers\ReportController::class, 'decisions'])->name('reports.decisions');
Route::get('reports/{slug}', [\App\Http\Controllers\ReportController::class, 'show'])->name('reports.show');
Route::get('reports/{slug}/data', [\App\Http\Controllers\ReportController::class, 'data'])->name('reports.data');
});