Reduce Transfer storage price to GHS 0.15 per GB per month.
Deploy Ladill Transfer / deploy (push) Successful in 40s

Updates config default, env examples, and removes hardcoded GHS 1.00 copy on the dashboard.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
isaacclad
2026-06-08 10:45:12 +00:00
co-authored by Cursor
parent 45ccd04163
commit e76955eaa4
12 changed files with 12 additions and 12 deletions
+1 -1
View File
@@ -37,7 +37,7 @@ BILLING_API_KEY_TRANSFER=
IDENTITY_API_URL=https://ladill.com/api IDENTITY_API_URL=https://ladill.com/api
IDENTITY_API_KEY_TRANSFER= IDENTITY_API_KEY_TRANSFER=
TRANSFER_PRICE_PER_GB_MONTH=1.00 TRANSFER_PRICE_PER_GB_MONTH=0.15
TRANSFER_MAX_FILE_BYTES=524288000 TRANSFER_MAX_FILE_BYTES=524288000
TRANSFER_MAX_FILES=20 TRANSFER_MAX_FILES=20
TRANSFER_DEFAULT_RETENTION_DAYS=30 TRANSFER_DEFAULT_RETENTION_DAYS=30
+1 -1
View File
@@ -2,7 +2,7 @@
Standalone app for **secure file sharing** at `transfer.ladill.com` — upload files, Standalone app for **secure file sharing** at `transfer.ladill.com` — upload files,
get a QR code + share link, control retention, track downloads. Storage bills at get a QR code + share link, control retention, track downloads. Storage bills at
**GHS 1.00/GB/month** from the platform UserWallet. **GHS 0.15/GB/month** from the platform UserWallet.
Public scans stay at `ladill.com/q/<code>`. The platform forwards transfer codes Public scans stay at `ladill.com/q/<code>`. The platform forwards transfer codes
to this app (`TransferQrForwarder` on the monolith). to this app (`TransferQrForwarder` on the monolith).
@@ -61,7 +61,7 @@ class AccountController extends Controller
$storageBytes = (int) $activeTransfers->sum('storage_bytes'); $storageBytes = (int) $activeTransfers->sum('storage_bytes');
$storageGb = round($storageBytes / (1024 * 1024 * 1024), 2); $storageGb = round($storageBytes / (1024 * 1024 * 1024), 2);
$pricePerGb = (float) config('transfer.price_per_gb_month', 1.0); $pricePerGb = (float) config('transfer.price_per_gb_month', 0.15);
$monthlyTotalGhs = round($activeTransfers->sum(fn (Transfer $transfer) => $transfer->monthlyCostGhs()), 2); $monthlyTotalGhs = round($activeTransfers->sum(fn (Transfer $transfer) => $transfer->monthlyCostGhs()), 2);
return view('qr.account.billing', [ return view('qr.account.billing', [
+1 -1
View File
@@ -70,7 +70,7 @@ class AfiaController extends Controller
->whereNotNull('expires_at') ->whereNotNull('expires_at')
->whereBetween('expires_at', [now(), now()->addDays(7)]) ->whereBetween('expires_at', [now(), now()->addDays(7)])
->count(), ->count(),
'storage_price_per_gb_month_ghs' => number_format((float) config('transfer.price_per_gb_month', 1.0), 2), 'storage_price_per_gb_month_ghs' => number_format((float) config('transfer.price_per_gb_month', 0.15), 2),
]; ];
if ($account->public_id) { if ($account->public_id) {
@@ -31,7 +31,7 @@ class FilesController extends Controller
'files' => $files, 'files' => $files,
'storageBytes' => (int) $storageBytes, 'storageBytes' => (int) $storageBytes,
'storageGb' => round($storageBytes / (1024 * 1024 * 1024), 2), 'storageGb' => round($storageBytes / (1024 * 1024 * 1024), 2),
'pricePerGb' => (float) config('transfer.price_per_gb_month', 1.0), 'pricePerGb' => (float) config('transfer.price_per_gb_month', 0.15),
]); ]);
} }
} }
@@ -61,7 +61,7 @@ class OverviewController extends Controller
} }
$storageGb = round($storageBytes / (1024 * 1024 * 1024), 2); $storageGb = round($storageBytes / (1024 * 1024 * 1024), 2);
$monthlyEstimateGhs = round($storageGb * (float) config('transfer.price_per_gb_month', 1.0), 2); $monthlyEstimateGhs = round($storageGb * (float) config('transfer.price_per_gb_month', 0.15), 2);
return view('transfer.dashboard', [ return view('transfer.dashboard', [
'activeCount' => $activeCount, 'activeCount' => $activeCount,
@@ -42,7 +42,7 @@ class TransferController extends Controller
return view('transfer.transfers.create', [ return view('transfer.transfers.create', [
'defaultRetentionDays' => (int) config('transfer.default_retention_days', 30), 'defaultRetentionDays' => (int) config('transfer.default_retention_days', 30),
'maxFiles' => (int) config('transfer.max_files_per_transfer', 20), 'maxFiles' => (int) config('transfer.max_files_per_transfer', 20),
'pricePerGb' => (float) config('transfer.price_per_gb_month', 1.0), 'pricePerGb' => (float) config('transfer.price_per_gb_month', 0.15),
]); ]);
} }
+1 -1
View File
@@ -79,6 +79,6 @@ class Transfer extends Model
public function monthlyCostGhs(): float public function monthlyCostGhs(): float
{ {
return round($this->storageGb() * (float) config('transfer.price_per_gb_month', 1.0), 2); return round($this->storageGb() * (float) config('transfer.price_per_gb_month', 0.15), 2);
} }
} }
+1 -1
View File
@@ -96,7 +96,7 @@ class AfiaService
private function transferSystemPrompt(string $ctx): string private function transferSystemPrompt(string $ctx): string
{ {
$pricePerGb = number_format((float) config('transfer.price_per_gb_month', 1.0), 2); $pricePerGb = number_format((float) config('transfer.price_per_gb_month', 0.15), 2);
return <<<PROMPT return <<<PROMPT
You are Afia, the assistant inside Ladill Transfer (transfer.ladill.com). You are Afia, the assistant inside Ladill Transfer (transfer.ladill.com).
+1 -1
View File
@@ -2,7 +2,7 @@
return [ return [
// GHS per GB per month of retention (see qr-suite-decomposition.md §7.3). // GHS per GB per month of retention (see qr-suite-decomposition.md §7.3).
'price_per_gb_month' => (float) env('TRANSFER_PRICE_PER_GB_MONTH', 1.0), 'price_per_gb_month' => (float) env('TRANSFER_PRICE_PER_GB_MONTH', 0.15),
// Max single-file upload size (bytes). Default 500 MB. // Max single-file upload size (bytes). Default 500 MB.
'max_file_bytes' => (int) env('TRANSFER_MAX_FILE_BYTES', 524288000), 'max_file_bytes' => (int) env('TRANSFER_MAX_FILE_BYTES', 524288000),
+1 -1
View File
@@ -37,7 +37,7 @@ BILLING_API_KEY_TRANSFER=
IDENTITY_API_URL=https://ladill.com/api IDENTITY_API_URL=https://ladill.com/api
IDENTITY_API_KEY_TRANSFER= IDENTITY_API_KEY_TRANSFER=
TRANSFER_PRICE_PER_GB_MONTH=1.00 TRANSFER_PRICE_PER_GB_MONTH=0.15
TRANSFER_MAX_FILE_BYTES=524288000 TRANSFER_MAX_FILE_BYTES=524288000
TRANSFER_MAX_FILES=20 TRANSFER_MAX_FILES=20
TRANSFER_DEFAULT_RETENTION_DAYS=30 TRANSFER_DEFAULT_RETENTION_DAYS=30
+1 -1
View File
@@ -58,7 +58,7 @@
<div class="rounded-2xl border border-indigo-100 bg-indigo-50/60 p-6"> <div class="rounded-2xl border border-indigo-100 bg-indigo-50/60 p-6">
<p class="text-xs font-medium uppercase tracking-wide text-indigo-600">Wallet balance</p> <p class="text-xs font-medium uppercase tracking-wide text-indigo-600">Wallet balance</p>
<p class="mt-1.5 text-2xl font-semibold text-slate-900">{{ $fmt($balanceMinor) }}</p> <p class="mt-1.5 text-2xl font-semibold text-slate-900">{{ $fmt($balanceMinor) }}</p>
<p class="mt-2 text-sm text-slate-600">Storage is billed at GHS 1.00 per GB per month from your Ladill wallet.</p> <p class="mt-2 text-sm text-slate-600">Storage is billed at GHS {{ number_format((float) config('transfer.price_per_gb_month', 0.15), 2) }} per GB per month from your Ladill wallet.</p>
<div class="mt-4 space-y-3"> <div class="mt-4 space-y-3">
<a href="{{ route('transfer.transfers.create') }}" class="flex items-center justify-between rounded-xl border border-white bg-white px-4 py-3 text-sm hover:bg-indigo-50/50"> <a href="{{ route('transfer.transfers.create') }}" class="flex items-center justify-between rounded-xl border border-white bg-white px-4 py-3 text-sm hover:bg-indigo-50/50">
<span class="font-medium text-slate-700">New transfer</span> <span class="font-medium text-slate-700">New transfer</span>