Deploy Ladill Care / deploy (push) Successful in 1m24s
Match Frontdesk by linking branches and team from settings instead of the admin sidebar, and simplify Care plan upgrade button copy.
131 lines
5.6 KiB
PHP
131 lines
5.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Care;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Controllers\Care\Concerns\ScopesToAccount;
|
|
use App\Models\Branch;
|
|
use App\Services\Care\AppointmentPatientNotifier;
|
|
use App\Services\Care\AuditLogger;
|
|
use App\Services\Care\CarePermissions;
|
|
use App\Services\Care\PlanService;
|
|
use App\Services\Messaging\MessagingCredentialsService;
|
|
use App\Services\Queue\QueueClient;
|
|
use App\Support\OrganizationBranding;
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\View\View;
|
|
|
|
class SettingsController extends Controller
|
|
{
|
|
use ScopesToAccount;
|
|
|
|
public function edit(Request $request, MessagingCredentialsService $credentials): View
|
|
{
|
|
$this->authorizeAbility($request, 'settings.view');
|
|
$organization = $this->organization($request);
|
|
$member = $this->member($request);
|
|
$permissions = app(CarePermissions::class);
|
|
$canManage = $permissions->can($member, 'settings.manage');
|
|
$credential = $credentials->forOrganization($organization);
|
|
|
|
$branchCount = Branch::owned($this->ownerRef($request))
|
|
->where('organization_id', $organization->id)
|
|
->count();
|
|
|
|
$plans = app(PlanService::class);
|
|
$hasPaidPlan = $plans->hasPaidPlan($organization);
|
|
|
|
return view('care.settings.edit', [
|
|
'organization' => $organization,
|
|
'canManage' => $canManage,
|
|
'branchCount' => $branchCount,
|
|
'canViewBranches' => $permissions->can($member, 'admin.branches.view'),
|
|
'canViewTeam' => $permissions->can($member, 'admin.members.view'),
|
|
'hasPaidPlan' => $hasPaidPlan,
|
|
'canUseQueueIntegration' => $plans->canUseQueueIntegration($organization),
|
|
'messagingSmsReady' => $credential->hasValidSms(),
|
|
'messagingEmailReady' => $credential->hasValidBird(),
|
|
'facilityTypes' => [
|
|
'clinic' => 'Clinic',
|
|
'hospital' => 'Hospital',
|
|
'diagnostic' => 'Diagnostic laboratory',
|
|
'specialist' => 'Specialist practice',
|
|
],
|
|
]);
|
|
}
|
|
|
|
public function update(Request $request, QueueClient $queue): RedirectResponse
|
|
{
|
|
$this->authorizeAbility($request, 'settings.manage');
|
|
$organization = $this->organization($request);
|
|
$owner = $this->ownerRef($request);
|
|
$plans = app(PlanService::class);
|
|
|
|
$validated = $request->validate([
|
|
'name' => ['required', 'string', 'max:255'],
|
|
'timezone' => ['required', 'timezone'],
|
|
'facility_type' => ['required', 'string', 'in:clinic,hospital,diagnostic,specialist'],
|
|
'logo' => ['nullable', 'image', 'mimes:jpeg,png,jpg,webp,svg', 'max:2048'],
|
|
'remove_logo' => ['nullable', 'boolean'],
|
|
'queue_integration_enabled' => ['nullable', 'boolean'],
|
|
'notify_appointment_booked_sms' => ['nullable', 'boolean'],
|
|
'notify_appointment_booked_email' => ['nullable', 'boolean'],
|
|
'notify_video_scheduled_sms' => ['nullable', 'boolean'],
|
|
'notify_video_scheduled_email' => ['nullable', 'boolean'],
|
|
]);
|
|
|
|
$settings = $organization->settings ?? [];
|
|
$settings['onboarded'] = true;
|
|
$settings['facility_type'] = $validated['facility_type'];
|
|
|
|
// Queue integration is Pro/Enterprise only — free plans cannot enable it.
|
|
$wantsQueue = $request->boolean('queue_integration_enabled');
|
|
if ($wantsQueue && ! $plans->canUseQueueIntegration($organization)) {
|
|
return redirect()
|
|
->route('care.pro.index')
|
|
->with('upsell', 'Ladill Queue integration is part of Care Pro. Upgrade to connect service queues and counters.');
|
|
}
|
|
if (! $plans->canUseQueueIntegration($organization)) {
|
|
$wantsQueue = false;
|
|
}
|
|
$settings['queue_integration_enabled'] = $wantsQueue;
|
|
|
|
$settings[AppointmentPatientNotifier::SETTING_BOOKED_SMS] = $request->boolean('notify_appointment_booked_sms');
|
|
$settings[AppointmentPatientNotifier::SETTING_BOOKED_EMAIL] = $request->boolean('notify_appointment_booked_email');
|
|
$settings[AppointmentPatientNotifier::SETTING_VIDEO_SMS] = $request->boolean('notify_video_scheduled_sms');
|
|
$settings[AppointmentPatientNotifier::SETTING_VIDEO_EMAIL] = $request->boolean('notify_video_scheduled_email');
|
|
|
|
if ($wantsQueue && $queue->configured()) {
|
|
$branch = Branch::owned($owner)->where('organization_id', $organization->id)->orderBy('name')->first();
|
|
try {
|
|
$queue->enable($owner, $organization->name, $branch?->name);
|
|
} catch (\Throwable) {
|
|
return back()->withInput()->with('error', 'Could not provision Ladill Queue for this account. Ensure Queue API keys are configured and Queue allows Care integration.');
|
|
}
|
|
}
|
|
|
|
$logoPath = $organization->logo_path;
|
|
|
|
if ($request->boolean('remove_logo')) {
|
|
OrganizationBranding::deleteStoredLogo($organization);
|
|
$logoPath = null;
|
|
}
|
|
|
|
if ($request->hasFile('logo')) {
|
|
$logoPath = OrganizationBranding::storeLogo($organization, $request->file('logo'));
|
|
}
|
|
|
|
$organization->update([
|
|
'name' => $validated['name'],
|
|
'timezone' => $validated['timezone'],
|
|
'logo_path' => $logoPath,
|
|
'settings' => $settings,
|
|
]);
|
|
|
|
AuditLogger::record($owner, 'organization.updated', $organization->id, $owner, \App\Models\Organization::class, $organization->id);
|
|
|
|
return back()->with('success', 'Settings saved.');
|
|
}
|
|
}
|