Refund
We already know how to buy, but what about returns? But they exist and you can use them.
User Model
Add the CanPay
trait and Customer
interface to your User model.
The trait
CanPay
already inheritsHasWallet
, reuse will cause an error.
use Bavix\Wallet\Traits\CanPay;
use Bavix\Wallet\Interfaces\Customer;
class User extends Model implements Customer
{
use CanPay;
}
Item Model
Add the HasWallet
trait and interface to Item
model.
Starting from version 9.x there are two product interfaces:
- For an unlimited number of products (
ProductInterface
); - For a limited number of products (
ProductLimitedInterface
);
An example with an unlimited number of products:
use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Customer;
use Bavix\Wallet\Interfaces\ProductInterface;
class Item extends Model implements ProductInterface
{
use HasWallet;
public function getAmountProduct(Customer $customer): int|string
{
return 100;
}
public function getMetaProduct(): ?array
{
return [
'title' => $this->title,
'description' => 'Purchase of Product #' . $this->id,
];
}
}
Example with a limited number of products:
use Bavix\Wallet\Traits\HasWallet;
use Bavix\Wallet\Interfaces\Customer;
use Bavix\Wallet\Interfaces\ProductLimitedInterface;
class Item extends Model implements ProductLimitedInterface
{
use HasWallet;
public function canBuy(Customer $customer, int $quantity = 1, bool $force = false): bool
{
/**
* This is where you implement the constraint logic.
*
* If the service can be purchased once, then
* return !$customer->paid($this);
*/
return true;
}
public function getAmountProduct(Customer $customer): int|string
{
return 100;
}
public function getMetaProduct(): ?array
{
return [
'title' => $this->title,
'description' => 'Purchase of Product #' . $this->id,
];
}
}
I do not recommend using the limited interface when working with a shopping cart. If you are working with a shopping cart, then you should override the PurchaseServiceInterface
interface. With it, you can check the availability of all products with one request, there will be no N-queries in the database.
Make a refund
Find the user and check the balance.
$user = User::first();
$user->balance; // 0
Find the goods and check the balance.
$item = Item::first();
$item->balance; // 100
Return of funds!
(bool)$user->paid($item); // bool(true)
(bool)$user->refund($item); // bool(true)
$item->balance; // 0
$user->balance; // 100
It's simple!