Add Care Pro billing, renewal, and scheduler.
Deploy Ladill Care / deploy (push) Successful in 35s

Organizations can subscribe from wallet, expire correctly on free tier, and renew nightly via care:pro-renew.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-30 01:07:23 +00:00
co-authored by Cursor
parent cd415e918f
commit 4bc485dfea
10 changed files with 403 additions and 4 deletions
+54
View File
@@ -0,0 +1,54 @@
<x-app-layout title="Pro" heading="Care Pro">
@php
$price = number_format($priceMinor / 100, 2);
@endphp
<div class="mx-auto max-w-2xl">
<div class="overflow-hidden rounded-2xl border border-slate-200 bg-white">
<div class="bg-gradient-to-r from-indigo-700 via-teal-600 to-cyan-500 px-6 py-7 text-white">
<div class="flex items-center gap-2">
<span class="rounded-md bg-white/20 px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide">Pro</span>
@if ($isPro)
<span class="rounded-md bg-emerald-400/90 px-2 py-0.5 text-[11px] font-semibold text-emerald-950">Active</span>
@endif
</div>
<h1 class="mt-3 text-2xl font-bold">Ladill Care Pro</h1>
<p class="mt-1 text-sm text-white/80">Unlimited branches and the full hospital management toolkit.</p>
<p class="mt-4 text-3xl font-bold">{{ $currency }} {{ $price }}<span class="text-base font-medium text-white/70"> / month</span></p>
</div>
<div class="px-6 py-6">
<ul class="grid gap-3 sm:grid-cols-2">
@foreach ($proFeatures as $feature)
<li class="flex items-start gap-2 text-sm text-slate-700">
<svg class="mt-0.5 h-4 w-4 shrink-0 text-emerald-500" fill="none" viewBox="0 0 24 24" stroke-width="2.5" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5"/></svg>
<span>{{ $feature }}</span>
</li>
@endforeach
</ul>
<div class="mt-6 border-t border-slate-100 pt-6">
@if ($isPro)
<div class="text-sm text-slate-600">
@if ($planExpiresAt)
Pro is active until <strong>{{ $planExpiresAt->format('d M Y') }}</strong>.
@else
Your organization is on Care Pro.
@endif
</div>
@elseif ($canManage)
<form method="post" action="{{ route('care.pro.subscribe') }}">
@csrf
<button class="btn-primary w-full sm:w-auto">
Upgrade to Pro {{ $currency }} {{ $price }}/mo from wallet
</button>
</form>
<p class="mt-3 text-xs text-slate-400">Billed monthly from your Ladill wallet.</p>
@else
<p class="rounded-xl bg-slate-50 px-4 py-3 text-sm text-slate-500">Ask an organization administrator to upgrade this workspace to Pro.</p>
@endif
</div>
</div>
</div>
</div>
</x-app-layout>
+14 -1
View File
@@ -78,7 +78,7 @@
'icon' => '<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 0 0-3.375-3.375h-1.5A1.125 1.125 0 0 1 13.5 7.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H8.25m0 12.75h7.5m-7.5 3H12M10.5 2.25H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 0 0-9-9Z" />'];
}
$settingsActive = request()->routeIs('care.settings*');
$settingsActive = request()->routeIs('care.settings*') && ! request()->routeIs('care.pro.*');
@endphp
<nav class="flex-1 space-y-0.5 overflow-y-auto px-3 py-4">
@@ -110,5 +110,18 @@
<span>Settings</span>
</a>
@endif
@php $proActive = request()->routeIs('care.pro.*'); @endphp
@if (! empty($isPro))
<a href="{{ route('care.pro.index') }}" class="group mt-0.5 flex items-center gap-3 rounded-lg px-3 py-2 text-[13px] transition {{ $proActive ? 'bg-indigo-50 text-indigo-700 font-semibold' : 'text-slate-600 hover:bg-slate-50 hover:text-slate-900' }}">
<svg class="h-[18px] w-[18px] shrink-0 text-amber-500" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.25c.3 0 .58.18.7.46l2.36 5.5 5.96.5a.75.75 0 0 1 .43 1.31l-4.53 3.9 1.36 5.83a.75.75 0 0 1-1.12.81L12 17.77l-5.16 3a.75.75 0 0 1-1.12-.81l1.36-5.83-4.53-3.9a.75.75 0 0 1 .43-1.31l5.96-.5 2.36-5.5c.12-.28.4-.46.7-.46Z"/></svg>
<span>Care Pro</span>
</a>
@else
<a href="{{ route('care.pro.index') }}" class="group mt-0.5 flex items-center gap-3 rounded-lg bg-gradient-to-r from-indigo-600 to-emerald-500 px-3 py-2 text-[13px] font-semibold text-white shadow-sm transition hover:opacity-95">
<svg class="h-[18px] w-[18px] shrink-0" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2.25c.3 0 .58.18.7.46l2.36 5.5 5.96.5a.75.75 0 0 1 .43 1.31l-4.53 3.9 1.36 5.83a.75.75 0 0 1-1.12.81L12 17.77l-5.16 3a.75.75 0 0 1-1.12-.81l1.36-5.83-4.53-3.9a.75.75 0 0 1 .43-1.31l5.96-.5 2.36-5.5c.12-.28.4-.46.7-.46Z"/></svg>
<span>Upgrade to Pro</span>
</a>
@endif
</div>
</div>