Add specialty module and GP service pricing settings.
Deploy Ladill Care / deploy (push) Successful in 51s

Admin dashboard module cards open per-module settings with editable service prices; GP consultation and clinic fees live under Settings → GP pricing (inventory drugs unchanged).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-07-18 17:19:18 +00:00
co-authored by Cursor
parent ce782382c5
commit 5a1d47b9cc
13 changed files with 631 additions and 19 deletions
@@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\Care;
use App\Http\Controllers\Care\Concerns\ScopesToAccount;
use App\Http\Controllers\Controller;
use App\Services\Care\CarePermissions;
use App\Services\Care\CarePricingService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class SettingsGpPricingController extends Controller
{
use ScopesToAccount;
public function edit(Request $request, CarePricingService $pricing): View
{
$this->authorizeAbility($request, 'settings.view');
$organization = $this->organization($request);
$canManage = app(CarePermissions::class)->can($this->member($request), 'settings.manage');
return view('care.settings.gp-pricing', [
'organization' => $organization,
'services' => $pricing->gpServices($organization),
'canManage' => $canManage,
'currency' => strtoupper((string) config('care.billing.currency', 'GHS')),
]);
}
public function update(Request $request, CarePricingService $pricing): RedirectResponse
{
$this->authorizeAbility($request, 'settings.manage');
$organization = $this->organization($request);
$validated = $request->validate([
'services' => ['required', 'array'],
'services.*.code' => ['required', 'string', 'max:64'],
'services.*.amount' => ['required', 'numeric', 'min:0', 'max:999999'],
]);
$pricing->updateGpServices($organization, $validated['services']);
return redirect()
->route('care.settings.gp-pricing')
->with('success', 'GP service prices saved.');
}
}
@@ -2,10 +2,13 @@
namespace App\Http\Controllers\Care;
use App\Http\Controllers\Controller;
use App\Http\Controllers\Care\Concerns\ScopesToAccount;
use App\Http\Controllers\Controller;
use App\Services\Care\CarePermissions;
use App\Services\Care\CarePricingService;
use App\Services\Care\PlanService;
use App\Services\Care\SpecialtyModuleService;
use App\Services\Care\SpecialtyShellService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
@@ -19,7 +22,7 @@ class SettingsModulesController extends Controller
$this->authorizeAbility($request, 'settings.view');
$organization = $this->organization($request);
$member = $this->member($request);
$canManage = app(\App\Services\Care\CarePermissions::class)->can($member, 'settings.manage');
$canManage = app(CarePermissions::class)->can($member, 'settings.manage');
if ($modules->canManage($organization)) {
$modules->ensureDefaultModulesProvisioned($organization, $this->ownerRef($request));
@@ -36,6 +39,71 @@ class SettingsModulesController extends Controller
]);
}
public function show(
Request $request,
string $module,
SpecialtyModuleService $modules,
SpecialtyShellService $shell,
CarePricingService $pricing,
): View {
$this->authorizeAbility($request, 'settings.view');
$definition = $modules->definition($module);
abort_unless($definition, 404);
$organization = $this->organization($request);
$member = $this->member($request);
$canManage = app(CarePermissions::class)->can($member, 'settings.manage');
$canUse = $modules->canManage($organization);
if ($canUse && $modules->isEnabled($organization, $module)) {
$shell->seedServices($organization, $module);
$organization->refresh();
}
$services = $canUse
? $shell->provisionedServices($organization, $module)
: $shell->catalogServices($module);
return view('care.settings.module-show', [
'organization' => $organization,
'moduleKey' => $module,
'definition' => $definition,
'services' => $services,
'enabled' => $modules->isEnabled($organization, $module),
'canManage' => $canManage && $canUse,
'canUseSpecialtyModules' => $canUse,
'canOpenWorkspace' => $modules->memberCanAccess($organization, $member, $module),
'currency' => strtoupper((string) config('care.billing.currency', 'GHS')),
]);
}
public function updateServices(
Request $request,
string $module,
SpecialtyModuleService $modules,
SpecialtyShellService $shell,
CarePricingService $pricing,
): RedirectResponse {
$this->authorizeAbility($request, 'settings.manage');
$organization = $this->organization($request);
abort_unless($modules->definition($module), 404);
abort_unless($modules->canManage($organization), 403);
$validated = $request->validate([
'services' => ['required', 'array'],
'services.*.code' => ['required', 'string', 'max:64'],
'services.*.amount' => ['required', 'numeric', 'min:0', 'max:999999'],
'services.*.label' => ['nullable', 'string', 'max:255'],
]);
$shell->seedServices($organization, $module);
$pricing->updateSpecialtyServices($organization->fresh(), $module, $validated['services'], $shell);
return redirect()
->route('care.settings.modules.show', $module)
->with('success', 'Service prices saved.');
}
public function update(Request $request, SpecialtyModuleService $modules): RedirectResponse
{
$this->authorizeAbility($request, 'settings.manage');