Add contract management and invoice settings pages

- Created a new Blade view for managing brand contracts with forms for adding and editing contracts, including client and category selection.
- Implemented success message notifications for contract actions.
- Added a new Blade view for invoice settings, allowing customization of invoice number format, header branding, and default values for new invoices.
- Introduced a new PDF view for generating rate cards with customizable styles based on user profile settings.
- Developed a profile management page for rate cards, enabling users to update their identity, appearance, and visibility settings.
This commit is contained in:
I-Fun
2026-04-01 21:47:34 +07:00
parent d3c35ad730
commit 22f03ccca7
48 changed files with 2415 additions and 296 deletions

View File

@@ -2,12 +2,14 @@
declare(strict_types=1);
use App\Http\Controllers\BrandContractController;
use App\Http\Controllers\ClientCategoryController;
use App\Http\Controllers\ClientController;
use App\Http\Controllers\ContentBriefController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\EventController;
use App\Http\Controllers\InvoiceController;
use App\Http\Controllers\InvoiceSettingsController;
use App\Http\Controllers\MediaFileController;
use App\Http\Controllers\NotificationSettingController;
use App\Http\Controllers\RateCardController;
@@ -28,6 +30,16 @@ Route::prefix('client-categories')->name('client-categories.')->group(function (
Route::delete('/{category}', [ClientCategoryController::class, 'destroy'])->name('destroy');
});
// Brand Contracts
Route::prefix('contracts')->name('contracts.')->group(function (): void {
Route::get('/', [BrandContractController::class, 'index'])->name('index');
Route::post('/', [BrandContractController::class, 'store'])->name('store');
Route::put('/{contract}', [BrandContractController::class, 'update'])->name('update');
Route::delete('/{contract}', [BrandContractController::class, 'destroy'])->name('destroy');
Route::patch('/{contract}/toggle', [BrandContractController::class, 'toggle'])->name('toggle');
Route::get('/check', [BrandContractController::class, 'check'])->name('check');
});
// Schedule & Calendar
Route::prefix('schedule')->name('schedule.')->group(function (): void {
Route::get('/', [EventController::class, 'index'])->name('index');
@@ -48,9 +60,15 @@ Route::prefix('social-hub')->name('social-hub.')->group(function (): void {
// Financial – Invoices
Route::resource('invoices', InvoiceController::class);
Route::get('/invoices/{invoice}/pdf', [InvoiceController::class, 'pdf'])->name('invoices.pdf');
Route::get('/invoice-settings', [InvoiceSettingsController::class, 'edit'])->name('invoice-settings.edit');
Route::post('/invoice-settings', [InvoiceSettingsController::class, 'update'])->name('invoice-settings.update');
// Financial – Rate Cards
Route::get('/rate-cards/public', [RateCardController::class, 'public'])->name('rate-cards.public');
Route::get('/rate-cards/pdf', [RateCardController::class, 'pdf'])->name('rate-cards.pdf');
Route::get('/rate-cards/profile', [RateCardController::class, 'profilePage'])->name('rate-cards.profile');
Route::post('/rate-cards/profile', [RateCardController::class, 'profileUpdate'])->name('rate-cards.profile.update');
Route::get('/files/profile-logo', [RateCardController::class, 'serveProfileLogo'])->name('files.serve-profile-logo');
Route::resource('rate-cards', RateCardController::class)->except(['show']);
// Content Strategy – Kanban