You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

164 lines
3.7 KiB

<?php
namespace App\Models;
use App\Models\Model;
use Illuminate\Support\Arr;
use App\Utilities\Zarinpal\Laravel\Facade\Zarinpal;
class Transaction extends Model
{
protected $table = 'transactions';
protected $fillable = [
'user_id', 'business_id', 'amount', 'succeeded', 'options'
];
protected $casts = [
'options' => 'array',
'succeeded' => 'boolean',
];
protected $fillable_relations = [
'user', 'business'
];
protected $reportable = [
'user_id', 'business_id', 'amount', 'succeeded', 'options', // fields
];
public $perPage = 12;
public function getValueOf(?string $key)
{
$values = [
'business_id' => $this->business_id,
'project_id' => null,
'sprint_id' => null,
'system_id' => null,
'user_id' => $this->user_id,
'workflow_id' => null,
'status_id' => null,
'task_id' => null,
'subject_id' => $this->id,
];
if ($key && isset($values, $key)) {
return $values[$key];
}
return $values;
}
public function rules(): array
{
return [
'user_id' => 'required|',
'business_id' => 'required',
'amount' => 'required|integer|min:1',
];
}
public function updateRelations()
{
// user relations
if (!empty($this->filled_relations['user'])) {
$this->dirties['user'] = $this->user_id;
}
// business relations
if (!empty($this->filled_relations['business'])) {
$this->dirties['business'] = $this->business_id;
}
}
public function reportActivity()
{
}
public function user()
{
return $this->belongsTo(User::class, 'user_id','id',__FUNCTION__);
}
public function business()
{
return $this->belongsTo(Business::class, 'business_id','id',__FUNCTION__);
}
/**
* Receive the authority key from the payment gateway
*/
public function prepare(): Transaction
{
$results = Zarinpal::request(
config('services.zarinpal.callback-url'),
$this->amount,
config('services.zarinpal.description')
);
$this->options = $results;
$this->save();
return $this;
}
/**
* Redirect to the payment gateway
*/
public function redirect()
{
return Zarinpal::redirect();
}
public function verify(): Transaction
{
$results = Zarinpal::verify($this->amount, $this->options['Authority']);
if ($results['Status'] == 'verified_before') {
throw new \Exception("تراکنش قبلا تایید شده است.");
}
if ($results['Status'] == 'success') {
$this->succeeded = true;
} else {
$this->succeeded = false;
}
$options = array_merge($this->options, $results);
$this->options = $options;
$this->save();
return $this;
}
/**
* Find a transaction via the authoriry key that psp provides us
*
* @throw ModelNotFound
*/
public static function findByAuthority(string $authority): Transaction
{
return static::where('options->Authority','=',$authority)->firstOrFail();
}
public function isWentToPaymentGateway(): bool
{
return !empty($this->options);
}
public function hasBeenAppliedToWallet(): bool
{
return Arr::get($this->options,"applied", false);
}
public function amountWasAppliedToWallet()
{
$options = $this->options;
$options['applied'] = true;
$this->options = $options;
$this->save();
}
}