Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F15414126
D4812.id13788.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D4812.id13788.diff
View Options
diff --git a/src/app/Observers/UserObserver.php b/src/app/Observers/UserObserver.php
--- a/src/app/Observers/UserObserver.php
+++ b/src/app/Observers/UserObserver.php
@@ -116,18 +116,6 @@
if (\App\Tenant::getConfig($user->tenant_id, 'pgp.enable')) {
\App\Jobs\PGP\KeyDeleteJob::dispatch($user->id, $user->email);
}
-
- // Debit the reseller's wallet with the user negative balance
- $balance = 0;
- foreach ($user->wallets as $wallet) {
- // Note: here we assume all user wallets are using the same currency.
- // It might get changed in the future
- $balance += $wallet->balance;
- }
-
- if ($balance < 0 && $user->tenant && ($wallet = $user->tenant->wallet())) {
- $wallet->debit($balance * -1, "Deleted user {$user->email}");
- }
}
}
diff --git a/src/app/Wallet.php b/src/app/Wallet.php
--- a/src/app/Wallet.php
+++ b/src/app/Wallet.php
@@ -92,6 +92,7 @@
$transactions = [];
$profit = 0;
$charges = 0;
+ $fees = 0;
$isDegraded = $this->owner->isDegraded();
$trial = $this->trialInfo();
@@ -119,15 +120,14 @@
// Calculate cost, fee, and end of period
[$cost, $fee, $endDate] = $this->entitlementCosts($entitlement, $trial);
- // Note: Degraded pays nothing, but we get the money from a tenant.
- // Therefore $cost = 0, but $profit < 0.
+ // No balance changes for degraded users
if ($isDegraded) {
$cost = 0;
+ } else {
+ $charges += $cost;
+ $fees += $fee;
}
- $charges += $cost;
- $profit += $cost - $fee;
-
// if we're in dry-run, you know...
if (!$apply) {
continue;
@@ -145,7 +145,12 @@
$transactions[] = $entitlement->createTransaction(Transaction::ENTITLEMENT_BILLED, $cost);
}
+
if ($apply) {
+ // limit profit by wallet balance so a reseller can't build profit by users building debt
+ $profit = min($charges, $this->balance);
+ // We always take the full fee
+ $profit -= $fees;
$this->debit($charges, '', $transactions)->addTenantProfit($profit);
DB::commit();
@@ -538,6 +543,7 @@
{
$charges = 0;
$profit = 0;
+ $fees = 0;
$trial = $this->trialInfo();
DB::beginTransaction();
@@ -550,10 +556,12 @@
// Calculate cost, fee, and end of period
[$cost, $fee, $endDate] = $this->entitlementCosts($entitlement, $trial, true);
- // Note: Degraded pays nothing, but we get the money from a tenant.
- // Therefore $cost = 0, but $profit < 0.
+ // No balance changes for degraded users
if (!$withCost) {
$cost = 0;
+ } else {
+ $charges += $cost;
+ $fees += $fee;
}
if ($endDate) {
@@ -561,9 +569,6 @@
$entitlement->save();
}
- $charges += $cost;
- $profit += $cost - $fee;
-
if ($cost == 0) {
continue;
}
@@ -572,6 +577,10 @@
$transactions[] = $entitlement->createTransaction(Transaction::ENTITLEMENT_BILLED, $cost);
}
+ // limit profit by wallet balance so a reseller can't build profit by users building debt
+ $profit = min($charges, $this->balance);
+ // We always take the full fee
+ $profit -= $fees;
$this->debit($charges, '', $transactions)->addTenantProfit($profit);
DB::commit();
@@ -619,6 +628,14 @@
$amount = abs($amount) * -1;
}
+ if ($this->balance < 0 && ($this->balance + $amount) > 0) {
+ // We already took our fee when the wallet went below 0
+ // TODO a bonus topup could result in reseller wallet balance, which we don't want I think.
+ // But I suppose that's a fundamental of paying out a percentage of wallet credit, and not payments.
+ $negativeBalance = abs($this->balance);
+ $this->addTenantProfit($negativeBalance);
+ }
+
$this->balance += $amount;
$this->save();
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Sep 20, 6:37 PM (18 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
9476517
Default Alt Text
D4812.id13788.diff (4 KB)
Attached To
Mode
D4812: Limit profit by wallet balance
Attached
Detach File
Event Timeline
Log In to Comment