Reduce Transfer storage price to GHS 0.15 per GB per month.
Deploy Ladill Transfer / deploy (push) Successful in 40s
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:
+1
-1
@@ -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
|
||||||
|
|||||||
@@ -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', [
|
||||||
|
|||||||
@@ -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),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user