Deploy: 2026-05-23 03:23:22
This commit is contained in:
86
backend/app/Controllers/BillingController.php
Normal file
86
backend/app/Controllers/BillingController.php
Normal file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controllers;
|
||||
|
||||
use App\Core\Request;
|
||||
use App\Core\Response;
|
||||
use App\Core\Database;
|
||||
|
||||
class BillingController extends BaseController
|
||||
{
|
||||
/**
|
||||
* Get all available subscription plans
|
||||
* GET /api/plans
|
||||
*/
|
||||
public function getPlans(Request $request, Response $response): void
|
||||
{
|
||||
// Don't expose the Trial plan (ID 4) as an upgrade option, only paid ones.
|
||||
$plans = Database::select("SELECT * FROM subscription_plans WHERE price > 0 ORDER BY price ASC");
|
||||
|
||||
$response->json([
|
||||
'status' => 'success',
|
||||
'data' => $plans
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Upgrade or submit payment for a plan
|
||||
* POST /api/billing/upgrade
|
||||
*/
|
||||
public function upgrade(Request $request, Response $response): void
|
||||
{
|
||||
$companyId = $request->company_id;
|
||||
$body = $request->getBody();
|
||||
|
||||
$planId = $body['plan_id'] ?? null;
|
||||
$paymentMethod = $body['payment_method'] ?? 'manual'; // 'paymob', 'cliq', 'binance', etc.
|
||||
$receiptReference = $body['receipt_reference'] ?? null;
|
||||
|
||||
if (!$planId) {
|
||||
$response->status(400)->json(['error' => 'Missing plan_id']);
|
||||
return;
|
||||
}
|
||||
|
||||
$plan = Database::selectOne("SELECT * FROM subscription_plans WHERE id = ?", [$planId]);
|
||||
if (!$plan) {
|
||||
$response->status(404)->json(['error' => 'Plan not found']);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
if ($paymentMethod === 'paymob') {
|
||||
// Here we would integrate Paymob API to generate a payment link
|
||||
// For now, we simulate returning a checkout URL.
|
||||
$checkoutUrl = "https://paymob.com/checkout/mock_url_for_plan_{$planId}_company_{$companyId}";
|
||||
|
||||
$response->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Redirect to Paymob to complete payment',
|
||||
'checkout_url' => $checkoutUrl
|
||||
]);
|
||||
} else {
|
||||
// Manual Payment (CliQ, Binance, Bank Transfer)
|
||||
if (empty($receiptReference)) {
|
||||
$response->status(400)->json(['error' => 'Please provide a receipt reference or transaction ID']);
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete any existing pending requests for this company to avoid spam
|
||||
Database::execute("DELETE FROM company_subscriptions WHERE company_id = ? AND status = 'pending_approval'", [$companyId]);
|
||||
|
||||
// Insert a pending subscription request
|
||||
Database::execute("
|
||||
INSERT INTO company_subscriptions (company_id, plan_id, status, starts_at, ends_at, payment_method, receipt_reference)
|
||||
VALUES (?, ?, 'pending_approval', NOW(), DATE_ADD(NOW(), INTERVAL 30 DAY), ?, ?)
|
||||
", [$companyId, $planId, $paymentMethod, $receiptReference]);
|
||||
|
||||
$response->json([
|
||||
'status' => 'success',
|
||||
'message' => 'Payment receipt submitted successfully. Your account will be upgraded after admin approval.'
|
||||
]);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
$response->status(500)->json(['error' => 'Failed to process upgrade request: ' . $e->getMessage()]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user