namespace common\models\billing;
use function class_implements;
use common\models\Billing;
use common\models\billing\interfaces\CashInfoInterface;
use common\models\billing\interfaces\CashInterface;
use common\models\User;
use const false;
use Yii;
/**
* Created by PhpStorm.
* User: Vitaly
* Date: 29.09.2019
* Time: 11:26
*
* Как пользоваться:
* 1. Обьявляем объект где первое значение id пользователя над которым хотим совершить действие
* $value - значение которое хотим прибавить или вычесть.
* $cash = new Cash($userId, $value);
*
* 2.1. Если пользователь перевел средства на счет, то
* $cash->addActual();
*
* 2.2. Если администратор прописывает некоторые средства на счет
* $cash->addAsAdmin();
*
* 2.3 Если необходимо вычесть некоторую сумму
* $cash->withdraw()
*
* 2.3.1 Если вычесть не удалось
* $cash->withdrawn() будет равен false в остальных случаях true;
*/
class Cash implements CashInterface
{
/**@var Billing */
private $record;
private $userId;
private $oldAdded;
private $oldActual;
private $value;
/**
* @param int $userId - ID пользователя у которого нужно вычеслить баланс
* */
public function __construct($userId, $value)
{
$this->userId = $userId;
$this->value = $value;
$this->installRecord();
$this->oldActual = $this->record->actual_cash;
$this->oldAdded = $this->record->added_cash;
}
/*
* Добавляет средства на счет (просто добавляет) использовать когда добавляется через платежную систему
* */
public function addActual()
{
$this->record->actual_cash += $this->value;
$this->save();
new CashLog([
"record" => $this->record,
"value" => $this->value,
"success" => true,
"description" => 'Ввод средст с помощью платежной системы был удачным',
"action" => 'Add actual cash',
"initiator" => $this->initiator()
]);
}
/*
* использовать когда добавляют администраторы
* */
public function addAsAdmin()
{
$this->record->added_cash += $this->value;
$this->save();
new CashLog([
"record" => $this->record,
"value" => $this->value,
"success" => true,
"description" => 'Ввод средст с помощью админа был удачным',
"action" => 'Add as admin cash',
"initiator" => $this->initiator()
]);
}
/*
* Списывает n-е кол-во рублей со счета (просто вычитает)
* */
public function withdraw()
{
$balance = new WithdrawBalance($this->actual(), $this->added());
$balance->solve($this->value);
$this->record->added_cash = $balance->addedCash();
$this->record->actual_cash = $balance->actualCash();
$this->save();
if($this->withdrawn()){
$descLog = 'Удачное снятие денег со счета.';
}else{
$descLog = 'Не получилось снять деньги со счета.';
}
new CashLog([
"record" => $this->record,
"value" => $this->value,
"success" => $this->withdrawn(),
"description" => $descLog,
"action" => 'Withdraw cash',
"initiator" => $this->initiator()
]);
}
/*
* Проверяет проводилось ли вычетание и(или) удачно ли вычетание средств.
* */
public function withdrawn()
{
if ($this->oldAdded == $this->record->added_cash and $this->oldActual == $this->record->actual_cash) {
return false;
}
return true;
}
/**
* @return float
* */
private function actual()
{
return $this->record->actual_cash;
}
/**
* @return float
* */
private function added()
{
return $this->record->added_cash;
}
/**
* устанавливает запись из таблицы billing
* */
private function installRecord()
{
$rec = Billing::find()->where(['user_id' => $this->userId])->one();
if ($rec) {
$this->record = $rec;
} else {
$this->record = new Billing();
}
}
private function save($bool = false)
{
$this->record->save($bool);
$this->record->update($bool);
}
private function initiator($system = true){
if ($system){
return User::find()->where(['login'=>'System'])->one();
}
return Yii::$app->user->identity;
}
}
private function initiator($system = true){ if ($system){ return User::find()->where(['login'=>'System'])->one(); } return Yii::$app->user->identity; }
5. это вы имеете ввиду что в методах new используется?