358 lines
28 KiB
PHP
358 lines
28 KiB
PHP
<?php
|
||
|
||
use App\Http\Controllers\AccountBookingController;
|
||
use App\Http\Controllers\AccountPaymentController;
|
||
use App\Http\Controllers\ArchiveSettingController;
|
||
use App\Http\Controllers\CaseObjectController;
|
||
use App\Http\Controllers\ClientCaseContoller;
|
||
use App\Http\Controllers\ClientController;
|
||
use App\Http\Controllers\ContractConfigController;
|
||
use App\Http\Controllers\FieldJobController;
|
||
use App\Http\Controllers\FieldJobSettingController;
|
||
use App\Http\Controllers\ImportController;
|
||
use App\Http\Controllers\ImportTemplateController;
|
||
use App\Http\Controllers\PaymentSettingController;
|
||
use App\Http\Controllers\PersonController;
|
||
use App\Http\Controllers\PhoneViewController;
|
||
use App\Http\Controllers\SegmentController;
|
||
use App\Http\Controllers\SettingController;
|
||
use App\Http\Controllers\WorkflowController;
|
||
use App\Models\Person\Person;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Facades\Route;
|
||
use Inertia\Inertia;
|
||
|
||
Route::redirect('/', 'login');
|
||
|
||
Route::middleware([
|
||
'auth:sanctum',
|
||
config('jetstream.auth_session'),
|
||
'verified',
|
||
])->group(function () {
|
||
Route::get('/dashboard', \App\Http\Controllers\DashboardController::class)->name('dashboard');
|
||
|
||
Route::get('testing', function () {
|
||
return Inertia::render('Testing/Index', [
|
||
'example' => 'Hello World',
|
||
]);
|
||
})->name('testing.index');
|
||
|
||
// Admin panel - user role management
|
||
Route::middleware(['permission:manage-settings'])->prefix('admin')->name('admin.')->group(function () {
|
||
// Admin dashboard
|
||
Route::get('/', function () {
|
||
return Inertia::render('Admin/Index');
|
||
})->name('index');
|
||
Route::get('users', [\App\Http\Controllers\Admin\UserRoleController::class, 'index'])->name('users.index');
|
||
Route::put('users/{user}', [\App\Http\Controllers\Admin\UserRoleController::class, 'update'])->name('users.update');
|
||
|
||
// Permissions management
|
||
Route::get('permissions', [\App\Http\Controllers\Admin\PermissionController::class, 'index'])->name('permissions.index');
|
||
Route::get('permissions/create', [\App\Http\Controllers\Admin\PermissionController::class, 'create'])->name('permissions.create');
|
||
Route::post('permissions', [\App\Http\Controllers\Admin\PermissionController::class, 'store'])->name('permissions.store');
|
||
|
||
// Document templates & global document settings
|
||
Route::get('document-templates', [\App\Http\Controllers\Admin\DocumentTemplateController::class, 'index'])->name('document-templates.index');
|
||
Route::post('document-templates', [\App\Http\Controllers\Admin\DocumentTemplateController::class, 'store'])->name('document-templates.store');
|
||
Route::post('document-templates/{template}/toggle', [\App\Http\Controllers\Admin\DocumentTemplateController::class, 'toggleActive'])->name('document-templates.toggle');
|
||
Route::put('document-templates/{template}/settings', [\App\Http\Controllers\Admin\DocumentTemplateController::class, 'updateSettings'])->name('document-templates.settings.update');
|
||
Route::get('document-templates/{template}', [\App\Http\Controllers\Admin\DocumentTemplateController::class, 'show'])->name('document-templates.show');
|
||
Route::get('document-templates/{template}/edit', [\App\Http\Controllers\Admin\DocumentTemplateController::class, 'edit'])->name('document-templates.edit');
|
||
Route::get('document-settings', [\App\Http\Controllers\Admin\DocumentSettingsController::class, 'edit'])->name('document-settings.index');
|
||
Route::put('document-settings', [\App\Http\Controllers\Admin\DocumentSettingsController::class, 'update'])->name('document-settings.update');
|
||
|
||
// Mail profiles (dynamic outgoing mail configuration)
|
||
Route::get('mail-profiles', [\App\Http\Controllers\Admin\MailProfileController::class, 'index'])->name('mail-profiles.index');
|
||
Route::get('mail-profiles.json', function () {
|
||
return \App\Models\MailProfile::query()->get();
|
||
})->name('mail-profiles.json');
|
||
Route::post('mail-profiles', [\App\Http\Controllers\Admin\MailProfileController::class, 'store'])->name('mail-profiles.store');
|
||
Route::put('mail-profiles/{mailProfile}', [\App\Http\Controllers\Admin\MailProfileController::class, 'update'])->name('mail-profiles.update');
|
||
Route::post('mail-profiles/{mailProfile}/toggle', [\App\Http\Controllers\Admin\MailProfileController::class, 'toggle'])->name('mail-profiles.toggle');
|
||
Route::post('mail-profiles/{mailProfile}/test', [\App\Http\Controllers\Admin\MailProfileController::class, 'test'])->name('mail-profiles.test');
|
||
Route::post('mail-profiles/{mailProfile}/send-test', [\App\Http\Controllers\Admin\MailProfileController::class, 'sendTest'])->name('mail-profiles.send-test');
|
||
Route::delete('mail-profiles/{mailProfile}', [\App\Http\Controllers\Admin\MailProfileController::class, 'destroy'])->name('mail-profiles.destroy');
|
||
|
||
// Email templates
|
||
Route::get('email-templates', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'index'])->name('email-templates.index');
|
||
Route::get('email-templates/create', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'create'])->name('email-templates.create');
|
||
Route::post('email-templates', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'store'])->name('email-templates.store');
|
||
Route::get('email-templates/{emailTemplate}/edit', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'edit'])->name('email-templates.edit');
|
||
Route::put('email-templates/{emailTemplate}', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'update'])->name('email-templates.update');
|
||
Route::delete('email-templates/{emailTemplate}', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'destroy'])->name('email-templates.destroy');
|
||
Route::post('email-templates/{emailTemplate}/preview', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'preview'])->name('email-templates.preview');
|
||
Route::post('email-templates/{emailTemplate}/send-test', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'sendTest'])->name('email-templates.send-test');
|
||
Route::post('email-templates/{emailTemplate}/render-final', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'renderFinalHtml'])->name('email-templates.render-final');
|
||
Route::post('email-templates/upload-image', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'uploadImage'])->name('email-templates.upload-image');
|
||
Route::post('email-templates/{emailTemplate}/replace-image', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'replaceImage'])->name('email-templates.replace-image');
|
||
// Cascading selects data
|
||
Route::get('email-templates-data/clients', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'clients'])->name('email-templates.data.clients');
|
||
Route::get('email-templates-data/clients/{client}/cases', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'casesForClient'])->name('email-templates.data.cases');
|
||
Route::get('email-templates-data/cases/{clientCase}/contracts', [\App\Http\Controllers\Admin\EmailTemplateController::class, 'contractsForCase'])->name('email-templates.data.contracts');
|
||
});
|
||
|
||
// Contract document generation (JSON) - protected by auth+verified; permission enforced inside controller service
|
||
Route::post('contracts/{contract:uuid}/generate-document', \App\Http\Controllers\ContractDocumentGenerationController::class)->name('contracts.generate-document');
|
||
|
||
// Phone page
|
||
Route::get('phone', [PhoneViewController::class, 'index'])->name('phone.index');
|
||
Route::get('phone/completed', [PhoneViewController::class, 'completedToday'])->name('phone.completed');
|
||
Route::get('phone/case/{client_case:uuid}', [PhoneViewController::class, 'showCase'])->name('phone.case');
|
||
Route::post('phone/case/{client_case:uuid}/complete', [\App\Http\Controllers\FieldJobController::class, 'complete'])->name('phone.case.complete');
|
||
|
||
Route::get('search', function (Request $request) {
|
||
|
||
if (! empty($request->input('query'))) {
|
||
|
||
$clients = App\Models\Person\Person::search($request->input('query'))
|
||
->query(function ($builder) use ($request): void {
|
||
$builder->join('clients', 'person.id', '=', 'clients.person_id')
|
||
->leftJoin('person_addresses', 'person.id', '=', 'person_addresses.person_id')
|
||
->leftJoin('person_phones', 'person.id', '=', 'person_phones.person_id')
|
||
->select('person.*', 'clients.uuid as client_uuid')
|
||
->limit($request->input('limit'));
|
||
})
|
||
->get();
|
||
|
||
$clientCases = App\Models\Person\Person::search($request->input('query'))
|
||
->query(function ($builder) use ($request): void {
|
||
$builder->join('client_cases', 'person.id', '=', 'client_cases.person_id')
|
||
->leftJoin('person_addresses', 'person.id', '=', 'person_addresses.person_id')
|
||
->leftJoin('person_phones', 'person.id', '=', 'person_phones.person_id')
|
||
->select('person.*', 'client_cases.uuid as case_uuid', 'client_cases.id as case_id')
|
||
->limit($request->input('limit'));
|
||
})
|
||
->get();
|
||
|
||
// Also search by contract reference and include affiliated cases ("Primeri")
|
||
$limit = (int) ($request->input('limit') ?? 8);
|
||
$query = trim((string) $request->input('query'));
|
||
if ($query !== '') {
|
||
$contractCases = \App\Models\Contract::query()
|
||
->join('client_cases', 'contracts.client_case_id', '=', 'client_cases.id')
|
||
->join('person', 'client_cases.person_id', '=', 'person.id')
|
||
->leftJoin('contract_segment', function ($j) {
|
||
$j->on('contract_segment.contract_id', '=', 'contracts.id')
|
||
->where('contract_segment.active', true);
|
||
})
|
||
->leftJoin('segments', 'segments.id', '=', 'contract_segment.segment_id')
|
||
// case-insensitive reference match
|
||
->whereRaw('LOWER(contracts.reference) LIKE ?', ['%'.mb_strtolower($query).'%'])
|
||
->select(
|
||
'person.*',
|
||
'client_cases.uuid as case_uuid',
|
||
'client_cases.id as case_id',
|
||
'contracts.reference as contract_reference',
|
||
\DB::raw("COALESCE(json_agg(DISTINCT jsonb_build_object('id', segments.id, 'name', segments.name)) FILTER (WHERE segments.id IS NOT NULL), '[]') as contract_segments")
|
||
)
|
||
->groupBy('person.id', 'client_cases.uuid', 'client_cases.id', 'contracts.reference')
|
||
->limit($limit)
|
||
->get();
|
||
|
||
// Merge and de-duplicate by case uuid
|
||
$clientCases = $clientCases
|
||
->concat($contractCases)
|
||
->unique('case_uuid')
|
||
->values();
|
||
|
||
// Collect all case ids for segment lookup (for non-contract matches)
|
||
$caseIds = $clientCases->pluck('case_id')->filter()->unique()->values();
|
||
if ($caseIds->isNotEmpty()) {
|
||
$caseSegments = \DB::table('client_cases')
|
||
->join('contracts', 'contracts.client_case_id', '=', 'client_cases.id')
|
||
->join('contract_segment', function ($j) {
|
||
$j->on('contract_segment.contract_id', '=', 'contracts.id')
|
||
->where('contract_segment.active', true);
|
||
})
|
||
->join('segments', 'segments.id', '=', 'contract_segment.segment_id')
|
||
->whereIn('client_cases.id', $caseIds)
|
||
->select(
|
||
'client_cases.id as case_id',
|
||
\DB::raw("COALESCE(json_agg(DISTINCT jsonb_build_object('id', segments.id, 'name', segments.name)) FILTER (WHERE segments.id IS NOT NULL), '[]') as segments_json")
|
||
)
|
||
->groupBy('client_cases.id')
|
||
->get()
|
||
->keyBy('case_id');
|
||
|
||
$clientCases = $clientCases->map(function ($row) use ($contractCases, $caseSegments) {
|
||
$contractHit = $contractCases->firstWhere('case_uuid', $row->case_uuid);
|
||
if ($contractHit) {
|
||
$row->contract_reference = $contractHit->contract_reference;
|
||
$segmentsJson = $contractHit->contract_segments ?? '[]';
|
||
$row->contract_segments = is_string($segmentsJson) ? json_decode($segmentsJson, true) : (array) $segmentsJson;
|
||
} else {
|
||
$segRow = $caseSegments->get($row->case_id);
|
||
if ($segRow) {
|
||
$row->case_segments = json_decode($segRow->segments_json, true) ?? [];
|
||
} else {
|
||
$row->case_segments = [];
|
||
}
|
||
}
|
||
|
||
return $row;
|
||
})->take($limit);
|
||
} else {
|
||
$clientCases = $clientCases->take($limit);
|
||
}
|
||
}
|
||
|
||
return [
|
||
'clients' => $clients,
|
||
'client_cases' => $clientCases,
|
||
'query' => $request->input('query'),
|
||
];
|
||
|
||
}
|
||
|
||
return [];
|
||
})->name('search');
|
||
|
||
// person
|
||
Route::put('person/{person:uuid}', [PersonController::class, 'update'])->name('person.update');
|
||
Route::post('person/{person:uuid}/address', [PersonController::class, 'createAddress'])->name('person.address.create');
|
||
Route::put('person/{person:uuid}/address/{address_id}', [PersonController::class, 'updateAddress'])->name('person.address.update');
|
||
Route::delete('person/{person:uuid}/address/{address_id}', [PersonController::class, 'deleteAddress'])->name('person.address.delete');
|
||
Route::post('person/{person:uuid}/phone', [PersonController::class, 'createPhone'])->name('person.phone.create');
|
||
Route::put('person/{person:uuid}/phone/{phone_id}', [PersonController::class, 'updatePhone'])->name('person.phone.update');
|
||
Route::delete('person/{person:uuid}/phone/{phone_id}', [PersonController::class, 'deletePhone'])->name('person.phone.delete');
|
||
Route::post('person/{person:uuid}/email', [PersonController::class, 'createEmail'])->name('person.email.create');
|
||
Route::put('person/{person:uuid}/email/{email_id}', [PersonController::class, 'updateEmail'])->name('person.email.update');
|
||
Route::delete('person/{person:uuid}/email/{email_id}', [PersonController::class, 'deleteEmail'])->name('person.email.delete');
|
||
// TRR (Bank account) endpoints
|
||
Route::post('person/{person:uuid}/trr', [PersonController::class, 'createTrr'])->name('person.trr.create');
|
||
Route::put('person/{person:uuid}/trr/{trr_id}', [PersonController::class, 'updateTrr'])->name('person.trr.update');
|
||
Route::delete('person/{person:uuid}/trr/{trr_id}', [PersonController::class, 'deleteTrr'])->name('person.trr.delete');
|
||
// client
|
||
Route::get('clients', [ClientController::class, 'index'])->name('client');
|
||
Route::get('clients/{client:uuid}', [ClientController::class, 'show'])->name('client.show');
|
||
Route::get('clients/{client:uuid}/contracts', [ClientController::class, 'contracts'])->name('client.contracts');
|
||
Route::post('clients', [ClientController::class, 'store'])->name('client.store');
|
||
Route::put('clients/{client:uuid}', [ClientController::class, 'update'])->name('client.update');
|
||
Route::post('clients/{client:uuid}/emergency-person', [ClientController::class, 'emergencyCreatePerson'])->name('client.emergencyPerson');
|
||
|
||
// client-case
|
||
Route::get('client-cases', [ClientCaseContoller::class, 'index'])->name('clientCase');
|
||
Route::get('client-cases/{client_case:uuid}', [ClientCaseContoller::class, 'show'])->name('clientCase.show');
|
||
Route::post('client-cases/{client_case:uuid}/contracts/{uuid}/segment', [ClientCaseContoller::class, 'updateContractSegment'])->name('clientCase.contract.updateSegment');
|
||
Route::post('client-cases/{client_case:uuid}/contracts/{uuid}/archive', [ClientCaseContoller::class, 'archiveContract'])->name('clientCase.contract.archive');
|
||
Route::post('client-cases', [ClientCaseContoller::class, 'store'])->name('clientCase.store');
|
||
Route::post('client-cases/{client_case:uuid}/emergency-person', [ClientCaseContoller::class, 'emergencyCreatePerson'])->name('clientCase.emergencyPerson');
|
||
// client-case / contract
|
||
Route::post('client-cases/{client_case:uuid}/contract', [ClientCaseContoller::class, 'storeContract'])->name('clientCase.contract.store');
|
||
Route::put('client-cases/{client_case:uuid}/contract/{uuid}', [ClientCaseContoller::class, 'updateContract'])->name('clientCase.contract.update');
|
||
Route::get('client-cases/{client_case:uuid}/contract/{uuid}/debug-accounts', [ClientCaseContoller::class, 'debugContractAccounts'])->name('clientCase.contract.debugAccounts');
|
||
Route::delete('client-cases/{client_case:uuid}/contract/{uuid}', [ClientCaseContoller::class, 'deleteContract'])->name('clientCase.contract.delete');
|
||
// client-case / contract / objects
|
||
Route::post('client-cases/{client_case:uuid}/contract/{uuid}/objects', [CaseObjectController::class, 'store'])->name('clientCase.contract.object.store');
|
||
Route::put('client-cases/{client_case:uuid}/objects/{id}', [CaseObjectController::class, 'update'])->name('clientCase.object.update');
|
||
Route::delete('client-cases/{client_case:uuid}/objects/{id}', [CaseObjectController::class, 'destroy'])->name('clientCase.object.delete');
|
||
// client-case / activity
|
||
Route::post('client-cases/{client_case:uuid}/activity', [ClientCaseContoller::class, 'storeActivity'])->name('clientCase.activity.store');
|
||
Route::delete('client-cases/{client_case:uuid}/activity/{activity}', [ClientCaseContoller::class, 'deleteActivity'])->name('clientCase.activity.delete');
|
||
// client-case / segments
|
||
Route::post('client-cases/{client_case:uuid}/segments', [ClientCaseContoller::class, 'attachSegment'])->name('clientCase.segments.attach');
|
||
// client-case / documents
|
||
Route::post('client-cases/{client_case:uuid}/documents', [ClientCaseContoller::class, 'storeDocument'])->name('clientCase.document.store');
|
||
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');
|
||
// 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');
|
||
Route::delete('contracts/{contract:uuid}/documents/{document:uuid}', [ClientCaseContoller::class, 'deleteContractDocument'])->name('contract.document.delete');
|
||
// settings
|
||
Route::get('settings', [SettingController::class, 'index'])->name('settings');
|
||
Route::get('settings/segments', [SegmentController::class, 'settings'])->name('settings.segments');
|
||
Route::post('settings/segments', [SegmentController::class, 'store'])->name('settings.segments.store');
|
||
Route::put('settings/segments/{segment}', [SegmentController::class, 'update'])->name('settings.segments.update');
|
||
// settings / archive settings
|
||
Route::get('settings/archive', [ArchiveSettingController::class, 'index'])->name('settings.archive.index');
|
||
Route::post('settings/archive', [ArchiveSettingController::class, 'store'])->name('settings.archive.store');
|
||
Route::put('settings/archive/{archiveSetting}', [ArchiveSettingController::class, 'update'])->name('settings.archive.update');
|
||
Route::post('settings/archive/{archiveSetting}/run', [ArchiveSettingController::class, 'run'])->name('settings.archive.run');
|
||
Route::delete('settings/archive/{archiveSetting}', [ArchiveSettingController::class, 'destroy'])->name('settings.archive.destroy');
|
||
Route::get('settings/workflow', [WorkflowController::class, 'index'])->name('settings.workflow');
|
||
Route::get('settings/field-job', [FieldJobSettingController::class, 'index'])->name('settings.fieldjob.index');
|
||
|
||
// field jobs assignment
|
||
Route::get('field-jobs', [FieldJobController::class, 'index'])->name('fieldjobs.index');
|
||
Route::post('field-jobs/assign', [FieldJobController::class, 'assign'])->name('fieldjobs.assign');
|
||
Route::post('field-jobs/cancel', [FieldJobController::class, 'cancel'])->name('fieldjobs.cancel');
|
||
Route::post('settings/field-job', [FieldJobSettingController::class, 'store'])->name('settings.fieldjob.store');
|
||
Route::put('settings/field-job/{setting}', [FieldJobSettingController::class, 'update'])->name('settings.fieldjob.update');
|
||
// settings / contract-configs
|
||
Route::get('settings/contract-configs', [ContractConfigController::class, 'index'])->name('settings.contractConfigs.index');
|
||
Route::post('settings/contract-configs', [ContractConfigController::class, 'store'])->name('settings.contractConfigs.store');
|
||
Route::put('settings/contract-configs/{config}', [ContractConfigController::class, 'update'])->name('settings.contractConfigs.update');
|
||
Route::delete('settings/contract-configs/{config}', [ContractConfigController::class, 'destroy'])->name('settings.contractConfigs.destroy');
|
||
Route::post('settings/actions', [WorkflowController::class, 'storeAction'])->name('settings.actions.store');
|
||
Route::put('settings/actions/{id}', [WorkflowController::class, 'updateAction'])->name('settings.actions.update');
|
||
Route::post('settings/decisions', [WorkflowController::class, 'storeDecision'])->name('settings.decisions.store');
|
||
Route::put('settings/decisions/{id}', [WorkflowController::class, 'updateDecision'])->name('settings.decisions.update');
|
||
Route::delete('settings/actions/{id}', [WorkflowController::class, 'destroyAction'])->name('settings.actions.destroy');
|
||
Route::delete('settings/decisions/{id}', [WorkflowController::class, 'destroyDecision'])->name('settings.decisions.destroy');
|
||
|
||
// segments index overview
|
||
Route::get('segments', [SegmentController::class, 'index'])->name('segments.index');
|
||
Route::get('segments/{segment}', [SegmentController::class, 'show'])->name('segments.show');
|
||
|
||
// imports
|
||
Route::get('imports/create', [ImportController::class, 'create'])->name('imports.create');
|
||
Route::get('imports', [ImportController::class, 'index'])->name('imports.index');
|
||
Route::get('imports/import/{import:uuid}', [ImportController::class, 'show'])->name('imports.continue');
|
||
Route::post('imports', [ImportController::class, 'store'])->name('imports.store');
|
||
Route::get('imports/{import}/columns', [ImportController::class, 'columns'])->name('imports.columns');
|
||
Route::post('imports/{import}/process', [ImportController::class, 'process'])->name('imports.process');
|
||
Route::post('imports/{import}/mappings', [ImportController::class, 'saveMappings'])->name('imports.mappings.save');
|
||
Route::get('imports/{import}/mappings', [ImportController::class, 'getMappings'])->name('imports.mappings.get');
|
||
Route::get('imports/{import}/events', [ImportController::class, 'getEvents'])->name('imports.events');
|
||
Route::get('imports/{import}/preview', [ImportController::class, 'preview'])->name('imports.preview');
|
||
// Generic simulation endpoint (new) – provides projected effects for first N rows regardless of payments template
|
||
Route::get('imports/{import}/simulate', [ImportController::class, 'simulate'])->name('imports.simulate');
|
||
// Backwards compatible payments simulation route (legacy name) – now proxies to generic simulate method
|
||
Route::get('imports/{import}/simulate-payments', [ImportController::class, 'simulatePayments'])->name('imports.simulatePayments');
|
||
|
||
// import templates
|
||
Route::get('import-templates', [ImportTemplateController::class, 'index'])->name('importTemplates.index');
|
||
Route::get('imports/templates/create', [ImportTemplateController::class, 'create'])->name('importTemplates.create');
|
||
Route::post('import-templates', [ImportTemplateController::class, 'store'])->name('importTemplates.store');
|
||
Route::get('imports/templates/edit/{template:uuid}', [ImportTemplateController::class, 'edit'])->name('importTemplates.edit');
|
||
Route::put('import-templates/{template:uuid}', [ImportTemplateController::class, 'update'])->name('importTemplates.update');
|
||
Route::delete('import-templates/{template:uuid}', [ImportTemplateController::class, 'destroy'])->name('importTemplates.destroy');
|
||
Route::post('import-templates/{template:uuid}/mappings', [ImportTemplateController::class, 'addMapping'])->name('importTemplates.mappings.add');
|
||
Route::post('import-templates/{template:uuid}/mappings/bulk', [ImportTemplateController::class, 'bulkAddMappings'])->name('importTemplates.mappings.bulk');
|
||
Route::put('import-templates/{template:uuid}/mappings/{mapping}', [ImportTemplateController::class, 'updateMapping'])->name('importTemplates.mappings.update');
|
||
Route::delete('import-templates/{template:uuid}/mappings/{mapping}', [ImportTemplateController::class, 'deleteMapping'])->name('importTemplates.mappings.delete');
|
||
Route::post('import-templates/{template:uuid}/mappings/reorder', [ImportTemplateController::class, 'reorderMappings'])->name('importTemplates.mappings.reorder');
|
||
Route::post('import-templates/{template}/apply/{import}', [ImportTemplateController::class, 'applyToImport'])->name('importTemplates.apply');
|
||
// Delete an unfinished import
|
||
Route::delete('imports/{import}', [ImportController::class, 'destroy'])->name('imports.destroy');
|
||
// Route::put()
|
||
// types
|
||
|
||
// accounts / payments & bookings
|
||
Route::prefix('accounts/{account}')->name('accounts.')->group(function (): void {
|
||
Route::get('payments', [AccountPaymentController::class, 'index'])->name('payments.index');
|
||
Route::get('payments/list', [AccountPaymentController::class, 'list'])->name('payments.list');
|
||
Route::post('payments', [AccountPaymentController::class, 'store'])->name('payments.store');
|
||
Route::delete('payments/{payment}', [AccountPaymentController::class, 'destroy'])->name('payments.destroy');
|
||
|
||
Route::get('bookings', [AccountBookingController::class, 'index'])->name('bookings.index');
|
||
Route::post('bookings', [AccountBookingController::class, 'store'])->name('bookings.store');
|
||
Route::delete('bookings/{booking}', [AccountBookingController::class, 'destroy'])->name('bookings.destroy');
|
||
});
|
||
|
||
// settings - payment settings
|
||
Route::get('settings/payment', [PaymentSettingController::class, 'edit'])->name('settings.payment.edit');
|
||
Route::put('settings/payment', [PaymentSettingController::class, 'update'])->name('settings.payment.update');
|
||
|
||
Route::get('types/address', function (Request $request) {
|
||
$types = App\Models\Person\AddressType::all();
|
||
|
||
return response()->json([
|
||
'types' => $types,
|
||
]);
|
||
})->name('types.address');
|
||
|
||
});
|